我在计算一组进程实际使用的内存(驻留)时遇到了问题。
刚刚出现的问题是用户有一组在它们之间共享内存的进程,所以简单地添加已用内存最终会得到一个无意义的数字(>60gb,而机器只有 48gb 内存)。
有什么简单的方法可以解决这个问题吗?
我大概可以做一些近似。取 (res mem - shared mem) * num proc + shared mem
。但并非所有进程都必须共享相同的内存块。
我正在寻找针对 C/C++ 的此问题的 POSIX 或 Linux 解决方案。
最佳答案
您将要遍历每个进程 /proc/[pid]/smaps
它将包含每个 VM 映射的条目:
7ffffffe7000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
Size: 100 kB
Rss: 20 kB
Pss: 20 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 20 kB
Referenced: 20 kB
Anonymous: 20 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Private_Dirty
内存是你感兴趣的。
如果您的 smaps
文件中有 Pss
字段,那么这是常驻内存量除以共享物理内存的进程量。
Private_Clean
可以是写时复制映射。这些通常用于共享库,通常是读/不写/执行。
关于c++ - 计算 Linux 上一组进程使用的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18104576/