/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]/statusRssAnon/proc/[pid]/smaps_rollupAnonymous 的数字之间存在差异。我还查看了 /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- 的答案最接近(实际上,这里讨论了 statmsmaps):,因为它是基于对生成 [=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.

(*这个精确数字并不严格准确,详情请参阅线程)