vmstat -s
当我在 Linux 机器上发出命令时,我得到的统计数据为:
$ vmstat -s
16305800 total memory
16217112 used memory
9117400 active memory
6689116 inactive memory
88688 free memory
151280 buffer memory
我跳过了此命令显示的一些详细信息。
我理解这些术语:活动内存是特定进程正在使用的内存。非活动内存是分配给不再运行的进程的内存。
只是想知道,有什么方法可以获取分配了非活动内存的进程吗?因为top
orvmstat
命令仍然将已用内存显示为活动内存和非活动内存的总和,并且我只能看到正在使用活动内存的进程,但哪些进程正在使用非活动内存对我来说仍然是一个问题。
答案1
在某些情况下,查看非活动内存很有趣,例如,活动内存与非活动内存的高比率可以表明内存压力,但这种情况通常伴随着分页/交换,这更容易理解和观察。另一种情况是能够观察活动内存随着时间的推移而增加或呈锯齿状——这可以给您一些低效软件的预警(我已经在表现出O(n)
类型行为和性能下降的幼稚软件实现中看到了这一点)。
该文件/proc/kpageflags
包含每个物理内存页的 64 位位图,您可以通过程序获得摘要page-types
它可能随您的内核一起提供。
您的理解积极的和不活跃的然而是不正确的
- 主动记忆是“最近”访问过的页面
- 不活跃的记忆是“最近”没有访问过的页面
“最近”并不是一个绝对的时间度量,还取决于活动和内存压力(您可以阅读免费书籍中的一些技术细节了解 Linux 虚拟内存管理器,第10章与此处相关),或内核文档(页面映射.txt)。
每个列表都存储为 LRU(或多或少)。非活动内存页是写入交换文件的良好候选者,无论是抢占式(在需要空闲内存页之前)还是当空闲内存低于配置的限制并且(预计即将)需要空闲页时。
任一标志都适用于分配给正在运行的进程的页面,除了持久内存或共享内存之外,当进程退出时,所有内存都会被释放,否则将被视为错误。
这种低级页面标记不需要知道 PID(并且在任何情况下,内存页面都可以有多个映射的 PID),因此提供您请求的数据所需的信息并不在一处。
要在每个进程的基础上执行此操作,您需要从 中提取虚拟地址范围/prod/PID/maps
,使用 转换为 PFN(物理页)/proc/PID/pagemap
,并索引到 中/proc/kpageflags
。这一切都在 中进行了描述pagemap.txt
,大约需要 60-80 行 C 语言。除非您正在对 VM 系统进行故障排除,否则这些数字并不是很有趣。您可以做的一件事是计算每个进程的非活动页面和交换支持页面,这些数字应该表明与 VSZ(虚拟机总大小)相比,RSS(驻留)大小较低的进程。另一件事可能是推断内存泄漏,但有更好的工具可以完成该任务。
答案2
没有这样的工具,因为它对于任何外部程序来说都是完全没有意义的。
系统中唯一需要知道这一点的是内核的内存处理程序,它将使用它来知道在可用内存耗尽时要调出(交换)哪些内容。
唯一可能引起担忧的相关情况是您的交换几乎已满。如果出现这种情况,只需增加它即可。
我从未见过需要调查非活动内存的实际问题。