c++ - 计算 Linux 上一组进程使用的内存

标签 c++ c linux memory posix

我在计算一组进程实际使用的内存(驻留)时遇到了问题。

刚刚出现的问题是用户有一组在它们之间共享内存的进程,所以简单地添加已用内存最终会得到一个无意义的数字(>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/

相关文章:

c++ - shared_ptr 上的 static_cast 导致未定义的行为

linux - shell 脚本 : Year value is not returned

c++ - 交叉编译中的 CMake CMAKE_AUTOMOC

c - 十六进制转换为无符号整数

c - 首先通过套接字发送我要发送的文件的大小

C程序递归函数

java - 运行 bash 命令并将输出保存到 RAM 内存

c# - 在 redhat 6 上通过 mono 5.4 启动时 RPM scriptlets 失败

c++ - C++11 之前的initializer_list 的替代方案

c++ - 在另一个类中使用成员方法 "generically"