怎樣查看哪些程序占用了swap空間

最近有人問,我的系統swap快被耗盡了,可是卻不知道哪些程序占用了swap,到處發帖問什麽命令可以查看。其實linux系統目前並沒有這樣的命令(或許是有,但我孤陋寡聞不清楚),但是我們可以通過編寫腳本來自己找出占用swap的程序。

那麽怎樣編寫這個腳本呢,首先、我們需要知道去哪查看進程占用資源的情況。每個進程都會在/proc下面生成一個以進程號爲名字的目錄,裏面的各個文件就是其在記憶體中的映像。

其中smaps這個文件,便記載了每個進程每個數據段占用記憶體的情況。

如下是某占用swap的進程的smaps文件截圖(部分):


怎樣查看哪些程序占用了swap空間


Swap: 後面的數字,就是該數據段占用的swap大小,我們只要把這個文件裏所有出現的swap加起來,就是這個進程所占用的swap大小了。

OK,下面開始寫代碼:


  1. #!/bin/bash
  2. ###############################################################################
  3. # 日期 : 2011-10-31
  4. # 作者 : xiaoxi227
  5. # Email : [email protected]
  6. # QQ : 543928910
  7. # 版本 : 1.0
  8. # 腳本功能 : 列出正在占用swap的進程。
  9. # 調用關系 :
  10. # 其他說明 :
  11. ###############################################################################
  12. echo -e "PID\t\tSwap\t\tProc_Name"
  13.  
  14. # 拿出/proc目錄下所有以數字爲名的目錄(進程名是數字才是進程,其他如sys,net等存放的是其他信息)
  15. for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]`
  16. do
  17. # 讓進程釋放swap的方法只有一個:就是重啓該進程。或者等其自動釋放。
  18. # 如果進程會自動釋放,那麽我們就不會寫腳本來找他了,找他都是因爲他沒有自動釋放。
  19. # 所以我們要列出占用swap並需要重啓的進程,但是init這個進程是系統裏所有進程的祖先進程
  20. # 重啓init進程意味著重啓系統,這是萬萬不可以的,所以就不必檢測他了,以免對系統造成影響。
  21. if [ $pid -eq 1 ];then continue;fi # Do not check init process
  22. # 判斷改進程是否占用了swap
  23. grep -q "Swap" /proc/$pid/smaps 2>/dev/null
  24. if [ $? -eq 0 ];then# 如果占用了swap
  25. swap=$(grep Swap /proc/$pid/smaps \# 占用swap的總大小(單位:KB)
  26. | gawk '{ sum+=$2;} END{ print sum }')
  27. proc_name=$(ps aux | grep -w "$pid" | grep -v grep \ # 進程名
  28. | awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}')
  29. if [ $swap -gt 0 ];then# 如果占用了swap則輸出其信息
  30. echo -e "$pid\t${swap}\t$proc_name"
  31. fi
  32. fi
  33. done | sort -k2 -n | gawk -F'\t' '{# 按占用swap的大小排序,再用awk實現單位轉換。
  34. # 如:將1024KB轉換成1M。將1048576KB轉換成1G,以提高可讀性。
  35. pid[NR]=$1;
  36. size[NR]=$2;
  37. name[NR]=$3;
  38. }
  39. END{
  40. for(id=1;id<=length(pid);id++)
  41. {
  42.     if(size[id]<1024)
  43.           printf("%-10s\t%15sKB\t%s\n",pid[id],size[id],name[id]);
  44.     else if(size[id]<1048576)
  45.           printf("%-10s\t%15.2fMB\t%s\n",pid[id],size[id]/1024,name[id]);
  46.     else
  47.   printf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]);
  48. }
  49. }'

本人在某台已占用swap的伺服器執行的結果如下:

怎樣查看哪些程序占用了swap空間

圖片有刪減(爲方便閱讀)

腳本執行結果一目了然,如果某程序占用了大量的swap,則重啓該進程即可。否則時間長了,很可能會因爲swap耗盡而導致系統死機。
更多相關文章
  • 在安裝Linux的時候,不知道swap空間分配多少比較好,所以會隨便分配一個,在真正使用的時候,比如安裝Oracle11g會要求很大的swap空間,發現swap空間不夠,那應該怎麽增加swap空間大小呢.以下的操作都要在root用戶下進行,首先先建立一個分區,采用dd命令比如dd if=/dev/z ...
  • 硬鏈接到底占不占用磁盤空間?查了很多資料都說  硬鏈接不占用磁盤空間,于是乎,我做了如下實驗,竟意外地發現有的硬鏈接也占用了磁盤空間!!!文件系統是 ext4,centos虛擬機.不多說,往下看吧...新建了一個目錄 inode_dir[[email protected]_110 inode_dir]# du - ...
  • 用于大型程序的工具--命名空間[續1]嵌套命名空間即是一個嵌套作用域 -- 其作用域嵌套在包含它的命名空間內部.嵌套命名空間中的名字遵循常規規則:外圍命名空間中聲明的名字被嵌套命名空間中同一名字的聲明所屏蔽.嵌套命名空間內部定義的名字局部于該命名空間.外圍命名空間之外的代碼只能通過限定名引用嵌套命名 ...
  •       當磁盤空間被迅速占用的時候,我們必須找出一些,比較占用磁盤空間的文件或者文件夾.通常情況下,最有可能找出占用磁盤空間文件或文件夾的地方,主要是 /tmp or /var or /home.      目前沒有單個命令來完成查找的工作,通常可以使用一些命令的組合來幫助您找出磁盤上比較占用空 ...
  • linux臨時增加swap空間:step 1: #dd if=/dev/zero of=/home/swap bs=1024 count=500000 注釋:of=/home/swap,放置swap的空間; count的大小就是增加的swap空間的大小,1024就是塊大小,這裏是1K,所以總共空間就 ...
  • Linux 程序記憶體空間布局
    操作系統:ubuntu10.04前言:    在偏底層的開發中,需要了解程序的是如何存儲的.一,架構一個典型的Linux C程序記憶體空間由如下幾部分組成:代碼段(.text):這裏存放的是CPU要執行的指令.代碼段是可共享的,相同的代碼在記憶體中只會有一個拷貝,同時這個段是唯讀的,防止程序由于錯誤 ...
  • [來信]您好賀老師: 無意之間在CSDN上找問題答案看到了你的這個博文,于是下了班,慢慢的,把你那些給朋友們的回複看了個遍.想想自己也有問題,于是給你發信息.不管有沒有回複,不試怎麽知道呢?但願如果你打開了這信,希望您指點一下.   我沒有像其它朋友那樣有著學科出身的經曆,我簡單介紹一下我的經曆. ...
  • 通過查詢數據庫系統中的數據字典表(data dictionary tables)獲取表空間的相關信息,首先使用客戶端工具連接到數據庫,這些工具可以是SQLPLUS字符工具.TOAD.PL/SQL等,連接到數據庫後執行如下的查詢語句: select a.a1 表空間名稱,c.c2 類型,c.c3 區管 ...
一周排行
  • XP上安裝Android開發環境
    XP環境下安裝配置Android開發環境准備工作1.JDK 我下載的版本是jdk-7u10 ...
  • 下一代文件系統Btrfs介紹
    下一代文件系統Btrfs介紹文件系統似乎是內核中比較穩定的部分,多年來,人們一直使用 ex ...
  • APP推廣小技巧之如何提高你的APP人氣aks.yopai.com
    有些創業者會問,APP推廣貌沒用啊,我爲什麽要有自己的APP?用微博和微信啊還有QQ宣傳下 ...
  • 翻譯有兩個給定的排好序的數組nums1和nums2,其大小分別爲m和n. 找出這兩個已排序數組的中位數. 總運行時間的複雜度應該是O(log(m+n)).原文There are two sorted arrays n ...
  • 這要靠自己,建立一個屬于自己的家.豐富,還是簡陋,都是一生.
  • 模塊管理常規功能自定義系統的設計與實現(29--多個模塊之間的關聯5)
    多個模塊之間的關聯(5)        系統全部架構好了,下面來看看一個很遠的關系,&qu ...
  • 圖像處理中的數學原理詳解(Part1 總綱)數字圖像處理技術的開發對數學基礎的要求很高,一些不斷湧現的新方法中,眼花缭亂的數學推導令很多期望深入研究的人望而卻步.一個正規理工科學生大致已經具備了包括微積分.線性代數. ...
  • loadrunner是一款較爲常用的壓力測試工具,功能十分強大.本次的安裝破解只做學習用,個人推薦開源工具pylot等.loadrunner11 下載:主程序下載地址(來自迅雷快傳,已下載成功,版本爲11): htt ...
  • Linux顯示所有輸出域自動縮小到最短三數字單元和[email protected]:~$ free -h total used free shared b ...
  • 忙乎了一個下午,總算忙乎出來了,不過前期大量的搜索工作別人已經完成.大量參考:http://blog.csdn.net /huihui1988/archive/2010/08/09/5799500.aspx學習一下! ...