如何监控每个进程的大页面使用情况

如何监控每个进程的大页面使用情况

我试图确定哪个进程正在使用大量大页,但我找不到简单的 Linux 命令(如top)来查看大页使用情况。我能找到的最好的是

$ cat /sys/devices/system/node/node*/meminfo | fgrep Huge
Node 0 HugePages_Total:   512
Node 0 HugePages_Free:    159
Node 0 HugePages_Surp:      0
Node 1 HugePages_Total:   512
Node 1 HugePages_Free:      0
Node 1 HugePages_Surp:      0

它以节点的粒度告诉我正在使用大页面的位置,但我想查看每个进程的大页面使用情况。我不介意迭代所有进程并cat使用一些/sys特殊设备来获取此信息。

这里有一个类似的问题没有得到答复:https://stackoverflow.com/q/25731343/364818

顺便说一句,我没有运行 Oracle。

答案1

我在 ServerFault 上找到了一个讨论这个问题的讨论。基本上,

$ sudo grep huge /proc/*/numa_maps
/proc/4131/numa_maps:80000000 default file=/anon_hugepage\040(deleted) huge anon=4 dirty=4 N0=3 N1=1
/proc/4131/numa_maps:581a00000 default file=/anon_hugepage\040(deleted) huge anon=258 dirty=258 N0=150 N1=108
/proc/4131/numa_maps:7f6c40400000 default file=/anon_hugepage\040(deleted) huge
/proc/4131/numa_maps:7f6ce5000000 default file=/anon_hugepage\040(deleted) huge anon=1 dirty=1 N0=1
/proc/4153/numa_maps:80000000 default file=/anon_hugepage\040(deleted) huge anon=7 dirty=7 N0=6 N1=1
/proc/4153/numa_maps:581a00000 default file=/anon_hugepage\040(deleted) huge anon=265 dirty=265 N0=162 N1=103
/proc/4153/numa_maps:7f3dc8400000 default file=/anon_hugepage\040(deleted) huge
/proc/4153/numa_maps:7f3e00600000 default file=/anon_hugepage\040(deleted) huge anon=1 dirty=1 N0=1

并获取进程名称

$ ps 4131
  PID TTY      STAT   TIME COMMAND
 4131 ?        Sl     1:08 /var/lib/jenkins/java/bin/java -jar slave.jar
$ ps 4153
  PID TTY      STAT   TIME COMMAND
 4153 ?        Sl     1:09 /var/lib/jenkins/java/bin/java -jar slave.jar

将使您了解哪些进程正在使用大量内存。

$ grep HugePages /proc/meminfo
AnonHugePages:   1079296 kB
HugePages_Total:    4096
HugePages_Free:     3560
HugePages_Rsvd:      234
HugePages_Surp:        0

$ sudo ~/bin/counthugepages.pl 4153
273 huge pages
$ sudo ~/bin/counthugepages.pl 4131
263 huge pages

空闲页面 (3560) 加上 2 个进程的页面 (273+263) 的总和等于 4096。全部计算在内!

对字段求和的 perl 脚本dirty=在这里:

https://serverfault.com/questions/527085/linux-non-transparent-per-process-hugepage-accounting/644471#644471

答案2

要查看给定进程的大页面使用情况,请运行

numastat -p PID

以及相关的进程 ID。

答案3

纵观整个/proc文档,我看到巨大的页面使用情况是/proc/PID/smaps通过该字段ht中的标志记录的VmFlags(除了文件支持的页面)AnonHugePages

grep '^VmFlags:.* ht' /proc/[0-9]*/smaps

答案4

红帽推荐此**:

grep -B 11 'KernelPageSize:     2048 kB' /proc/[PID]/smaps \
   | grep "^Size:" \
   | awk 'BEGIN{sum=0}{sum+=$2}END{print sum/1024}'

更多内容请参见我关于服务器故障的问题

** 复制和粘贴可能会很挑剔,如果您没有在“KernelPageSize:”和“2048”之间输入正确的空格数,则可能无法获得正确的结果。执行此 grep 的另一种也许更可靠的方法可能是这样做:

grep -B 11 -E 'KernelPageSize:\s+2048 kB' /proc/[PID]/smaps \
   | grep "^Size:" \
   | awk 'BEGIN{sum=0}{sum+=$2}END{print sum/1024}'

您的结果应该与“巨大”行一致

numastat -p [PID]

结果以 MiB 为单位。 [PID]代表整数;不包括括号。

相关内容