前言shell
若操做系統的物理內存用完了,則就會用到swap(虛擬內存)。系統就會跑得很慢,但仍能運行;若是swap分區用完了,那麼系統就會發生錯誤。一般會出現「Application is out of memory」的錯誤,嚴重時會形成服務進程的死鎖。操做系統沒法正常運行,因此咱們要高度重視內存使用,下面咱們就來講一說,怎麼統計哪些進程使用了swap分區,查看swap的方法有許多,下面咱們就來一個個說明!緩存
1. free 命令bash
free –m 命令中只能查看當前swap分區的使用狀況,但不能查看具體哪些進程使用了swap!ssh
2. top 命令ide
CentOS 5.5 (top)測試
top 命令能查看swap總量和使用狀況,咱們還可使用快捷鍵查看,top+f+p來查看!操作系統
並非實際的使用swap,而是VIRT-RES得來的,就是虛擬內存中所使用過的swap部分,並不能獲得咱們想要的結果!server
CentOS 6.0-6.4 (top)blog
這樣就明顯看出是取出的每一個進程的swap,能很方便的查看哪些進程使用了swap。從中也能看到一個信息,那就是讀取了/proc/#/status !索引
3. vmstat 命令
vmstat 也不能查看哪一個進程使用了swap,咱們只能看到,swap --- si 與 so,下面咱們簡單說明一下!
Memory(內存):
swpd: 使用虛擬內存大小
free: 可用內存大小
buff: 用做緩衝的內存大小
cache: 用做緩存的內存大小
Swap (虛擬內存):
si: 每秒從交換區讀到內存的大小
so: 每秒寫入交換區的內存大小
4. shell 查看
在Linux內核 2.6.16中引入了一個系統內存接口特性,這個接口位於/proc/$pid/目錄下的smaps文件中 ,一看內容發現是進程內存映像信息,比同一目錄下的maps文件更詳細些!
[root@localhost ~]# cat /proc/1/smaps
下面咱們簡單說明一下samps裏面的內容,
00400000-00409000 是該虛擬內存段的開始和結束位置
r-xp 內存段的權限,rw是指可讀寫,x是指可執行,p是指私有,若是是s則爲共享
00000000 該虛擬內存段在對應的映射文件中的偏移量
08:02 文件的主設備和次設備號
1361644 被映射到虛擬內存的文件的索引節點號
/sbin/init 被映射到虛擬內存的文件名稱
Size 是進程使用內存空間,並不必定實際分配了內存(VSS)
Rss 是實際分配的內存
Shared_Clean 和其餘進程共享的未改寫頁面
Shared_Dirty 和其餘進程共享的已改寫頁面
Private_Clean 未改寫的私有頁面頁面
Private_Dirty 已改寫的私有頁面頁面
Swap 存在於交換分區的數據大小(若是物理內存有限,可能存在一部分在主存一部分在交換分區)
Pss是平攤計算後的使用內存(有些內存會和其餘進程共享,例如mmap進來的)
經過 cat /proc/$(pid)/smaps 能查看全部進程的使用狀況,若你想要查看某個進程所使用的swap只須要,
awk '/^Swap:/ {SWAP+=$2}END{print SWAP" KB"}' /proc/$(pid)/smaps
5. shell 腳本統計
#!/bin/bash # 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
效果:
[root@localhost ~]# sh getswap.sh PID=1 - Swap used: 76 - (init ) PID=2 - Swap used: 0 - (migration/0 ) PID=3 - Swap used: 0 - (ksoftirqd/0 ) PID=4 - Swap used: 0 - (events/0 ) PID=5 - Swap used: 0 - (khelper ) PID=7 - Swap used: 0 - (kthread ) PID=11 - Swap used: 0 - (kblockd/0 ) PID=12 - Swap used: 0 - (kacpid ) PID=177 - Swap used: 0 - (cqueue/0 ) PID=180 - Swap used: 0 - (khubd ) PID=182 - Swap used: 0 - (kseriod ) PID=250 - Swap used: 0 - (khungtaskd ) PID=251 - Swap used: 0 - (pdflush ) PID=252 - Swap used: 0 - (pdflush ) PID=253 - Swap used: 0 - (kswapd0 ) PID=254 - Swap used: 0 - (aio/0 ) PID=460 - Swap used: 0 - (kpsmoused ) PID=490 - Swap used: 0 - (mpt_poll_0 ) PID=491 - Swap used: 0 - (mpt/0 ) PID=492 - Swap used: 0 - (scsi_eh_0 ) PID=495 - Swap used: 0 - (ata/0 ) PID=496 - Swap used: 0 - (ata_aux ) PID=503 - Swap used: 0 - (kstriped ) PID=512 - Swap used: 0 - (kjournald ) PID=537 - Swap used: 0 - (kauditd ) PID=570 - Swap used: 460 - (udevd ) PID=1827 - Swap used: 0 - (kmpathd/0 ) PID=1828 - Swap used: 0 - (kmpath_handlerd ) PID=1889 - Swap used: 0 - (kjournald ) PID=1891 - Swap used: 0 - (kjournald ) PID=2361 - Swap used: 512 - (dhclient ) PID=2420 - Swap used: 228 - (auditd ) PID=2422 - Swap used: 128 - (audispd ) PID=2452 - Swap used: 16 - (syslogd ) PID=2456 - Swap used: 84 - (klogd ) PID=2535 - Swap used: 120 - (portmap ) PID=2565 - Swap used: 0 - (rpciod/0 ) PID=2571 - Swap used: 140 - (rpc.statd ) PID=2603 - Swap used: 464 - (rpc.idmapd ) PID=2626 - Swap used: 368 - (dbus-daemon ) PID=2639 - Swap used: 128 - (hcid ) PID=2643 - Swap used: 100 - (sdpd ) PID=2664 - Swap used: 0 - (krfcommd ) PID=2707 - Swap used: 656 - (pcscd ) PID=2721 - Swap used: 104 - (acpid ) PID=2735 - Swap used: 2196 - (hald ) PID=2736 - Swap used: 184 - (hald-runner ) PID=2745 - Swap used: 112 - (hald-addon-acpi ) PID=2756 - Swap used: 116 - (hald-addon-keyb ) PID=2765 - Swap used: 84 - (hald-addon-stor ) PID=2789 - Swap used: 104 - (hidd ) PID=2813 - Swap used: 260 - (automount ) PID=2849 - Swap used: 564 - (sshd ) PID=2862 - Swap used: 768 - (cupsd ) PID=2906 - Swap used: 1108 - (sendmail ) PID=2914 - Swap used: 1144 - (sendmail ) PID=2928 - Swap used: 80 - (gpm ) PID=2941 - Swap used: 508 - (crond ) PID=2964 - Swap used: 276 - (xfs ) PID=2989 - Swap used: 104 - (atd ) PID=3015 - Swap used: 80 - (avahi-daemon ) PID=3016 - Swap used: 156 - (avahi-daemon ) PID=3044 - Swap used: 200 - (smartd ) PID=3047 - Swap used: 320 - (login ) PID=3048 - Swap used: 68 - (mingetty ) PID=3049 - Swap used: 72 - (mingetty ) PID=3050 - Swap used: 68 - (mingetty ) PID=3051 - Swap used: 68 - (mingetty ) PID=3052 - Swap used: 72 - (mingetty ) PID=3103 - Swap used: 15148 - (yum-updatesd ) PID=3105 - Swap used: 160 - (gam_server ) PID=3106 - Swap used: 416 - (bash ) PID=3215 - Swap used: 728 - (sshd ) PID=3217 - Swap used: 356 - (bash ) PID=3249 - Swap used: 728 - (sshd ) PID=3251 - Swap used: 356 - (bash ) PID=3280 - Swap used: 616 - (sshd ) PID=3282 - Swap used: 140 - (bash ) PID=11634 - Swap used: 0 - (sh ) PID=11635 - Swap used: 0 - ( ) PID=11636 - Swap used: 0 - ( ) PID=11637 - Swap used: 0 - ( ) Overall swap used: 30944
單位是KB,好了,完成所有測試!^_^ ……