奇怪,在我的電腦上第一次開啟Visual Studio 2010要8秒左右,而關掉後再次開啟,則只要2秒左右, 這是為什嗎?
好吧,你肯定知道是Windows在背後搞的鬼,你甚至知道我們分別把他們叫做冷啟動(cold start)和暖開機(warm start), 可是Windows到底做了什麼而產生如此大的區別呢?
工作管理員幾乎每天都在用,可是其"效能"那一頁的內容未必全看的懂;Process explorer也常在看,可是其系統資訊(system information)那個框框裡的東西卻未必認得全。花了些時間把這些概念理了理,總結一下。相信看完這些,對剛才那個問題會有比較清晰的解答。
雖然這個對話方塊名字為"系統資訊",但其主要包含的還是系統的一些績效參數,如記憶體,CPU, I/O之類的。從上到下,從左至右一共10大類,我們一個一個加以解讀吧。
- CPU Usage
CPU總使用率。在右邊CPU Usage History中可以看到其使用曆史,我們可以注意到有兩條線:紅的那條量比較小的是核心的使用率,而綠色的則表示總的使用率。如果你的系統時不時的卡一下,通過查看每個進程的使用率又因為太快而捕捉不到,看看曆史,把滑鼠移到之前某個波峰上,就會跳出個tooltip,誰在搗鬼自然一目瞭然。
當然,如果是多核的機器,可以把最下面那個"Show one graph per CPU"勾上查看單個核的使用方式。
- Commit
虛擬記憶體的"認可用量"。這是工作管理員的翻譯。如果我們把在實體記憶體中的所有可交換到pagefile的內容強制交換出去,此時pagefile中總的內容,就是Commit的大小。這就是為什麼工作管理員也把Commit稱為Page File使用率(page file的有效內容/page file檔案大小)的原因。對於當前系統來講,其大小為已經寫到page file上的內容,加上還在實體記憶體中的可以寫到page file中去的內容。
"Commit"或者"認可用量"這個名字聽起來不是很直觀,但我們知道有個叫VirtualAlloc的API分配記憶體的時候,我們可以指定記憶體的類型,常用的兩種是MEM_COMMIT和MEM_RESERVE, 我們看出來這裡Commit其實就是指以MEM_COMMIT的方式分配的記憶體。
會被交換到pagefile的記憶體包括private bytes, paged pool等,不會被交換到page file的記憶體包括記憶體對應檔(他們會被交換到對應可執行檔)和nonpaged pool或者系統核心,驅動(常駐記憶體)。
- I/O Bytes
系統的輸入輸出情況。包括檔案、網路和裝置(滑鼠、鍵盤等)的活動。讀寫檔案是最常見的一種I/O。右邊曆史視窗中,藍色的表示讀寫的總量,而粉紅色的表示寫的量。和CPU的使用率一樣,我們可以對之前哪些進程進行了大量讀寫一目瞭然。一般情況下,粉紅的那條線是"貼地而行"的,但你可以通過copy-paste上百兆的檔案(avi或者rmvb等)觀察到粉紅線的突然上升。
- Physical
實體記憶體使用量。
- Totals
系統中控制代碼,線程,進程的總數量。
這裡控制代碼(Handle)是指向作業系統的一個引用,如HWND,HMENU,HDC等等。你可以把其簡單的看成指向系統的某塊記憶體,當然,實際情況會比這個複雜。
- Commit Charge(k)
這個就是第二項所介紹的Commit,只不過除了即時的認可用量,還提供了更多的關於Commit Charge的資訊:。 Current: 當前的Commit Charge大小
Limit: Commit Charge的最大可能值,一般為:分頁檔大小 + 實體記憶體大小 - 常駐實體記憶體的內容(nonpaged pool, system core等等)
Peak: 自系統啟動以來有過的最大的Commit Charge大小。
Peak/Limit,Current/Limit兩個資料的意義不言自明,當Current/Limit的值接近100%時,你的系統就會非常非常的慢。
這個概念在Wiki上也有很不錯的解釋:Commit Charge.
- Physical memory(k)
實體記憶體的使用方式。 Total:總實體記憶體量
Available:可用實體記憶體,包括free page list, zero page list和standby page list,在第四項看到的實體記憶體使用量,加上這裡的可用實體記憶體,自然就是總實體記憶體量。
System Cache:包括Cache Bytes(System's working set)和standby page list.
Standby page list是可用實體記憶體,當free page list和zero page list用完後,就會開始破壞cache使用它。Standby page list同時也是cache,它是磁碟內容在實體記憶體的緩衝,當再次訪問到該內容時,可以從實體記憶體cache中直接拿到從而避免了讀取磁碟。
- Kernel Memory(k)
核心記憶體。核心下使用的記憶體包含兩個非常重要的概念:paged pool和nonpaged pool。核心分配記憶體就是通過這兩個記憶體池的。正如其名字所表示的,paged pool上的記憶體是可以被交換到page file的,而nonpaged pool上的記憶體是常駐實體記憶體的,是永遠也不會被交換到pagefile上去的。 Paged Physical: paged pool所分配的記憶體在實體記憶體上大小。
Paged Virtual: paged pool所分配的總記憶體大小。
Paged Limit:paged pool的最大值,在註冊表中可以設定。
Nonpaged: nonpaged pool上所分配的記憶體的大小,也就是實體記憶體的大小。
Nonpaged Limit:nonpaged pool的最大值,在註冊表中可以設定。
這裡page limit和nonpaged limit的內容需要設定系統符號檔案才能正確顯示:Option|Configure Symbols.
- Paging
這裡的paging不光指系統的page file,還包括memory mapped file,一般為exe,dll檔案。當系統需要時,commit的記憶體會被交換到page file,而代碼所佔的記憶體則會被交換到其對應的可執行檔本身。當然,如果你的dll被rebase過,也就是被修改過了,觸發了copy on write,會產生一份新的內容並也會被交換到pagefile上去。 Page Fault Delta:每秒所發生的page fault的總次數,page fault是指訪問的虛擬記憶體頁不在進程的工作集中,需要從記憶體的standby list去拿,或者從磁碟load進來,前者為soft page fault, 後者為則hard page fault,耗時較長。
Page Read Delta:每秒從磁碟讀入的page數量。
Paging File Write Delta:每秒寫入到page file的page數
Mapped File Write Delta:每秒寫入到mapped file的page數,如exe,dll等。
當系統實體記憶體不夠用時,這些資料會變得很大,這是一個系統thrash的訊號。
- CPU and I/O
Context Switch Delta: 每秒鐘線程context switch的次數。
I/O Read Delta: 每秒的輸入數,I/O包括磁碟,網路,裝置等的輸入輸出。
I/O Write Delta: 每秒的輸出數,
I/O Other Delta: 不包括資料的I/O操作,如控制操作的速率。
copy-paste一個500M左右的.rmvb或者.avi,就能明顯的觀察到read delta和write delta的變化。
那麼現在,對本文開始提出的那個問題就比較清晰了:
注意:
很多術語名詞,如private bytes, paged pool之類的,都可以在performance monitor中看到說明。