如何才能找出 Linux 上某个进程所占用的内存量?

如何才能找出 Linux 上某个进程所占用的内存量?

为了防止 OOM killer 运行,我设置了 vm.overcommit_memory = 2 和 vm.overcommit_ratio = 100 。我想知道给定进程提交了多少内存,这些内存将计入提交计数。

它不是驻留工作集,因为驻留工作集不包括交换出的数量。它也不是虚拟大小,因为虚拟大小包括 mmap() 文件,这些文件不计入提交限制。

答案1

运行pmap -x PID该进程的 ID 来显示内存分配。

[root@ObamaBiden ~]# pmap -x 8106
8106:   /opt/dbcfs/dbcfsrun 10.51.64.76 4483 /opt/dbcfs/dbcfs.cfg 9584:1 -ssl
Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000266000     120      96       0 r-x--  ld-2.12.so
0000000000284000       4       4       4 r-x--  ld-2.12.so
0000000000285000       4       4       4 rwx--  ld-2.12.so
0000000000288000    1584     388       0 r-x--  libc-2.12.so
0000000000414000       8       8       8 r-x--  libc-2.12.so
0000000000416000       4       4       4 rwx--  libc-2.12.so
0000000000417000      12       8       8 rwx--    [ anon ]
0000000008048000     912     624       0 r-x--  dbcfsrun
000000000812c000      56      44      36 rwx--  dbcfsrun
000000000813a000     152      60      60 rwx--    [ anon ]
0000000008a51000     280     132     132 rwx--    [ anon ]
00000000f678c000   16008    5396    5396 rwx--    [ anon ]
00000000f7739000       4       4       4 rwx--    [ anon ]
00000000f773a000       4       4       0 r-x--    [ anon ]
00000000ffd8a000      84      32      32 rwx--    [ stack ]
----------------  ------  ------  ------
total kB           19236    6808    5688

答案2

您可以查看成本图在内核文档中。简而言之,共享匿名或/dev/zero映射仅计算一次其大小,而私有可写映射则为每个实例计算一次。

您可以使用pmap它来准确查看某个进程正在映射什么以及如何映射。 生成的输出pmap -d包含一个页脚行,其中包含私有可写映射的总聚合大小。

答案3

我根据 @ewwhite 的回答创建了一个脚本,用于按系统中的所有进程的总已用内存对其进行排序。脚本可在此处找到https://gitlab.com/ramast/committed-memory-usage/-/blob/main/get_committed_memory.sh

相关内容