memory-management -/proc/[pid]/status :RssAnon and/proc/[pid]/smaps_rollup:Anonymous? 不一致是什么原因

标签 memory-management linux-kernel procfs

我经常注意到 /proc/[pid]/status 中为 RssAnon 给出的数字与 中为 Anonymous 给出的数字之间存在差异/proc/[pid]/smaps_rollup。我还查看了 /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):https://stackoverflow.com/a/30799817/5747415 ,因为它基于对生成 smapsstatm 的内核代码的分析。它以一个(貌似合理,但未经证实)假设结束: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.

(*这个精确数字并不严格准确,请参阅帖子了解详细信息)

关于memory-management -/proc/[pid]/status :RssAnon and/proc/[pid]/smaps_rollup:Anonymous? 不一致是什么原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62301373/

相关文章:

c# - 查找系统和程序内存使用情况的替代方法

memory-management - 当我们删除该模块时,内核模块泄漏的内存是否会返回到系统?

c - mac os下通过sysctl调用获取/proc/<pid>/map信息

linux - 从 proc_fops.open 访问 proc_dir_entry?

Linux 内核 Procfs 多次读/写

iphone - Objective-C 内存问题

c++ - 如何知道数组的值是否由零组成?

c++ - 是否可以在其范围之外访问局部变量的内存?

bash - 将可执行进度条重定向到日志文件

c - `struct task_struct current` 的兄弟总是包含一个 `pid = 0` 的进程