我如何找出进程正在使用交换空间?


10

我有一个关于9GB交换空间的linux服务器顶级报告: 最佳

但是我不知道它在哪里使用交换,一些谷歌结果说Otop-逗号跟随p将按过程显示交换使用情况。但是,如上图所示,对SWAP列进行简短汇总显示,使用了> 10GB的交换空间,那么9GB的交换空间使用量是从哪里来的呢?

热门报道,缓冲区使用了约96492kb的内存。有什么我可以做的,而不是使用交换吗?


1
top(按手册页)将SWAP计算为虚拟-物理内存使用。根据我的实验并不完全准确。
lornix 2011年

Answers:


6

多个程序可能会使用相同的交换区,因此将被报告两次。

无需尝试告诉Linux使用缓冲区而不是交换-它在做什么方面已经很聪明了。如果您使用的是9gb的交换和9gb的缓冲区,那是一件好事……这意味着Linux意识到加载到内存中的9gb的东西并没有得到积极使用,因此将其交换到磁盘以使您的磁盘更有效缓冲区可以变大,并提高性能。


编辑:如果您累加了每个进程使用的所有内存,您将获得比物理RAM更大的内存。这是由于多个程序使用了共享库,以及Linux处理fork的方式-它不复制整个程序在内存中,它仅复制两个实例之间不同的部分。在某些情况下,视频内存可以显示为X进程的一部分-我认为旧的Voodoo3卡可以做到这一点。在其他情况下,“虚拟”内存也可能出现在顶部。


我不认为共享库应该算作交换,因为在系统启动时,没有交换使用,但是已经加载了许多共享库。无论如何,我看到我的系统使用了大约9GB的交换分区,我只想找出哪个进程使用了​​大多数交换(不包括共享库,内存映射文件...)
secmask 2011年

3

解析/ proc子目录的工作原理是:

作为bash脚本:

for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done

可以通过管道排序对输出进行高/低排序:

{blah}| sort -rn

当然,您可以根据自己的喜好用一周中的一种语言来重写它。我的Awk-fu不强壮。

(剪切可粘贴)

#!/bin/bash
#
# show swap used by processes
#
(for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done ) | sort -nr


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.