我的 Fedora 系统中有很多可用内存(约 4G),但是 swap 已经在使用(200+M)。
我想知道哪个进程正在使用 swap。我该如何查看呢?
ps 和 top 只显示内存使用情况。
提前感谢!
改进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
从这里:
[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"
在/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工具来查看每个进程使用的交换空间量。我认为使用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的回答。
/proc/<pid>/status
文件中的VmSwap
。 - Dummy00001