Linux Server 記憶體夠用的話,通常就不會使用到 swap,但是已經使用到 swap 的話,要怎麼查出是哪些程式使用的呢?
- 註:單純使用到 swap 的 PID 列表可查 /proc/*/status 的 VmSwap 值,使用下述即可:
- grep VmSwap /proc/*/status
Linux 查看正在吃 swap 的程式
由上述 VmSwap 抓 PID,可以同時抓 VmSwap 和 Name 的欄位,簡單的列出來:(下述取自:How can I know which process is using swap?)
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done
改寫整成一行:for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less
雖然在此已經夠用,不過下面找到的 script 可以更清楚的顯示出來使用量,所以要看哪些 Process 使用到 swap,可以使用下述的 script 來達成。
下述程式取自此篇:Find Out What Is Using Your Swap
- vim /usr/local/bin/swaplist.sh
#!/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"
- chmod +x swaplist.sh
- swaplist.sh | egrep -v "Swap used: 0" | sort -n -k 5
相關網頁
- Linux: Find Out What Process Are Using Swap Space - 此篇推薦觀看,smem 也相當實用
- memory - How to find out which processes are swapping in linux?
借轉到這兒
https://ruilung-notes.blogspot.tw/2017/02/centos-68-pid-vmswap.html
一行版在centos 6.8下跑不出來,簡單改寫成
cat /proc/*/status | grep -E 'VmSwap|^Pid' | grep VmSwap -B1
要更漂亮就要更加工它囉
嗯嗯,可能 centos 沒有 Name,所以 grep 抓不到資料。
感謝提供解法~
文章中這行有誤"grep VmSwap /proc/status"
應該更正為"grep VmSwap /proc/*/status"
yes,* 都被 markdown 轉換時吃掉了,感謝,已經修正~
部分 process 需要權限才能看到
要嘛就用 root 執行,
或者在第 i 行 改成 for SWAP in `sudo grep Swap $DIR/smaps 2> /dev/null | awk '{ print $2 }'`
另外,在 Ubuntu 18.04 之下使用這個腳本,我發現其總量跟 System Monitor 看到的結果不同。
看起來很像兩倍,但從腳本內我有看不出個所以然來,請問這是怎麽回事呢?
截圖:https://i.imgur.com/gBgol3V.jpg
(排版有調整過,但不影響內容)
這個我也不太清楚,不過這程式是吃 /proc/*/VmSwap 的數值,這個是 process 的實際使用 swap 的數量
System Monitor 到底看哪個數值?或者 系統是否有額外吃的 Swap?
這支程式沒有考量到這些地方
我剛剛有跑過,也在檢查一下,都是 ls -l /proc/*/smaps
權限都是 444,應該都可以讀取才是
是不是有某些特殊程式權限不同?