我刚刚查看了 top 的输出,它向我(以及其他进程)显示了以下内容:
正如所见,我有 10 个进程,每个进程消耗大约 10GB,因此总共消耗 100GB。然而,从顶部第二行可以看出,该计算机只有 64GB 内存。其中目前已使用约22GB。
现在解决这个难题:test_mpi.out 进程彼此之间使用大量共享内存。由于我有源代码,我知道实际的内存消耗约为 10GB。
计算机在空闲时消耗约 12GB 内存,因此报告的总内存为 22GB。
我不明白的是top怎么知道实际只使用了22GB内存。根据显示的所有列(VIRT、RES 和 SHR),顶部应该无法弄清楚这一点。如果有人能阐明这一点,那就太好了。
编辑:在redhat linux上运行
编辑:感谢 Michael Homer,我现在知道 top 从 /proc/meminfo 获取此信息。但我更希望得到一个答案来解释我如何确定所有 test_mpi.out 进程总共只消耗 10GB(而不是通过天真地添加 top 的输出建议的 100GB)。我尝试查看 /proc/PID/status 但没有找到任何关于如何确定共享大内存段的多个进程的实际内存使用情况的线索(如果我没有源代码)。
答案1
您可以看到该SHR
列显示的内存量与RES
- 这意味着该特定任务的驻留内存实际上 100% 由共享内存段组成。但即便如此,您也无法充分了解RES
未调出的内存量。
要弄清楚进程的实际内存消耗是多少,请尝试使用更智能的方法,例如ps(1)
使用选择字段(查看-o
选项和STANDARD FORMAT SPECIFIERS
手册的部分)。
请注意,除了size
字段(这是一个非常粗略的估计)之外,进程在内存方面的总大小很难准确地评估其表面值,因为它的一些内存可能与其他进程共享,而我们不能真正直接告诉有多少页是脏的(请参阅手册页上和手册页中的该NOTES
部分的段落)。SIZE
RSS
为了能够知道这些进程实际上正在使用相同的共享内存段,您需要查看ipcs(1)
命令的输出并查看具有可疑nattch
进程数量的共享内存段。
然后您需要查看这些段的详细信息,ipcs -m -i <id>
它将显示附加的实际流程。
如果这听起来太复杂,请将其视为挑战练习 - 编写一个脚本,在给定进程 ID 的情况下,打印该进程所附加的 SHM ID 列表,以及与之共享这些 SHM ID 的 PID 列表。 ;)