国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SQL Server 2005性能排錯(2)

2024-08-31 00:50:08
字體:
供稿:網(wǎng)友

  內(nèi)存壓力

  內(nèi)存壓力表示當可用內(nèi)存數(shù)量受到限制。識別sql server何時運行在內(nèi)存壓力下將幫助你排除內(nèi)存相關(guān)的問題。sql server依賴于不同類型的內(nèi)存壓力特征也不一樣。下表匯總了內(nèi)存壓力類型,和他們潛在的原因。在所有的情況下,你可以更多的會見到超時或顯示的內(nèi)存不足錯誤消息。

  表 2

  壓力

  外部

  內(nèi)部

  物理

  物理內(nèi)存(ram)運行值低。這導(dǎo)致系統(tǒng)整理當前運行的工具集,導(dǎo)致整體性能下降。

  sql server監(jiān)測到這種條件,依賴于配置,可以減少緩存池的目的提交并開始清理內(nèi)部緩存。

  sql server檢測內(nèi)部較高的內(nèi)存消耗,導(dǎo)致在不同內(nèi)部組件間的內(nèi)存重新分配。

  內(nèi)部內(nèi)存壓力可以導(dǎo)致:

  ·     導(dǎo)致外部內(nèi)存壓力(sql server設(shè)置地的內(nèi)存使用能力)。

  ·     改變內(nèi)存設(shè)置(例如‘max server memory’)。

  ·     改變內(nèi)部組件的內(nèi)存分布(導(dǎo)致預(yù)留的高百分比并從緩存池中獲取頁)。

  虛擬的

  在系統(tǒng)頁面文件運行在較低值。這樣可以導(dǎo)致系統(tǒng)分配內(nèi)存失敗。不能擴展當前的內(nèi)存分配。這可以導(dǎo)致著整個系統(tǒng)響應(yīng)很慢或者可能導(dǎo)致系統(tǒng)關(guān)機。

  在vas運行值低,導(dǎo)致分頁(很多vas可用,但是被分為小塊)與/或消耗(直接分配,dll加載到sql vas,大量的線程)。

  sql server檢測到這種條件并可以釋放vas中保留的區(qū)域,減少緩存池提交的目標并開始收縮緩存。

  windows有通知的機制 如果物理內(nèi)存運行在過高或過低的情況下。sql server在他的內(nèi)存管理決策中使用這種機制。

  一般排錯的步驟顯示在表3中。

  表 3

  壓力

  內(nèi)部

  外部

  物理

  ·     找到主要的系統(tǒng)內(nèi)存消耗組件。

  ·     嘗試消除消耗(如果可能)。

  ·     檢查適當?shù)南到y(tǒng)ram和考慮添加額外ram(通常需要更仔細研究)

  ·     識別sql server內(nèi)主要的內(nèi)存消耗

  ·     確認系統(tǒng)配置。

  ·     進一步操作依賴于研究;檢查負載;可能出現(xiàn)的設(shè)計問題;其他的資源瓶頸。

  虛擬

  ·     增加交換文件大小。

  ·     檢查主要物理內(nèi)存的使用和外部物理內(nèi)存壓力調(diào)用步驟。

  ·     外部物理內(nèi)存壓力調(diào)用步驟。

工具

  下列工具和資源可以用于排錯。

  ◆內(nèi)存相關(guān)的dmvs

  ◆dbcc memorystatus 命令

  ◆性能計數(shù)器: 性能監(jiān)視器或sql server指定對象的dmv

  ◆任務(wù)管理器

  ◆事件查看器: 應(yīng)用程序日志和系統(tǒng)日志

  檢測內(nèi)存壓力

  內(nèi)存壓力自身不會預(yù)示問題。內(nèi)存壓力是需要的,但時不是為服務(wù)器以后遇到內(nèi)存錯誤的充分條件。在內(nèi)存壓力下工作將被任務(wù)是服務(wù)器的正常操作。然而內(nèi)存壓力的征兆可以于是服務(wù)器運行已經(jīng)接近設(shè)計容量并且潛在存在內(nèi)存不足的錯誤。在正常運行情況下,這些信息將作為基線決定以后內(nèi)存不足的原因。

  外部物理內(nèi)存壓力

  打開人物管理器的性能視圖,檢查physical memory節(jié)的available項的值。如果可用內(nèi)存總數(shù)很低,這表現(xiàn)了有外部內(nèi)存壓力。這個準確值依賴于很多因素,然而你可以在當這個值降低到50-100mb開始查找問題。當這個總數(shù)小于10mb時,外部內(nèi)存壓力將表現(xiàn)得很明顯。

  相同信息也可以使用在系統(tǒng)監(jiān)視器中的memory: available bytes計數(shù)器獲取。

  如果存在外部內(nèi)存壓力并且你看到了內(nèi)存相關(guān)的錯誤,你需要確認在系統(tǒng)中主要的內(nèi)存消耗者。為了這個,考慮process: working set性能計數(shù)器或在任務(wù)管理器中process欄中的mem usage列,找到最大的內(nèi)存消耗者。

  系統(tǒng)中所有使用的物理內(nèi)存可以通過匯總下列計數(shù)器獲取。

  ◆process 對象,每個進程的 working set計數(shù)器

  ◆memory 對象

  ◆系統(tǒng)的cache bytes計數(shù)器

  ◆未分頁池的pool nonpaged bytes 計數(shù)器

  ◆available bytes (等于任務(wù)管理其中的available 值)

  如果沒有外部壓力,process: private bytes計數(shù)器或在任務(wù)管理器中虛擬內(nèi)存將接近工作集的大小(process: working set或任務(wù)管理器中的mem usage),意味著我們沒有內(nèi)存用于分頁了。

  注意任務(wù)管理器中的mem usage列和相應(yīng)的性能計數(shù)器不能計算通過awe分配的內(nèi)存。這樣如果使用awe,信息將是不完整的。這種情況下,你需要考慮在sql server內(nèi)分配的內(nèi)存來獲取完整的信息。

  你可以使用sys.dm_os_memory_clerks dmv找到sql server通過awe機制分配了多少內(nèi)存,如下所示。

select
sum(awe_allocated_kb) / 1024 as [awe allocated, mb]
from
sys.dm_os_memory_clerks

  注意在sql server中,只有當前緩存池(’memoryclerk_sqlbufferpool’類型)使用這種機制并且只能是在使用awe功能時。通過識別和除去主要物理內(nèi)存使用者(如果有可能)和/或 通過添加更多的內(nèi)存的方法解除外部內(nèi)存壓力一般可以解決與此相關(guān)的內(nèi)存問題。

  外部虛擬內(nèi)存壓力

  你需要確定是否頁面文件為當前內(nèi)存的分配能提供足夠的空間。為了檢查,可以打開任務(wù)管理器中的性能視圖,并檢查commit charge節(jié)。如果total接近于limit則說明可以被提交的最大數(shù)量內(nèi)存沒有擴展頁面的空間。注意任務(wù)管理器中的commit charge total指出潛在使用的頁面文件,而不是實際使用值。實際使用的頁面文件將增加物理內(nèi)存壓力。

  同樣可以通過下列技術(shù)起獲取相關(guān)信息:memory: commit limit, paging file: %usage, paging file: %usage peak。

  你可以通過每個進程的process: working set減去process private bytes計數(shù)器來評估內(nèi)存總數(shù)。

  如果paging file: %usage peak(或peak commit charge)很高,檢查系統(tǒng)日志中是否有指出頁面文件增長或通知“running low on virtual memory”的信息。你可能需要增加你的頁面文件大小。high paging file: %usage指出物理內(nèi)存超過要提交的值并也要考慮外部物理內(nèi)存壓力(大量的內(nèi)存需求,沒有足夠的ram)。

  內(nèi)部物理內(nèi)存壓力

  內(nèi)部內(nèi)存壓力來自于sql server自身,應(yīng)首先通過檢查在緩存分布中的異常來考慮在sql server內(nèi)存分布。通常在sql server中緩存會占用最多提交的內(nèi)存。為了確定在緩存池中的內(nèi)存總數(shù),我們可以使用dbcc memroystatus命令。在buffer counts節(jié),可以找到target值。下列輸出顯示了在服務(wù)器達到正常負載時dbcc memorystatus的結(jié)果。

buffer counts         buffers
------------------------------ --------------------
committed           201120
target             201120
hashed             166517
reserved potential       143388
stolen potential        173556
external reservation      0
min free            256
visible            201120
available paging file     460640

  target是sql server計算出它在不導(dǎo)致分頁時可以提交的8-kb每頁的頁數(shù)。

  target是被定期的重新計算的來反映內(nèi)存的低或高。在常規(guī)服務(wù)負載下target頁面過低可能預(yù)示出現(xiàn)了外部內(nèi)存壓力。

  如果sql server占用了大量的內(nèi)存(通過process: private bytes或 任務(wù)管理器中mem usage 列顯示),請查看是否target的數(shù)值。注意,如果啟用awe,你還要從sys.dm_of_memory_clerks或dbcc memorystatus輸出計算awe分配的總量。

  考慮上面的示例(沒有啟用awe),target*8kb=1.53gb,而服務(wù)器的process: private bytes大約是1.62gb或緩存池用sql server占用了94%的內(nèi)存。注意,如果服務(wù)器沒有過載,target是應(yīng)該超過process: private bytes性能計數(shù)器報告的數(shù)量。

  如果target過低,但是服務(wù)器的process: private bytes或 任務(wù)管理器中mem usage 值很高,我們也許要面對從緩存池外使用內(nèi)存的組件帶來的內(nèi)部內(nèi)存壓力。被加載到sql server進程中的組件,例如com對象,連接服務(wù)器,擴展存儲過程,sqlclr或其他會從緩存池外占用內(nèi)存。如果不使用sql server內(nèi)存接口,將沒有方法跟蹤組件在緩存池外占用的內(nèi)存。

  適用于sql server內(nèi)存管理機制的組件使用在緩存池中分配很少的內(nèi)存。如果分配的大于8kb,這些組將將通過多頁分配器借口使用緩存池外的內(nèi)存。

  下列方法可以快速檢查通過多業(yè)分配器接口占用的內(nèi)存數(shù)量。

-- amount of mem allocated though multipage allocator interface
select sum(multi_pages_kb) from sys.dm_os_memory_clerks

  你可以這樣獲得通過多頁分配器分發(fā)內(nèi)存的詳細信息:

select
type, sum(multi_pages_kb)
from
sys.dm_os_memory_clerks
where
multi_pages_kb != 0
group by type
type                   
------------------------------------------ ---------
memoryclerk_sqlstoreng           56
memoryclerk_sqloptimizer          48
memoryclerk_sqlgeneral           2176
memoryclerk_sqlbufferpool         536
memoryclerk_sosnode            16288
cachestore_stackframes           16
memoryclerk_sqlservicebroker        192
memoryclerk_sni              32

  如果通過多頁分配器分發(fā)了過大的內(nèi)存( 100-200mb或更多),應(yīng)該做進一步的研究。

  如果你看到了通過多頁分配器 分發(fā)的大量內(nèi)存,檢查服務(wù)器的配置并嘗試使用之前或后續(xù)的查詢確定哪個組件占用的最多的內(nèi)存。

  如果target值低,但是在百分比上它占用了最多的內(nèi)存,請在前面部分中查找描述外部內(nèi)存壓力的部分(external physical memory pressure),或查看服務(wù)器內(nèi)存配置參數(shù)。

  如果你設(shè)置了max server memory 和/或min server memory,你應(yīng)該用這些值和target值進行比較。max server memory選項限制了在緩存池中占用內(nèi)存的最大值,而服務(wù)器還可以占用其他的部分。min server memory選項告訴服務(wù)器當小于該值時不能釋放緩存池的內(nèi)存。如果target小于min server memory設(shè)置并且服務(wù)器沒有過載,這可能預(yù)示服務(wù)器遇到了外部內(nèi)存壓力并且不能獲得這個設(shè)置大小的內(nèi)存。它也可能預(yù)示著從內(nèi)部組件的內(nèi)存壓力,就像上面描述的那樣。target 數(shù)值不能超過max server memory選項的設(shè)置。

  首先,檢查從dbcc memorystatus輸出中stolen頁面數(shù)量

buffer distribution      buffers
------------------------------ -----------
stolen             32871
free              17845
cached             1513
database (clean)        148864
database (dirty)        259
i/o              0
latched            0

  相對于stolen和target頁面的高百分比(>75-80%)預(yù)示著內(nèi)部內(nèi)存壓力。

  更多關(guān)于服務(wù)器組件內(nèi)存分配的信息可以使用sys.dm_of_memory_clerks dmv獲取。

-- amount of memory consumed by components outside the buffer pool
-- note that we exclude single_pages_kb as they come from bpool
-- bpool is accounted for by the next query
select
sum(multi_pages_kb
+ virtual_memory_committed_kb
+ shared_memory_committed_kb) as [overall used w/o bpool, kb]
from
sys.dm_os_memory_clerks
where
type <> 'memoryclerk_sqlbufferpool'
-- amount of memory consumed by bpool
-- note that currenlty only bpool uses awe
select
sum(multi_pages_kb
+ virtual_memory_committed_kb
+ shared_memory_committed_kb
+ awe_allocated_kb) as [used by bpool with awe, kb]
from
sys.dm_os_memory_clerks
where
type = 'memoryclerk_sqlbufferpool'

  每個組件的詳細信息可以通過下列語句獲取(這包括從緩存池內(nèi)和緩存池外分配的內(nèi)存)。

declare @total_alloc bigint
declare @tab table (
type nvarchar(128) collate database_default
,allocated bigint
,virtual_res bigint
,virtual_com bigint
,awe bigint
,shared_res bigint
,shared_com bigint
,topfive nvarchar(128)
,grand_total bigint
);
-- note that this total excludes buffer pool committed memory as
it represents the largest consumer which is normal
select
@total_alloc =
sum(single_pages_kb
+ multi_pages_kb
+ (case when type <> 'memoryclerk_sqlbufferpool'
then virtual_memory_committed_kb
else 0 end)
+ shared_memory_committed_kb)
from
sys.dm_os_memory_clerks
print
'total allocated (including from buffer pool): '
+ cast(@total_alloc as varchar(10)) + ' kb'
insert into @tab
select
type
,sum(single_pages_kb + multi_pages_kb) as allocated
,sum(virtual_memory_reserved_kb) as vertual_res
,sum(virtual_memory_committed_kb) as virtual_com
,sum(awe_allocated_kb) as awe
,sum(shared_memory_reserved_kb) as shared_res
,sum(shared_memory_committed_kb) as shared_com
,case when (
(sum(single_pages_kb
+ multi_pages_kb
+ (case when type <> 'memoryclerk_sqlbufferpool'
then virtual_memory_committed_kb
else 0 end)
+ shared_memory_committed_kb))/(@total_alloc + 0.0)) >= 0.05
then type
else 'other'
end as topfive
,(sum(single_pages_kb
+ multi_pages_kb
+ (case when type <> 'memoryclerk_sqlbufferpool'
then virtual_memory_committed_kb
else 0 end)
+ shared_memory_committed_kb)) as grand_total
from
sys.dm_os_memory_clerks
group by type
order by (sum(single_pages_kb + multi_pages_kb + (case when type <>
'memoryclerk_sqlbufferpool' then virtual_memory_committed_kb else 0 end)
+ shared_memory_committed_kb)) desc
select * from @tab

  注意之前的查詢將buffer pool與通過單頁分配器提供給組件的內(nèi)存視為不同的部分。通過下列查詢可以確定在緩存池中耗費內(nèi)存最多的10個組件(通過單頁分配器)。

-- top 10 consumers of memory from bpool
select
top 10 type,
sum(single_pages_kb) as [spa mem, kb]
from
sys.dm_os_memory_clerks
group by type
order by sum(single_pages_kb) desc

  你通常不會控制內(nèi)部組件對內(nèi)存的占用。然而,確定哪個組件占用最多的內(nèi)存可以幫助對問題的后續(xù)研究。

  系統(tǒng)監(jiān)視器(perfmon)

  你也可以通過檢查下列計數(shù)器來確定內(nèi)存壓力(sql server聯(lián)機叢書中有詳細地描述):

  sql server: buffer manager 對象

  ◆low buffer cache hit ratio

  ◆low page life expectancy

  ◆high number of checkpoint pages/sec

  ◆high number lazy writes/sec

  不足的內(nèi)存和i/o開銷經(jīng)常會導(dǎo)致瓶頸。請查看本文的i/o 瓶頸部分。

  高速緩存和內(nèi)存壓力

  查看外部和內(nèi)部內(nèi)存壓力的方法是查看內(nèi)存中高速緩存的行為。

  sql server 2005與sql server 2000的高速緩存設(shè)計上有一些細微的不同,其中之一就是統(tǒng)一了高速緩存的框架。為了從高速緩存中刪除最近很少使用的項,該框架實現(xiàn)了一套時鐘算法。現(xiàn)在它使用2支不同的時鐘指針,一個是內(nèi)部時鐘指針,一個是外部時鐘指針。

  內(nèi)部時鐘指針控制與其他高速緩存相關(guān)的緩存大小。當框架預(yù)測到高速緩存要使用到盡頭是它開始移動。

  當sql server總體上陷入內(nèi)存壓力時,外部時鐘指針開始移動。外部時鐘指針的移動可以導(dǎo)致外部和內(nèi)部的內(nèi)存壓力。在內(nèi)部和外部內(nèi)存壓力時不會混亂的移動外部時鐘和內(nèi)部時鐘。

  關(guān)于時鐘移動的信息可以通過sys.dm_os_memory_cache_clock_hands dmv顯示,如下代碼所示。每個高速緩存項在內(nèi)部和外部時鐘指針都有不同的行。如果你看到rounds count和removed all rounds count增加,說明服務(wù)器遇到內(nèi)部/外部內(nèi)存壓力。

select *
from
sys.dm_os_memory_cache_clock_hands
where
rounds_count > 0
and removed_all_rounds_count > 0

  通過如下所示,通過通過sys.dm_os_cache_counters dmv你可以獲得更多關(guān)于緩存的信息。

select
distinct cc.cache_address,
cc.name,
cc.type,
cc.single_pages_kb + cc.multi_pages_kb as total_kb,
cc.single_pages_in_use_kb + cc.multi_pages_in_use_kb as total_in_use_kb,
cc.entries_count,
cc.entries_in_use_count,
ch.removed_all_rounds_count,
ch.removed_last_round_count
from
sys.dm_os_memory_cache_counters cc
join sys.dm_os_memory_cache_clock_hands ch on (cc.cache_address = ch.cache_address)
/*
--uncomment this block to have the information only for moving hands caches
where
ch.rounds_count > 0
and ch.removed_all_rounds_count > 0
*/
order by total_kb desc

  注意userstore項,正在使用的頁面數(shù)量將不會被報告,因為結(jié)果將是null。

  ring buffers

  更多有意義的內(nèi)存調(diào)試信息可以通過sys.dm_os_ring_buffers的ring buffers dmv獲取。每個ring buffer保留了之前幾次某種類型的通知。指定ring buffer的詳細信息將在下面描述。

  ring_buffer_resource_monitor

  你可以使用從資源監(jiān)視器的通知識別內(nèi)存改變的狀態(tài)。在內(nèi)部,sql server有一個監(jiān)視不同內(nèi)存壓力的架構(gòu)。當內(nèi)存狀態(tài)改變,資源監(jiān)視器任務(wù)生成一個通知。這個通知用于內(nèi)部組件根據(jù)內(nèi)存狀態(tài)調(diào)整它們內(nèi)存使用并通過sys.dm_os_ring_buffers dmv來暴露,如下列代碼所示。

select record
from sys.dm_os_ring_buffers
where ring_buffer_type = 'ring_buffer_resource_monitor'

  結(jié)果類似于:

<record id="1701" type="ring_buffer_resource_monitor" time="149740267">
<resourcemonitor>
<notification>resource_memphysical_low</notification>
<indicators>2</indicators>
<nodeid>0</nodeid>
</resourcemonitor>
<memorynode id="0">
<reservedmemory>1646380</reservedmemory>
<committedmemory>432388</committedmemory>
<sharedmemory>0</sharedmemory>
<awememory>0</awememory>
<singlepagesmemory>26592</singlepagesmemory>
<multiplepagesmemory>17128</multiplepagesmemory>
<cachedmemory>17624</cachedmemory>
</memorynode>
<memoryrecord>
<memoryutilization>50</memoryutilization>
<totalphysicalmemory>3833132</totalphysicalmemory>
<availablephysicalmemory>3240228</availablephysicalmemory>
<totalpagefile>5732340</totalpagefile>
<availablepagefile>5057100</availablepagefile>
<totalvirtualaddressspace>2097024</totalvirtualaddressspace>
<availablevirtualaddressspace>336760</availablevirtualaddressspace>
<availableextendedvirtualaddressspace>0</availableextendedvirtualaddressspace>
</memoryrecord>
</record>

  從這些記錄來看,你可以減少服務(wù)器收到的低物理內(nèi)存的通知。你也可以查看內(nèi)存總量(kb為單位)。你可以通過使用sql server的xml能力來查詢這些信息,例如下列代碼。

select
x.value('(//notification)[1]', 'varchar(max)') as [type],
x.value('(//record/@time)[1]', 'bigint') as [time stamp],
x.value('(//availablephysicalmemory)[1]', 'int') as [avail phys mem, kb],
x.value('(//availablevirtualaddressspace)[1]', 'int') as [avail vas, kb]
from
(select cast(record as xml)
from sys.dm_os_ring_buffers
where ring_buffer_type = 'ring_buffer_resource_monitor') as r(x)
order by
[time stamp] desc

  上面收到了低內(nèi)存的通知,緩存池重新計算target。注意target數(shù)量保持在指定的min server memory 和max server memory選項限制中。如果緩存池中心的提交比當前的提交緩存還小,緩存池將開始收縮直到外部內(nèi)存壓力被移除。注意,當運行在啟用awe時sql server 2000不是這樣來緩解物理內(nèi)存壓力的。

  ring_buffer_oom

  下列代碼示例,展示了ring buffer中包含預(yù)示服務(wù)器內(nèi)存不足的記錄。

select record
from sys.dm_os_ring_buffers
where ring_buffer_type = 'ring_buffer_oom'

  結(jié)果類似于:

<record id="7301" type="ring_buffer_oom" time="345640123">
<oom>
<action>fail_virtual_commit</action>
<resources>4096</resources>
</oom>

  這條記錄告訴我們那個操作失敗了(提交,保留或頁面分配)并表明了請求的內(nèi)存數(shù)量。

  ring_buffer_memory_broker and internal memory pressure

  當監(jiān)測到內(nèi)部內(nèi)存壓力時,為組件在緩存池分配內(nèi)存的低內(nèi)存通知將被打開。打開低內(nèi)存通知允許從使用緩存池的高速緩存和其他組件中回收頁面。

  內(nèi)部內(nèi)存壓力可以通過調(diào)整max server memory選項或當stolen頁面與緩存池的比例超過80%時觸發(fā)。

  內(nèi)部內(nèi)存壓力通知(‘shrink’)能通過使用下列代碼查詢ring buffer的調(diào)用來發(fā)現(xiàn)。

select
x.value('(//record/@time)[1]', 'bigint') as [time stamp],
x.value('(//notification)[1]', 'varchar(100)') as [last notification]
from
(select cast(record as xml)
from sys.dm_os_ring_buffers
where ring_buffer_type = 'ring_buffer_memory_broker') as r(x)
order by
[time stamp] desc

  ring_buffer_buffer_pool

  ring buffer將包含預(yù)示嚴重的緩存池失敗的記錄,包括緩存池溢出的條件。

select record
from sys.dm_os_ring_buffers
where ring_buffer_type = 'ring_buffer_buffer_pool'

  結(jié)果類似于:

<record id="1234" type="ring_buffer_buffer_pool" time="345640123">
< bufferpoolfailure id="fail_oom">
<committedcount>84344 </committedcount>
<committedtarget>84350 </committedtarget >
<freecount>20</freecount>
<hashedcount>20345</hashedcount>
<stolencount>64001 </stolencount>
<reservedcount>64001 </reservedcount>
</ bufferpoolfailure >

  這條記錄告訴我們出現(xiàn)了什么樣的失敗 (fail_oom, fail_map,fail_reserve_adjust,fail_lazywriter_no_buffers) 基當時的緩存池狀態(tài)。

  內(nèi)部虛擬內(nèi)存壓力

  vas的占用可以使用sys.dm_os_virtual_address_dump dmv來跟蹤。vas匯總可以使用下列視圖來查詢。

-- virtual address space summary view
-- generates a list of sql server regions
-- showing number of reserved and free regions of a given size
create view vasummary as
select
size = vadump.size,
reserved = sum(case(convert(int, vadump.base)^0) when 0 then 0 else 1 end),
free = sum(case(convert(int, vadump.base)^0) when 0 then 1 else 0 end)
from
(
--- combine all allocation according with allocation base, don't take into
--- account allocations with zero allocation_base
select
convert(varbinary, sum(region_size_in_bytes)) as size,
region_allocation_base_address as base
from sys.dm_os_virtual_address_dump
where region_allocation_base_address <> 0x0
group by region_allocation_base_address
union 
--- we shouldn't be grouping allocations with zero allocation base
--- just get them as is
select convert(varbinary, region_size_in_bytes), region_allocation_base_address
from sys.dm_os_virtual_address_dump
where region_allocation_base_address = 0x0
)
as vadump
group by size

  下列查詢可以用于訪問vas狀態(tài):

-- available memory in all free regions
select sum(size*free)/1024 as [total avail mem, kb]
from vasummary
where free <> 0
-- get size of largest availble region
select cast(max(size) as int)/1024 as [max free size, kb]
from vasummary
where free <> 0

  如果最大可用區(qū)域小于4mb,我們可能遇到了vas壓力。sql server 2005監(jiān)視和響應(yīng)vas壓力。sql server 2000不會監(jiān)視從vas帶來的壓力,但是當出現(xiàn)虛擬內(nèi)存不足錯誤是,它會清理高速緩存。

  一般的內(nèi)存錯誤排錯步驟

  下列是一些常規(guī)步驟,有助于你排除內(nèi)存錯誤。

  1.驗證是否服務(wù)器運行在外部內(nèi)存壓力。如果出現(xiàn)外部內(nèi)存壓力,嘗試先解決它,然后再看是否依然存在這個問題或錯誤。

  2.開始收集性能計數(shù)器:sql server: buffer manager, sql server: memory manager

  3.確認內(nèi)存配置參數(shù)(sp_configure), min memory per query,min/max server memory,awe enabled和 lock pages in memory 權(quán)利。觀察不正常的值。糾正配置。提供為sql server 2005增加內(nèi)存的理由。

  4.檢查所有可能影響服務(wù)器的非默認sp_configure參數(shù)。

  5.檢查內(nèi)部內(nèi)存壓力。

  6.當你見到內(nèi)存錯誤消息時,觀察dbcc memorystatus輸出和改變的方法。

  7.檢查負載(并發(fā)會話數(shù)量,并發(fā)執(zhí)行查詢數(shù)量)。

  內(nèi)存錯誤

  701 - there is insufficient system memory to run this query.

  原因

  這是服務(wù)器內(nèi)存不足的典型現(xiàn)象。它預(yù)示了內(nèi)存分配失敗。它可以有多種原因?qū)е拢ㄔ诋斍肮ぷ髫撦d上的內(nèi)存提示。通過增加sql server 2005需要的內(nèi)存和一些配置上的設(shè)置(例如max server memory選項)用戶可能會看到這種錯誤。通常失敗的事務(wù)不是因為這個錯誤。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 福泉市| 都昌县| 衡阳市| 安多县| 清涧县| 临城县| 兰州市| 南阳市| 繁昌县| 读书| 抚顺市| 黔西| 滦平县| 巴林右旗| 定陶县| 封丘县| 榆林市| 凤庆县| 商城县| 彰化县| 滁州市| 翼城县| 襄垣县| 青川县| 东乌珠穆沁旗| 酉阳| 连州市| 霍城县| 封丘县| 宜丰县| 安福县| 枝江市| 南阳市| 电白县| 子长县| 广安市| 开鲁县| 松潘县| 垦利县| 茶陵县| 西宁市|