一个命令解决查看进程在Linux上实际需要多少内存 -Percona


基于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交换数据,说明肯定存在内存泄漏。

是否想查看正在使用多少内存进程?不要查看虚拟内存大小或常驻内存大小,而是查看定义为常驻内存大小+交换使用情况的“已用”内存。