我在容器内部的 *nix 上运行一些程序,并尝试精确计算我的进程使用的 RAM 量。据我了解,此信息应低于。我尝试使用此 Ruby 脚本对系统上/proc/#{pid}/smaps
所有文件的所有 PSS 求和:smaps
https://gist.github.com/schneems/10025798
但是我看到报告的内存使用量低于我的容器报告的值。如果我切换到使用 RSS,则值会高得多(远远超过我的容器报告的值)。我相当确定我需要的所有信息都可以在中找到/proc
,我只是不知道它是如何报告的,才能获得准确的测量结果。我的问题是:smaps
我应该将中的哪些值相加,因为单独的 PSS 不是一个好的指标?有没有更好或更准确的方法从 Linux 机器中获取此信息?
答案1
RSS 是常驻集大小,换句话说,是进程使用的全局内存,包括运行时加载的每个库。单个库可能会被使用多次(例如,想想 Apache 进程分叉,每个子进程可能使用相同的库)。根据虚拟内存模型,每个进程都认为这块内存是自己使用的。实际上,内核将虚拟内存地址映射到库的唯一内存地址。
另一方面,PSS 会将进程的每个 USS(非共享集大小)相加。可以将其视为进程被终止后会立即释放的内存。它不考虑共享内存,而只考虑进程独有的内存。
因此,RSS 值会高估实际使用内存。如果您确保考虑已加载库的内存大小,PSS 会更准确。
更多细节这里,特别是最后一段。