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