Linux性能優化 第五章 性能工具:特定進程內存
在診斷內存性能問題的時候,也許有必要觀察應用程序在內存子系統的不同層次上是怎樣執行的。在頂層,操作系統決定如何利用交換內存和物理內存。它決定應用程序的哪一塊地址空間將被放到物理內存中,即所謂的駐留集。不屬於駐留集卻又被應用程序使用的其他內存將被交換到磁盤。由應用程序決定向操作系統請求多少內存,即所謂的虛擬集。
當應用程序使用物理內存時,它首先與CPU的高速緩存子系統交換。現代CPU有多級高速緩存。最快的高速緩存離CPU最近(L1),其容量也是最小的。舉個例子,假設CPU只有兩級高速緩存:L1和L2.當CPU請求一塊內存時,處理器會檢查看該內存是否已經存在於
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文件來了解它使用了哪些庫。
Linux性能優化 第五章 性能工具:特定進程內存