为了防止 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