如何知道哪个进程正在使用交换空间?

15

我的 Fedora 系统中有很多可用内存(约 4G),但是 swap 已经在使用(200+M)。

我想知道哪个进程正在使用 swap。我该如何查看呢?

pstop 只显示内存使用情况。

提前感谢!


4
请查看 /proc/<pid>/status 文件中的 VmSwap - Dummy00001
你为什么想要知道这个? - wildplasser
4个回答

34

改进cyberciti.biz命令以显示更简洁的答案:

(echo "COMM PID SWAP"; for file in /proc/*/status ; do awk '/^Pid|VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | grep kB | grep -wv "0 kB" | sort -k 3 -n -r) | column -t

一个输出的例子:

COMM             PID    SWAP  
dockerd          662    2736  kB
skypeforlinux    26865  1320  kB
NetworkManager   303    1112  kB
slim             392    1028  kB
redis-server     350    204   kB

10

这里

[a] /proc/meminfo - 这个文件报告系统上的内存使用统计信息。它被free命令用于报告系统上可用和已用的内存(包括物理内存和交换空间),以及内核使用的共享内存和缓冲区。你也可以使用free、vmstat等工具来找到相同的信息。

[b] /proc/${PID}/smaps、/proc/${PID}/status和/proc/${PID}/stat:使用这些文件通过进程ID查找有关每个进程使用的内存、页面和交换空间的信息。

[c] smem - 这个命令(Python脚本)按比例分配共享内存并报告内存使用情况。

此外,您还可以参考找出谁在使用您的交换空间

#!/bin/bash
# Get current swap usage for all running processes
# Erik Ljungstrom 27/05/2011
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
do
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
let OVERALL=$OVERALL+$SUM
SUM=0

done
echo "Overall swap used: $OVERALL"

我运行了那个脚本,结果全是0,但free -m命令仍然显示我使用了1.5GB的交换空间,还有其他可能的原因吗? - brian cronrath

2

/proc/'processPID'/status中,您可以在VmSwap字段中找到与此相关的信息。

使用此命令,您可以列出所有正在使用交换空间的进程。

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

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

这篇文章讲述了如何在Linux中查找哪个进程正在使用交换空间。当系统内存不足时,Linux会将一些不常用的内存数据移动到硬盘上的交换空间中。如果您想知道哪个进程使用了交换空间,可以使用top或free命令来查看交换空间使用情况。如果您需要更详细的信息,可以使用smem工具来查看每个进程使用的交换空间量。


2

我认为使用awk输出按交换空间使用情况排序的漂亮表格:

  awk 'function pr(){if (s ~ /^[1-9]/) print p,n,s;n="";p="";s=""}BEGIN{FS="\t *";OFS="\t"}/^Name:/{pr();n=$2}/^VmSwap:/{s=$2}/^Pid:/{p=$2}END{pr()}' /proc/*/status | sort -t $'\t' -k3 -n -r | column -t -s $'\t'

示例输出:

  33992  httpd        13916 kB
  9331   httpd        10616 kB
  43124  httpd        1800 kB
  31353  httpd        592 kB
  8592   master       184 kB
  8606   crond        44 kB
  8653   mingetty     40 kB
  8655   mingetty     32 kB

基于@adrianlzt的回答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接