Linux效能優化 第五章 效能工具:特定程序記憶體
5.1 Linux記憶體子系統
在診斷記憶體效能問題的時候,也許有必要觀察應用程式在記憶體子系統的不同層次上是怎樣執行的。在頂層,作業系統決定如何利用交換記憶體和實體記憶體。它決定應用程式的哪一塊地址空間將被放到實體記憶體中,即所謂的駐留集。不屬於駐留集卻又被應用程式使用的其他記憶體將被交換到磁碟。由應用程式決定向作業系統請求多少記憶體,即所謂的虛擬集。
當應用程式使用實體記憶體時,它首先與CPU的快取記憶體子系統交換。現代CPU有多級快取記憶體。最快的快取記憶體離CPU最近(L1),其容量也是最小的。舉個例子,假設CPU只有兩級快取記憶體:L1和L2.當CPU請求一塊記憶體時,處理器會檢檢視該記憶體是否已經存在於L1快取記憶體中。如果處於,CPU就可以直接使用。如果不在L1快取記憶體中,處理器產生一個L1快取記憶體不命中。然後它會檢查L2高階快取,如果資料在L2快取中,那麼它可以直接使用;否則處理同上,然後去實體記憶體中取回資訊。明智使用快取記憶體,減少快取記憶體不命中的次數,可以提高效能。
5.2 記憶體效能工具
5.2.1 ps
ps記憶體引數說明
vsz |
虛擬集大小是指應用程式使用的虛擬記憶體的容量。由於Linux只在應用程式試圖使用實體記憶體時才分配它,因此,該項數值可能會比應用程式使用的實體記憶體量大很多。 |
rss |
駐留集大小是指應用程式當前使用的實體記憶體量 |
tsiz |
文字大小是指程式程式碼的虛擬大小 |
dsiz |
資料大小是指程式使用率的虛擬大小 |
majflt |
主故障是指使得Linux代表程序從磁碟讀取頁面的缺頁故障的數量。 |
5.2.2 /proc/<PID>
Linux核心提供一個虛擬檔案系統,使你能提取在系統上執行的程序資訊。/proc的介面非常簡單,裡面的虛擬檔案可以用cat來讀取。系統上的每個PID在/proc目錄下都有一個資料夾,包含一系列的檔案。其中status是程序的PID的程序資訊,其檢索命令為:cat /proc/<PID> status
status檔案顯示的記憶體統計資訊部分解析如下
VmSize |
僅存的虛擬集大小,是應用程式使用的虛擬記憶體量,同ps的vsz |
VmLck |
被程序鎖定的記憶體量,被鎖定的記憶體不能交換到磁碟 |
VmRSS |
駐留集大小或者應用程式當前使用的實體記憶體量。 |
VmData |
資料大小或程式使用資料量的虛擬大小,不包含堆疊資訊 |
VmStk |
程序的堆疊大小 |
VmExe |
程式的可執行記憶體的虛擬大小。它不包含程序使用的庫 |
VmLib |
程序使用的庫的大小 |
例子:檢視weblogic程序的情況
可以看出這個java程序的程式程式碼只有36K,堆疊96K,資料很大(2712776K),庫不大不小(92608)。說明程序沒有多少的可執行程式碼,使用了90多M的庫來支援其執行,小的堆疊意味著該程序沒有呼叫深度巢狀的函式,或者沒有呼叫使用了大型或多個臨時變數的函式。VmLck說明沒有記憶體被鎖定,使得沒法交換記憶體。VmRSS大小為1.1G意味著當前程序使用了1.1G的實體記憶體,不過它分配或對映的大小為2.8G。如果應用程式開始使用之前已分配但並非正在使用的記憶體,那麼VmRSS會增加,而VmSize會保持不變。
如上所述,應用程式的Vmlib的大小不為零,因此使用了庫,可以檢視maps檔案來了解它使用了哪些庫。