如何找出 Linux 中哪些进程正在使用交换空间?

交换空间在 Linux 中很常见,通常在物理量memory(RAM)已满时使用。交换空间背后的想法是,如果操作系统需要更多的内存资源而 RAM 没有任何剩余空间,那么不活动的页面将被移动到交换空间。

还应该注意的是,虽然交换空间肯定会在短期内帮助 RAM,但不应将它们视为更多 RAM 的替代品。

现在我们对交换空间有了一些了解,让我们来谈谈如何检测 Linux 中哪些进程正在使用交换空间。

有很多方法可以了解正在使用交换空间的进程,最基本的方法是使用top命令,然后按f,,向下滚动到显示SWAP press space 的位置,然后键入q

虽然建议使用 shell 脚本或使用 Linux 实用程序,如smem

使用 SME

linux 上的 SMEM 是一个命令行实用程序,用于提供有关 lInux 系统上内存使用情况的各种报告。

安装 SMEM

为了在本地机器上安装 smem,请按照下面显示的命令进行操作 -

对于 Ubuntu/Fedora -

sudo apt-get install smem

对于 CentOS -

yum install smem

语法

smem [options]

当我们运行如下所示的命令时,我们将获得不同的进程及其 PID、用户名、命令和它们的交换内存使用情况。

命令

smem
输出结果
PID      User     Command               Swap    USS     PSS    RSS
46740  xxxxxxxx /usr/bin/php-cgi       2904      0       2      4
3623   root     ssh-agent-1             572      4       4      4
53398  xxxxxxx  /usr/bin/php-cgi       2748      4       4      8
53396  immukul  /usr/bin/go-cgi        2788      4       4      8
7855   root    rpc.rquotad            124      4       6    116
7380   root     ssh-agent-1             6e4      4       3    112
34802  root     ssh-agent-1             576      4       8      9

我们可以清楚地注意到上面输出中提到的进程正在使用交换空间。

获取正在使用交换空间的进程的另一种方法是编写一个 shell 脚本。

考虑下面显示的脚本,该脚本将打印您提供的目录的任何进程是否正在使用交换空间。

脚本

SUM=0
OVERALL=0
for DIR in `find /usr/local/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
do
   PID=`echo $DIR | cut -d / -f 3`
   PROGNAME=`ps -p $PID -o comm --no-headers`
   for SWAP in `grep VmSwap $DIR/status 2 > /dev/null | awk '{ print $2 }'`
   do
      let SUM=$SUM + $SWAP
   done
   if (( $SUM > 0 )); then
      echo "PID=$PID swapped $SUM KB ($PROGNAME)"
   fi
   let OVERALL=$OVERALL + $SUM
   SUM=0
done
echo "Overall swap used on machine : $OVERALL KB"
输出结果
Overall swap used on machine : 26067 KB