/proc/[pid]/status:RssAnon 和 /proc/[pid]/smaps_rollup:Anonymous 之间存在差异的原因是什么?
What is the reason for the discrepancy between /proc/[pid]/status:RssAnon and /proc/[pid]/smaps_rollup:Anonymous?
我经常注意到 /proc/[pid]/status
中 RssAnon
和 /proc/[pid]/smaps_rollup
中 Anonymous
的数字之间存在差异。我还查看了 /proc/[pid]/status
中的 RssShmem
,但这无助于解释差异。例如:
status:Name: tail
status:RssAnon: 72 kB
status:RssShmem: 0 kB
smaps_rollup:Anonymous: 92 kB
在我分析的系统(4.14 内核)中,这种差异很常见。也有数字匹配的情况,但这并不常见。
我发现很多页面都解释了/proc/[pid]/status
、/proc/[pid]/smaps
和/proc/[pid]/smaps_rollup
的内容。然而,从来没有对这种差异做出决定性的解释。来自 rr- 的答案最接近(实际上,这里讨论了 statm
和 smaps
):,因为它是基于对生成 [=22] 的内核代码的分析=] 和 statm
。它以一个(看似合理但未经证实的)假设结束,即 smaps
通过实际遍历内存区域以可靠但耗时的方式计算其数据,而 statm
中的信息基于计数器(在这种情况下 MM_ANONPAGES
) 在许多不同的地方不断更新 - 这可能会导致不一致。
有人可以为这些差异提供一些有根据的解释吗?它们的本意和值的含义是否不同?或者它实际上是一个错误?非常感谢。
你提到的似是而非的理论是正确的。手册页已更新:https://www.spinics.net/lists/linux-mm/msg230450.html
Since 34e55232e59f7b19050267a05ff1226e5cd122a5 (introduced back in
v2.6.34), Linux uses per-thread RSS counters to reduce cache contention on
the per-mm counters. With a 4K page size, that means that you can end up
with the counters off by up to 252KiB* per thread.
(*这个精确数字并不严格准确,详情请参阅线程)
我经常注意到 /proc/[pid]/status
中 RssAnon
和 /proc/[pid]/smaps_rollup
中 Anonymous
的数字之间存在差异。我还查看了 /proc/[pid]/status
中的 RssShmem
,但这无助于解释差异。例如:
status:Name: tail
status:RssAnon: 72 kB
status:RssShmem: 0 kB
smaps_rollup:Anonymous: 92 kB
在我分析的系统(4.14 内核)中,这种差异很常见。也有数字匹配的情况,但这并不常见。
我发现很多页面都解释了/proc/[pid]/status
、/proc/[pid]/smaps
和/proc/[pid]/smaps_rollup
的内容。然而,从来没有对这种差异做出决定性的解释。来自 rr- 的答案最接近(实际上,这里讨论了 statm
和 smaps
):,因为它是基于对生成 [=22] 的内核代码的分析=] 和 statm
。它以一个(看似合理但未经证实的)假设结束,即 smaps
通过实际遍历内存区域以可靠但耗时的方式计算其数据,而 statm
中的信息基于计数器(在这种情况下 MM_ANONPAGES
) 在许多不同的地方不断更新 - 这可能会导致不一致。
有人可以为这些差异提供一些有根据的解释吗?它们的本意和值的含义是否不同?或者它实际上是一个错误?非常感谢。
你提到的似是而非的理论是正确的。手册页已更新:https://www.spinics.net/lists/linux-mm/msg230450.html
Since 34e55232e59f7b19050267a05ff1226e5cd122a5 (introduced back in v2.6.34), Linux uses per-thread RSS counters to reduce cache contention on the per-mm counters. With a 4K page size, that means that you can end up with the counters off by up to 252KiB* per thread.
(*这个精确数字并不严格准确,详情请参阅线程)