确定哪些程序正在使用交换空间/使用量

确定哪些程序正在使用交换空间/使用量

这是我的第一个问题——我意识到我可能在这里做错了什么,所以如果我做错了,请给我指明正确的方向。

我想知道我的机器上哪些程序正在使用交换空间,以及每个程序使用了多少交换空间。我知道这可能可以通过 top 来完成,但我不知道该怎么做。

我尝试过的:

  1. 开始顶部
  2. 按 f(添加列)
  3. 按 p(SWAP 列)

这添加了一个 SWAP 列,但数据似乎不正确。Top 列出 Firefox 使用了 582m 的交换空间,但 header 同时报告使用了 0k 的交换空间。

我做错什么了吗?有没有更好的方法来监控交换使用情况?

答案1

有两列需要注意:VIRT 和 RES。VIRT 告诉您为进程保留了多少内存。这并不一定意味着它已分配或正在使用,而只是表示进程请求时可用。另一个要查看的是 RES,它告诉您常驻内存中的空间量。这是它实际使用的量。SWAP 列只是 VIRT 减去 RES。

从我搜索到的信息来看,显示 swap IN USE 似乎是不可能的。

答案2

不幸的是事情没那么简单。

“swap” 实际上被认为是“非常驻匿名页面”。也就是说,这些页面不受任何磁盘文件支持(不是 mmap 文件支持的页面)。

当内核内存不足时,它倾向于丢弃最近很少使用的页面。它可能会选择丢弃文件支持的页面或匿名页面。如果选择后者,则使用“交换”。

但是,没有一个单一的过程会触发它,这只是一般的内存压力。

此外,您甚至无法非常准确地测量页面使用情况。每个进程有两个计数,它们(模糊地)有用。它们是 VSIZE(或 vm size),即进程分配的页面总数 - 但这往往大大高估了实际“使用”的数量,因为它可以对页面进行两次计数,并计算根本没有使用的页面(映射但未使用)。

另一个是 RSS,即“驻留集大小”,即当前驻留的页面的内存量。然而,这也不是真实的情况:

  • 同一个页面不一定由一个进程使用 - 它们可以共享。
  • 有些页面由内核内部使用,因此不分配给任何一个进程

我不知道有任何工具可以尝试做出比这更好的估计,但理论上可以利用最近内核中 /proc 中提供的新诊断功能做得更好一些。

相关内容