如果系統的物理內存用光了,則會用到swap。系統就會跑得很慢,但仍能運行;如果Swap空間用光了,那么系統就會發生錯誤。通常會出現“application is out of memory”的錯誤,嚴重時會造成服務進程的死鎖。所以要高度重視。
free
free -m
就能看出當前系統所使用的swap了。那么如何查看哪些進程使用了swap呢,這樣好針對性的做出優化。
top
Centos(6.0之前):
top只能看到swap總使用量
網上很多人說top+f+p能顯示出來swap。可是按完f查看的時候,man top里面swap的解釋是:
並不是實際的使用swap。而是VIRT-RES得來的。用我蹩腳的英文翻譯就是,虛擬內存中所使用過的swap部分
Centos(6.0之后):
man top
這樣就明顯看出是取出的每個進程的swap,能很方便的查看哪些進程使用了swap。從中也能看到一個信息。那就是讀取了/proc/#/status
vmstat
vmstat -n 1
也能查看到
仍舊無法查看到哪些進程使用了。但是能看到si、so
Memory(內存):
- swpd: 使用虛擬內存大小
- free: 可用內存大小
- buff: 用作緩沖的內存大小
- cache: 用作緩存的內存大小
Swap:
- si: 每秒從交換區寫到內存的大小
- so: 每秒寫入交換區的內存大小
Shell腳本
在Linux內核 2.6.16中引入了一個系統內存接口特性,這個接口位於/proc/$pid/目錄下的smaps文件中 ,一看內容發現是進程內存映像信息,比同一目錄下的maps文件更詳細些。
cat /proc/1/smaps

這里解釋下samps里面的內容:
- bfdca000-bfddf000 是該虛擬內存段的開始和結束位置
- rw-p 內存段的權限,rw是指可讀寫,p是指私有,如果是s則為共享
- bffea000 該虛擬內存段在對應的映射文件中的偏移量
- 00:00 文件的主設備和次設備號
- 0 被映射到虛擬內存的文件的索引節點號
- [stack] 被映射到虛擬內存的文件名稱
- Size 是進程使用內存空間,並不一定實際分配了內存(VSS)
- Rss是實際分配的內存(不需要缺頁中斷就可以使用的)
- Shared_Clean 和其他進程共享的未改寫頁面
- Shared_Dirty 和其他進程共享的已改寫頁面
- Private_Clean 未改寫的私有頁面頁面
- Private_Dirty 已改寫的私有頁面頁面
- Swap 存在於交換分區的數據大小(如果物理內存有限,可能存在一部分在主存一部分在交換分區)
- Pss是平攤計算后的使用內存(有些內存會和其他進程共享,例如mmap進來的)
這里能顯示出swap
那么查看你想要看的進程所使用的swap只需要:
awk '/^Swap:/ {SWAP+=$2}END{print SWAP" KB"}' /proc/$(pid)/smaps
#!/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"
既然知道了原理,大家各自發揮,什么語言都可以統計
iotop
iotop還是非常好用的,能看到哪些進程使用了swap

參考:
http://blog.csdn.net/xiangliangyu/article/details/8213127(以上內容轉自此篇文章)