Linux下如何查看哪些程序占用了swap和比重?

我有一台队列服务器,明明物理内存还有空间,但是swap还是被使用了非常多,具体情况如下:
[root@xm-prod-cloud-queue1 ~]# free -m
total used free shared buffers cached
Mem: 15951 12643 3308 0 116 199
-/+ buffers/cache: 12327 3624
Swap: 976 424 551
如何查找出使用swap的程序和比重?
已邀请:

Something - 90后IT男

赞同来自:

在Linux里(别的系统也差不多),内存有物理内存和虚拟内存之说,物理内存是什么自然无需解释,虚拟内存实际是物理内存的抽象,多数情况下,出于方便性的考虑,程序访问的都是虚拟内存地址,然后操作系统会把它翻译成物理内存地址。很多人会把虚拟内存和Swap混为一谈,实际上Swap只是虚拟内存引申出的一种技术而已:操作系统一旦物理内存不足,为了腾出内存空间存放新内容,就会把当前物理内存中的内容放到交换分区里,稍后用到的时候再取回来,需要注意的是,Swap的使用可能会带来性能问题,偶尔为之无需紧张,糟糕的是物理内存和交换分区频繁的发生数据交换,这被称之为Swap颠簸,一旦发生这种情况,先要明确是什么原因造成的,如果是内存不足就好办了,加内存就可以解决,不过有的时候即使内存充足也可能会出现这种问题,比如MySQL就有可能出现这样的情况,解决方法是限制使用Swap: 
sysctl -w vm.swappiness=0
把 vm.swappiness = 0 添加到配置文件 /etc/sysctl.conf ,然后sysctl -p 即可。
 
统计前10个占用swap分区的程序:
# for i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'` ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps ;done |sort -k2nr  |head
awk: 命令行:1: 致命错误: 无法以读模式打开文件“/proc/23407/smaps”(没有那个文件或目录)
awk: 命令行:1: 致命错误: 无法以读模式打开文件“/proc/23408/smaps”(没有那个文件或目录)
awk: 命令行:1: 致命错误: 无法以读模式打开文件“/proc/23409/smaps”(没有那个文件或目录)
awk: 命令行:1: 致命错误: 无法以读模式打开文件“/proc/23410/smaps”(没有那个文件或目录)
15460 399.805M
25560 17.1875M
22311 3.10938M
1247 0.613281M
22145 0.605469M
412 0.550781M
1246 0.527344M
929 0.378906M
888 0.363281M
2216 0.34375M

查看指定进程的swap使用情况:
awk '/^Swap:/ {SWAP+=$2}END{print SWAP" KB"}' /proc/$(pid)/smaps  

统计shell脚本如下:
#!/bin/bash  
# Get current swap usage for all running processes
# writted by xly

function getswap {
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"
}

getswap
#getswap|egrep -v "Swap used: 0"
参考:http://blog.uouo123.com/post/93.html  

要回复问题请先登录注册