1. 程式人生 > >Windows系統記憶體計數器理解解析

Windows系統記憶體計數器理解解析

說明: 本文的 計數器 以Windows2003為準。

序言
記憶體的使用情況是系統性能中重要的因素之一,頻繁的頁交換及記憶體洩露都會影響到系統的效能。本文主要是描述記憶體的一些概念、計數器含義,以及可能存在的效能瓶頸。

一些概念

① “頁交換”是使用稱為“頁面”的單位,將固定大小的程式碼和資料塊從 RAM 移動到磁碟的過程,其目的是為了釋放記憶體空間。
② 每個Windows程序都擁有4G的虛擬地址空間,在多工環境下,所有程序使用的記憶體總和可以超過實體記憶體。
③ 程序的一部分可能會從實體記憶體中刪除而被暫存在硬碟的檔案裡(pagefile)。當程序試圖訪問這些被交換到pagefile裡的記憶體的時候,系統會產生一個缺頁中斷(page fault),這時候Windows記憶體管理器會負責把對應的記憶體頁重新從硬碟調入實體記憶體。
④ 用於描述實體記憶體中虛擬頁面子集的術語稱為一個工作

集(Working Set),也叫駐留集。一共有三種工作集:程序工作集、系統工作集、會話工作集。(具體概念看後面的計數器)
⑤ 非換頁池:它是由一些“可保證總是駐留在實體記憶體中”的虛擬地址範圍構成的,由於這些地址範圍總是駐留在記憶體中,因此任何時候都可以訪問它們,而不會招致頁面錯誤。
⑥ 換頁池:系統空間中的一段虛擬記憶體區域,它可以被換入和換出系統。這兩種記憶體池都位於系統地址空間部分,並且被對映到每個程序的虛擬地址空間中。
⑦ 共享記憶體:對於多個程序可見的記憶體,或者出現在多個程序虛擬地址空間中的記憶體。例如:如果兩個程序使用了同樣的DLL,那麼只需將引用該DLL的程式碼頁面載入到實體記憶體一次,然後所有映射了該DLL的程序之間共享這些頁面。
⑧ MDL(Memory Descrīptor List)是一個結構體,用於描述一片記憶體區域中的所有實體記憶體頁。

可能存在的效能問題

1、Memory\\Page Reads/sec過高,持續大於5。
 
過多的頁交換要使用大量的硬碟空間,很容易將導致將頁交換記憶體不足與導致頁交換的磁碟瓶徑混淆。這就需要我們在研究記憶體不足不太明顯的頁交換的原因時,必須跟蹤如下的磁碟使用情況計數器和記憶體計數器

  (1) Physical Disk\\ % Disk Time

 (2) Physical Disk\\ Avg.Disk Queue Length
 (3) Memory\\Page Reads/sec
  ①如果Memory\\Page Reads/sec比較低,但Physical Disk\\% Disk Time and Physical Disk\\Avg. Disk Queue Length計數器很高,表明磁碟有瓶頸。
  ②如果隨著Physical Disk\\Avg. Disk Queue Length的增加,而Memory\Page Reads/sec並沒有減少,表明有記憶體的瓶頸。

特別說明:

分析CPU瓶頸需要新增哪些計數器?

    (1)Processor \ Interrupts/sec

    (2)Processor\ %Processor Time 處理器處理事務的時間

 (3)Process(process)\ %Processor Time 在程序中處理器處理事務的時間

    (4)System\ Processor Queue Length 系統中,處理器佇列長度


2、記憶體洩露
  如果懷疑記憶體洩露,監視 Memory\\ Available Bytes 和 Memory\\ Committed Bytes,以觀察記憶體行為,並監視可能存在洩露記憶體的程序的 Process\\Private Bytes、Process\\Working Set和Process\\Handle Count(Handle洩漏)。
  如果懷疑是核心模式程序導致了洩露,則還應該監視 Memory\\Pool Paged Bytes、Process\\ Pool Paged Bytes。(Memory\\Pool Paged Bytes與Process\\ Pool Nonpaged Bytes,有什麼不同,期待告知)。
  可以通過PoolMon工具詳細檢視非換頁池和換頁池的詳細使用情況。
 備註:這裡只是隨便提一下。

各計數器理解及描述

1、Process\\Working Set
含義:

程序工作集,是虛擬地址空間在實體記憶體中的那部分。包含了一個程序內的各個執行緒引用過的頁面,即:Task Manager中的Mem Usage。
分析:
由於每個程序工作集中包含了共享頁面,所以Process\\Working Set(_Total)值會大於實際的總程序記憶體使用量。

2、Process\\Private Bytes
含義:
分配的私有虛擬記憶體總數,即私有的、已提交的虛擬記憶體使用量。即:Task Manager中的VM Size。
分析:
記憶體洩露時表現的現象是私有虛擬記憶體的遞增,而不是工作集大小的遞增。在某個點上,記憶體管理器會阻止一個程序繼續增加實體記憶體大小,但它可以繼續增大它的虛擬記憶體大小。

3、Memory\\Available MBytes (Available Bytes、Available KBytes)
含義:
Available MBytes 是指以 MB 表示的可用實體記憶體量,此記憶體能立刻分配給一個程序或系統使用。它是空閒列表、零列表和備用列表的大小總和。
分析:
至少要有10% 的實體記憶體值,最低限度是4 MB。
頁面狀態:
備用:頁面原先屬於某個工作集,但現在被去除了。該頁面自從最後一次被寫到磁碟後一直未被修改過,PTE(Page Table Entry)仍然指向該物理頁面,不過已標記為無效的和正在轉移中。
空閒:頁面是空閒的,但它包含了未特別指明的髒資料。(需要用零初始化,否則不能交給使用者程序)
零化:頁面是空閒的,並且已經被零頁面執行緒初始化為零了。

4、Memory\\Page Faults/sec
含義:
Page Faults/sec 是每秒鐘出錯頁面的平均數量。由於每個錯誤操作中只有一個頁面出錯,計算單位為每秒出錯頁面數量,因此這也等於頁面錯誤操作的數量。這個計數器包括硬錯誤(那些需要磁碟訪問的)和軟錯誤(在實體記憶體的其他地方找到的錯誤頁)。許多處理器可以在有大量軟錯誤的情況下繼續操作。但是,硬錯誤可以導致明顯的拖延,因為需要訪問磁碟。

5、Memory\\Page Reads/sec
含義:
Page Reads/sec 是讀取磁碟以解析硬頁面錯誤的次數。它顯示讀取操作的數量,它並不考慮每個操作的頁面數量。當一個程序引用一個虛擬記憶體的頁面,而此虛擬記憶體位於工作集以外或實體記憶體的其他位置,並且此頁面必須從磁碟檢索時,就會發生硬頁面錯誤。此計數器是引起系統範圍內延遲的主要指示器。它包含讀取操作以滿足檔案系統快取(通常由應用程式請求)和非快取對映記憶體檔案的錯誤。比較記憶體的值\\PagesReads/sec 與記憶體的值\\PagesInput/sec 來決定每個操作取讀的平均頁面數量。
通俗含義:
頁的硬故障,Page/sec的子集,是為了解決硬錯誤,從硬碟讀取的次數。
分析:
閾值為>5,越低越好。大數值表示磁碟讀而不是快取讀。持續大於5的值,表明記憶體的讀請求發生了較多的缺頁中斷(page fault)。
說明程序的Working Set已經不夠,使用硬碟來虛擬記憶體。此處為讀得次數,不關心讀取得頁數,比較大的值表明記憶體出現了瓶頸。

6、Memory\\Page Writes/sec
含義:
Page Writes/sec 是指為了釋放實體記憶體空間而將頁面寫入磁碟的速度。只有頁面還在實體記憶體中時所做的更改才會寫入磁碟,因此這些頁面可能只保留資料而不保留程式碼。這個計數器顯示寫入操作,不計數每個操作中寫入的頁數。

7、Memory\\Pages Input/sec
含義:
Pages Input/sec 是以解析硬頁面錯誤從磁碟讀取的頁數。當一個程序引用一個虛擬記憶體的頁面,而此虛擬記憶體位於工作集以外或實體記憶體的其他位置,並且此頁面必須從磁碟檢索時,就會發生硬頁面錯誤。當夜面發生錯誤時,系統嘗試將多個連續頁面讀入記憶體以充分利用取讀操作的優點。請比較 Memory\\Pages Input/sec 的值和 Memory\\Page Reads/sec 的值以便決定每個取讀操作讀入記憶體的平均頁面數量。

8、Memory\\Pages Output/sec
含義:
Pages Output/sec 是指為了釋放實體記憶體空間而將頁面寫入磁碟的頁數。只有在實體記憶體中更改時頁面才會寫回到磁碟上,因此頁面可能只保留資料而不是程式碼。高速的頁面輸出可能表示記憶體不足。當實體記憶體不足時,Windows 會將頁面寫回到磁碟以便釋放空間。

9、Memory\\Page/sec
含義:
Pages/sec 是指為解決硬頁錯誤從磁碟讀取或寫入磁碟的頁數。這個計數器是可以顯示導致系統範圍延緩型別錯誤的主要指示器。它是 Memory\\Pages Input/sec 和 Memory\\Pages Output/sec 的總和。是用頁數計算的,以便在不用做轉換的情況下就可以同其他頁計數如: Memory\\Page Faults/sec 做比較,這個值包括為滿足錯誤而在檔案系統快取(通常由應用程式請求)的非快取對映記憶體檔案中檢索的頁。
分析:
一般如果pages/sec持續高於幾百,那麼您應該進一步研究頁交換活動。有可能需要增加記憶體,以減少換頁的需求(你可以把這個數字乘以4k就得到由此引起的硬碟資料流量) 。Pages/sec 的值很大不一定表明記憶體有問題,而可能是執行使用記憶體對映檔案的程式所致。

10、Memory\\ % Committed Bytes In Use
含義:
%Committed Bytes In Use 是 Memory\\Committed Bytes 與 Memory\\Commit Limit 之間的比值。Committed memory是已在頁面檔案中保留空間的在用實體記憶體。Commit Limit 是由頁面檔案的大小而決定的。如果擴大了頁面檔案,該比例就會減小。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

11、Memory\\ Committed Bytes
含義:
Committed Bytes 是指已被提交的(不是保留的)虛擬記憶體位元組數。此數並不一定代表頁面檔案的使用量,因為它包含了實體記憶體中從未被換出過的私有提交頁面。當然,如果一個程序完全是非駐留的,則它代表所使用的頁面檔案數量。
對應Task Manager的PF使用 (Current Commit Charge) 。頁面檔案的使用量參見計數器:Paging File\\%Usage。
原文:
Number of bytes of virtual (not reserved) memory that has been committed. This number doesn’t necessarily represent page file usage because it includes private committed pages in physical memory that have never been paged out. Rather, it represents the amount of page file space that would be used if the process was completely made nonresident.
分析:
NT的記憶體分配採用了兩步走的方法,首先,在虛地址空間上保留一段空間,這時作業系統並沒有分配實體記憶體,只是保留了一段地址。然後,再提交這段空間,這時作業系統才會分配實體記憶體。
Windows的地址空間有三種狀態。一種是COMMITED,表明該地址空間已和一塊記憶體相聯絡;一種是RESERVED,表明該地址空間雖未與一塊記憶體相聯絡但今後可能會用到,需要保留;一種是FREE,表明該地址空間與記憶體沒有聯絡。

12、Memory\\ Commit Limit
含義:
Commit Limit 是指無需擴充套件頁面檔案就可以提交的虛擬記憶體位元組數。
原文:
Number of bytes of virtual memory that can be committed without having to extend the paging files; if the paging files can be extended, this limit is not hard. 
To use a reserved region of address space, you must allocate physical storage and then map this storage to the reserved region. This process is called committing physical storage. Physical storage is always committed in pages.

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

13、Memory\\Pool Nonpaged Allocs
含義:
Pool Nonpaged Allocs 指在換換頁池中分派空間的呼叫數。它是用衡量分配空間的呼叫數來計數的,而不管在每個呼叫中分派的空間數是多少。
原文:
Shows the number of calls to allocate space in the nonpaged pool. This counter is measured in numbers of calls to allocate space, regardless of the amount of space allocated in each call.
分析:
考察其自系統啟動以來的增長了10%以上,如果是,表明有潛在的嚴重瓶頸。
需要觀察Server\\Pool Nonpaged Failures,非頁面池分配失敗的次數。非零表示計算機的實體記憶體太小。

14、Memory\\Pool Nonpaged Bytes
含義:

Pool Nonpaged Bytes 指在非換頁池中的位元組數,非換頁池是指系統記憶體(作業系統使用的實體記憶體)中可供物件(指那些在不處於使用時不可以寫入磁碟上而且只要分派過就必須保留在實體記憶體中的物件)使用的一個區域。
疑問:Memory\\Pool Nonpaged Bytes 的計數方式與 Process\\Pool Nonpaged Bytes 的計數方式有什麼不同。
通俗含義:
非換頁池中的當前大小,即Task Manager中的Kernel Memory→NonPaged。

15、Memory\\Pool Paged Allocs
含義:
Pool Paged Allocs 指在換頁池中分派空間的呼叫次數。它是用計算分配空間的呼叫次數來計算的,而不管在每個呼叫中分派的空間數是什麼。
原文:
Shows the number of calls to allocate space in the paged pool. This counter is measured in numbers of calls to allocate space, regardless of the amount of space allocated in each call.

16、Memory\\Pool Paged Bytes
含義:
Pool Paged Bytes 指在換頁池中的位元組數,換頁池是系統記憶體(作業系統使用的實體記憶體)中可供物件(在不處於使用時可以寫入磁碟的)使用的一個區域。
疑問:Memory\\Pool Paged Bytes 的計數方式與 Process\\Pool Paged Bytes 的方式有什麼不同。
通俗含義:
換頁池的當前虛擬大小,即Task Manager中的Kernel Memory→Paged Virtual。
換頁池的當前物理(駐留)大小參見計數器Memory\\Poll Paged Resident Bytes。
分析:
也需要觀察Server\\Pool Paged Failures,頁面池分配失敗的次數。非零表示計算機的實體記憶體或頁面檔案太小。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

17、Memory\\ Cache Bytes
含義:

系統工作集的總大小,其包括以下程式碼或資料駐留在記憶體中的那一部分:系統快取、換頁記憶體池、可換頁的系統程式碼(Ntoskrnl.exe和驅動程式),以及系統對映的檢視。
分析:
從字面意思上看,僅僅是指系統快取,其實不然。
Cache Bytes Memory\\System Cache Resident Bytes、Memory\\System Driver Resident Bytes、Memory\\System Code Resident Bytes 和 Memory\\Pool Paged Resident Bytes的總和。

18、Memory\\Cache Bytes Peak
含義:
Cache Bytes Peak 是系統啟動後文件系統快取使用的最大位元組數量。這可能比當前的快取量要大。這個計數器只顯示上一次觀察到的值;它不是一個平均值。
原文:
Shows the maximum number of bytes used by the file system cache since the system was last started. This might be larger than the current size of the cache.

19、Memory\\Cache Faults/sec
含義:
Cache Faults/sec 指在檔案系統快取中找不到要尋找的頁而需要從記憶體(軟錯誤)的其他地方或從磁碟(硬錯誤)的其他上檢索時出現的錯誤的速度。檔案系統快取活動是大部分應用程式 IP 操作的可靠指示
器。這個計數器顯示錯誤的次數而不管每次操作中的出錯的頁數。
原文:
Shows the rate, in incidents per second, at which faults occured when a page that was sought in the file system cache was not found and was be retrieved either from elsewhere in memory (a soft fault) or from disk (a hard fault). This counter shows the total number of faults, without regard for the number of pages faulted in each operation.
分析:
從檔案系統快取中查詢資料,未命中的次數。這個值應該儘可能的低,較大的值表明記憶體出現短缺,快取命中很低。
同時需要觀察Cache\MDL Read Hits%,MDL Read Hits 是指 Memory Descrīptor List 向檔案系統快取發出的請求命中快取的百分比,例如:不需要磁碟訪問即可為在快取中的頁面提供記憶體訪問。
值越大(接近100%),表明檔案系統快取效果越好。

20、Memory\\Demand Zero Faults/sec
含義:
Demand Zero Faults/sec 通過零化頁面來彌補分頁錯誤的平均速度。這個計數器顯示最近兩個保留取樣值的差,再除以取樣間隔。零化頁面是指先清空以前的資料,再將頁面用0來填滿,這是Windows NT的安全性功能,這樣可以防止以前的資料外洩。這個計數器顯示的是錯誤數量,而不是重新獲取的頁面數量。
原文:
Shows the average rate, in incidents per second, at which page faults required a zeroed page to satisfy the fault. This counter displays the difference between the values observed in the last two samples, divided by the duration of the sample interval. Zeroed pages (pages emptied of previously stored data and filled with zeroes) prevent processes from seeing data stored by earlier processes that used the same memory space. This counter displays the number of faults, without regard to the number of pages retrieved to satisfy the fault.

21、Memory\\Free System Page Table Entries
含義:
Free System Page Table Entries 指系統沒有使用的頁表專案。這個計數值僅顯示上一次的值,而不是一個平均值。
原文:
Shows the number of page table entries not in use by the system.

22、Memory\\Pool Paged Resident Bytes
含義:
換頁池所使用的實體記憶體,即Task Manager中的Kernel Memory→Paged Physical。

23、Memory\\System Cache Resident Bytes
含義:
System Cache Resident Bytes 是檔案系統快取可換頁的作業系統程式碼的位元組大小。此值只包括當前的物理頁面,而不包括當前未使用的虛擬記憶體頁面。它不等於“ 工作管理員 ”上顯示的系統快取值。因此,此值會比檔案系統快取使用的實際虛擬記憶體要小。此值是 Memory\\System Code Resident Bytes 的元件,它代表當前在實體記憶體裡的所有可換頁的作業系統程式碼。
原文:
Shows the size, in bytes, of pageable operating system code in the file system cache. This value includes only current physical pages and does not include any virtual memory pages that are not currently resident. It does not equal the System Cache value shown in Task Manager. As a result, this value may be smaller than the actual amount of virtual memory in use by the file system cache. This value is a component of System Code Resident Bytes that represents all pageable operating system code that is currently in physical memory.
通俗含義:
系統快取所使用的實體記憶體。

24、Memory\\System Code Resident Bytes
含義:
System Code Resident Bytes 是作業系統程式碼當前在實體記憶體的位元組大小,此實體記憶體在未使用時可寫入磁碟。此值是 Memory\\System Code Total Bytes 的元件,它還包括磁碟上的作業系統程式碼。Memory\\System Code Resident Bytes (和 Memory\\System Code Total Bytes) 不包括必須留在實體記憶體的程式碼,並且不能寫入磁碟。
原文:
Shows the size, in bytes, of operating system code currently in physical memory that can be written to disk when not in use. This value is a component of System Code Total Bytes, which also includes operating system code on disk. System Code Resident Bytes (and System Code Total Bytes) does not include code that must remain in physical memory.
通俗含義:
Ntoskrnl.exe中可換頁程式碼所使用的實體記憶體。

25、Memory\\System Code Total Bytes
含義:
System Code Total Bytes 指當前在虛擬記憶體中的可換頁的作業系統程式碼的位元組數。這是用來衡量在不使用時可以寫入到磁碟上的作業系統使用的實體記憶體的數量。這個值是通過將在 Ntoskrnl.exe, Hal.dll 、啟動驅動器和用 Ntldr/osloader 載入的檔案系統中的位元組的數相加得出的。這個計數器不包括必須保留在實體記憶體中並不能寫入到磁碟上的程式碼。
原文:
Shows the size, in bytes, of pageable operating system code currently in virtual memory. It is a measure of the amount of physical memory being used by the operating system that can be written to disk when not in use. This value is calculated by adding the bytes in Ntoskrnl.exe, Hal.dll, the boot drivers, and file systems loaded by Ntldr/osloader. This counter does not include code that must remain in physical memory.

26、Memory\\System Driver Resident Bytes
含義:
System Driver Resident Bytes 指裝置驅動程式當前使用的可換頁的實體記憶體的位元組數。它是驅動程式的工作集(實體記憶體區域)。這個值為 Memory\\System Driver Total Bytes (也包括可以寫入磁碟的驅動程式
記憶體)的元件。無論 System Driver Resident Bytes 還是 System Driver Total Bytes都包括不能寫入磁碟的實體記憶體。
原文:
Shows the size, in bytes, of pageable physical memory being used by device drivers. The counter is the working set (physical memory area) of the drivers. This value is a component of System Driver Total Bytes, which also includes driver memory that has been written to disk. Neither System Driver Resident Bytes nor System Driver Total Bytes includes memory that cannot be written to disk.
通俗含義:
可換頁的裝置驅動程式程式碼所使用的實體記憶體。

27、Memory\\System Driver Total Bytes
含義:
System Driver Total Bytes 指裝置驅動程式當前使用的可換頁的虛擬記憶體的位元組數。當不使用時可換頁記憶體可以寫入磁碟。它包括實體記憶體(Memory\\System Driver Resident Bytes)和程式碼以及寫到磁碟中的資料。它是Memory\\System Code Total Bytes 的一個元件。
原文:
Shows the size, in bytes, of pageable virtual memory currently being used by device drivers. Pageable memory can be written to disk when it is not being used. It includes physical memory (System Driver Resident Bytes) and code and data written to disk. This counter is a component of System Code Total Bytes.

28、Memory\\Transition Faults/sec
含義:
Transition Faults/sec是在沒有額外磁碟執行的情況下,通過恢復頁面來解決頁面錯誤的速度。頁面錯誤包括頁面正被另一個共享此頁面的程序使用,或在被修改的頁面列表上或待機列表上,或在發生頁面錯誤時正被寫入磁碟。該技術器也等於錯誤的頁面數量,因為每一操作只有一個頁面錯誤。
原文:
Shows the rate, in incidents per second, at which page faults were resolved by recovering pages without additional disk activity, including pages that were being used by another process sharing the page, or that were on the modified page list or the standby list, or that were being written to disk at the time of the page fault. This counter is also equal to the number of pages faulted because only one page is faulted in each operation.
分析:
如果這個指標持續的居高不下說明記憶體存在瓶頸,應該考慮增加記憶體。

29、Memory\\Write Copies/sec
含義:
Write Copies/sec 是指通過從實體記憶體中的其他地方複製頁面來滿足寫入嘗試而引起的頁面錯誤速度。由於頁面只在被寫入時才被複制,這是一個實用的共享資料方式;另外該頁面是共享的。這個計數器顯示的是複製次數,不考慮每次操作時中被複制的頁面數。
原文:
Shows the rate, in incidents per second, at which page faults were caused by attempts to write that were satisfied by copying the page from elsewhere in physical memory. This is an economical way of sharing data since pages are only copied when they are written to; otherwise, the page is shared. This counter shows the number of copies, without regard to the number of pages copied in each operation.
分析:
就是寫時複製錯誤的比率。寫時複製頁面保護機制是一種優化,記憶體管理器利用它可以節約記憶體。
例如:兩個程序正在共享三個頁面,每個頁面都被標記為寫時複製,當其中一個程序的任一執行緒對一個頁面執行寫操作,則會產生一個記憶體管理錯誤。記憶體管理器不會將該錯誤報告為訪問違例,而是在實體記憶體中分配一個新的讀/寫頁面,並將原始頁面中的內容拷貝到新的頁面中,同時更新該程序對應的頁面對映資訊,使之指向新的頁面位置,然後解除異常,從而繼續進行剛才的寫指令。寫操作成功,新拷貝的頁面現在對於執行寫操作的程序來說是私有的,對於其他程序是不可見的。

後序
本人蔘考《深入解析Windows作業系統》和網上的一些資料,通過自己的理解,形成了上文,有什麼不足之處,敬請提出。