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

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

我的 Linux 服务器顶部报告使用了大约 9GB 的交换空间: 顶部

但我不知道它在哪里使用了交换空间,一些谷歌搜索结果显示 top -O命令后跟p将显示进程的交换空间使用情况。但如上图所示,对 SWAP 列进行简单求和显示使用了 > 10GB 的交换空间,那么交换空间使用量 9GB 的数字从何而来?

Top 报告称缓冲区使用了大约 96492kb 的 RAM。除了使用交换空间外,我还能做些什么来利用这些内存吗?

答案1

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

无需尝试告诉 Linux 使用缓冲区而不是交换区——它已经非常聪明地了解自己在做什么。如果您使用 9gb 的交换区和 9gb 的缓冲区,那是一件好事……这意味着 Linux 意识到加载到内存中的 9gb 内容并未被积极使用,因此将其交换到磁盘更有效率,这样您的缓冲区就可以变大,并提高性能。


编辑:如果将每个进程使用的所有内存加起来,您得到的内存也会比物理 RAM 多得多。这是由于多个程序使用了共享库,以及 Linux 处理分叉的方式——它不会在内存中复制整个程序,而只会复制两个实例之间不同的部分。在某些情况下,视频内存可以显示为 X 进程的一部分——我认为旧的 Voodoo3 卡就是这样做的。可能还存在“幻像”内存可能出现在 top 中的其他情况。

答案2

解析/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

输出可以通过管道按 Hi-Lo 进行排序:

{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

答案3

for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less

从:http://www.cyberciti.biz/faq/linux-which-process-is-using-swap/

答案4

另一个工具,显示最高内存使用情况:
smemstat -mT

相关内容