一個命令解決檢視程式在Linux上實際需要多少記憶體 -Percona

banq發表於2020-09-18

基於Linux系統上面臨的問題之一是管理記憶體預算。如果應用程式(JVM或資料庫程式)使用的記憶體多於可用記憶體,則可能會發生交換,這常常會對效能造成嚴重影響,或者啟用了記憶體不足(OOM)殺手,從而完全終止了程式。
top是檢視Linux當前負載的最常用程式之一。預設情況下,“ top”按CPU使用率對程式進行排序,因此我們將按“ Shift-M”將其按(虛擬記憶體VIRT)記憶體使用率進行排序。
由於各種原因,現代記憶體分配器和程式語言(即GoLang)可以分配很多他們實際上沒有使用的虛擬記憶體,因此虛擬記憶體的使用對於瞭解一個程式需要執行多少實際記憶體沒有什麼價值。
那麼常駐記憶體(RES)指標呢?它向我們顯示了該程式實際使用了多少實體記憶體。很好...但是有問題。記憶體可以是非常駐記憶體,這是因為它可以是沒有真正的“使用過”並且僅作為虛擬記憶體存在,或者是因為它已被交換出記憶體了。
 
使用下面一個命令可以完全瞭解記憶體佔用:

cat /proc/3767/status


其中3767是程式pid,可以透過ps -ax 檢視記憶體中所有程式,找到你需要檢視記憶體的程式pid。

root@PMM2Server:~# cat /proc/3767/status
Name:   prometheus
Umask:  0022
State:  S (sleeping)
Tgid:   3767
Ngid:   0
Pid:    3767
PPid:   3698
TracerPid:      0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 256
Groups: 1000
NStgid: 3767    17
NSpid:  3767    17
NSpgid: 3767    17
NSsid:  3698    1
VmPeak:  3111416 kB
VmSize:  3111416 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:    608596 kB
VmRSS:    291356 kB
RssAnon:          287336 kB
RssFile:            4020 kB
RssShmem:              0 kB
VmData:  1759440 kB
VmStk:       132 kB
VmExe:     26112 kB
VmLib:         8 kB
VmPTE:      3884 kB
VmSwap:   743116 kB


最後一行VmSwap是一個特別有趣的資料點,因為它顯示了該程式被從記憶體交換出的卻在繼續使用的記憶體量。如果它不是0,這裡為743116kB,說明記憶體不足或程式存在記憶體洩漏。

VmRSS + VmSwap可以更好地指示當前程式所需的“物理”記憶體
如果確認程式沒有存在記憶體洩漏,那麼增大實體記憶體到VmRSS+VmSwap大小,如果還存在Swap交換資料,說明肯定存在記憶體洩漏。

是否想檢視正在使用多少記憶體程式?不要檢視虛擬記憶體大小或常駐記憶體大小,而是檢視定義為常駐記憶體大小+交換使用情況的“已用”記憶體。

相關文章