我试图确定哪个进程正在使用大量大页,但我找不到简单的 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=
在这里:
答案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]代表整数;不包括括号。