这是我的第一个问题——我意识到我可能在这里做错了什么,所以如果我做错了,请给我指明正确的方向。
我想知道我的机器上哪些程序正在使用交换空间,以及每个程序使用了多少交换空间。我知道这可能可以通过 top 来完成,但我不知道该怎么做。
我尝试过的:
- 开始顶部
- 按 f(添加列)
- 按 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 中提供的新诊断功能做得更好一些。