Linux 內存監控
1、按照內存使用方式排序
top 之后使用 shift + m 那么top按照內存使用從大到小進行排列,使用 shift + P 表示按照CPU進行排序。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29498 bigfish 20 0 1118m 438m 30m S 1 11.3 81:59.96 eclipse
27772 bigfish 20 0 1706m 216m 61m S 3 5.6 79:18.04 QQ.exe
29369 bigfish 20 0 610m 138m 44m S 1 3.6 25:19.26 maxthon
PR :進程優先級
NI :進程當前nice調整值
VIRT : 進程使用的虛擬內存數
RES : 進程使用的物理內存
SHR : 允許與其他進程共享的內存數(比如一些動態庫)
TIME+ : CPU時間
2、top查看指定進程
top -p pid -d 1 使用-p選項指定pid,使用-d表示刷新間隔
3、pamp查看指定進程
pmap會將進程中使用到的每個動態庫等內存依次顯示,最有有一個total表示使用的虛擬內存總數。
看不到物理內存使用數。
pmap 7385 |grep total total 1228664K
4、使用ps查看指定進程
ps aux|grep java|grep UID
bigfish 7385 0.0 0.0 1228668 1164 ? Sl Nov07 11:23 java -jar rateHis.jar
12286681164 分別表示虛擬內存與物理內存占用的KB數
5、查看/proc/pid/status查看指定進程
cat /proc/7385/status VmSize: 1228668 kB --使用的虛擬內存 VmRSS: 1164 kB --使用的物理內存
6、查看系統內存使用
1)cat /proc/meminfo
2)使用top -d 1 每秒鍾刷新一次
3)sar -r 1 每秒鍾刷新一次
4)vmstat 1 每秒鍾刷新一次
5)free 命令
關於內存監控
7、內存使用 sar -r 1
16時20分55秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact 16時20分56秒 245924 3731788 93.82 145188 1704968 5485052 68.77 2227000 1235488 16時20分57秒 244684 3733028 93.85 145192 1706004 5485948 68.78 2227236 1236156 16時20分58秒 244312 3733400 93.86 145196 1706344 5486204 68.78 2227420 1236404 16時20分59秒 241708 3736004 93.92 145196 1706528 5488516 68.81 2229992 1236508
kbmemfree 空閑內存 kbmemused 已使用內存(包括了buffer與cached的內存),因此該值並非真實用戶進程使用的內存數,需要減去buffer和cached %memused 內存使用率 kbbuffers 內核使用的buffer kbcached 內核使用的cached
1)已使用內存數:特別要注意的是這個值包括了內核cached的值,並非真實用戶進程使用掉的。
可以通過如下方式釋放這部分內存:首先執行sync讓系統將緩存數據同步到磁盤之中;然后 echo 3 > /proc/sys/vm/drop_caches 修改dropcaches的值。通過修改proc目錄下的文件可以實現與系統進行通信,drop_caches文件取值,1-釋放頁面緩存;2-釋放目錄項和文件節點;3-釋放前兩項。pagecaches表示內核最近訪問過的文件頁面緩存。
參考自:http://os.51cto.com/art/201003/186885.htm
8、系統交換活動監控 sar -W 1
-W表示swaping活動統計
16時56分23秒 pswpin/s pswpout/s 16時56分26秒 0.00 0.00 16時56分27秒 0.00 0.00 16時56分28秒 0.00 0.00 16時56分29秒 0.00 39.00 16時56分30秒 0.00 0.00
pswpin/s:每秒系統換入的交換頁面(swap page)數量 pswpout/s:每秒系統換出的交換頁面(swap page)數量
說明:對swap分區的使用無疑是非常耗時的,預示着物理內存是不是不夠用了。
9、內存分頁監控 sar -B 1
還可以使用命令:vmstat
16時49分21秒 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 16時49分22秒 0.00 0.00 1143.00 0.00 328.00 0.00 0.00 0.00 0.00 16時49分23秒 0.00 16.00 1201.00 0.00 440.00 0.00 0.00 0.00 0.00 16時49分24秒 0.00 0.00 1553.00 0.00 576.00 0.00 0.00 0.00 0.00
pgpgin/s:表示每秒從磁盤或SWAP置換到內存的字節數(KB),vmstat中為si pgpgout/s:表示每秒從內存置換到磁盤或SWAP的字節數(KB), vmstat中為so fault/s:每秒鍾系統產生的缺頁數,即主缺頁與次缺頁之和(major + minor) majflt/s:每秒鍾產生的主缺頁數. pgfree/s:每秒被放入空閑隊列中的頁個數 pgscank/s:每秒被kswapd掃描的頁個數 pgscand/s:每秒直接被掃描的頁個數 pgsteal/s:每秒鍾從cache中被清除來滿足內存需要的頁個數 %vmeff:每秒清除的頁(pgsteal)占總掃描頁(pgscank+pgscand)的百分比
說明:LInux的內存管理使用主要是通過“調頁Paging”和“交換Swapping”來完成內存調度。分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到內存的過程被稱作Page-In。當內核需要一個分頁時,但發現此分頁不在物理內存中(因為已經被Page-Out了),此時就發生了分頁錯誤(Page Fault)。當發生頻繁的內存頁換入換出時性能會受到嚴重影響,此時成為thrashing(顛簸)。
執行:vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 2 0 213712 496692 100760 1539336 0 0 15 5 3 11 19 9 71 2 2 1 213712 490608 100764 1545548 0 0 0 84 883 7062 8 5 87 0 1 1 213712 488996 100772 1545872 0 0 0 52 1079 8181 9 7 83 1
si 每秒從交換區讀入到內存的次數
so 每秒從內存寫入到交換區的次數
bi 每秒讀取的塊數(塊大小512字節)
bo 每秒寫入的塊數(塊大小為512字節)
in 每秒中斷數,包括時鍾中斷
cs 每秒上下文卻換數
wa 表示cpu處於IOwait的時間
附注:
1、關於cached的解釋
Mem: 7742060k total, 7597916k used, 144144k free, 3000k buffers Swap: 0k total, 0k used, 0k free, 5924580k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9025 root 20 0 137g 2.9g 2.5g S 4.0 39.6 288:40.70 mongod 9037 root 20 0 129g 2.2g 1.8g S 10.0 29.2 242:45.04 mongod
上面數據是一台運行mongodb的服務器,總共8GB內存,其中有6GB的cached,並且swap分區使用為0.
但是從每個mongod占用的物理內存看,已經達到了5GB,那么6GB的cached哪里來呢?
可能的解釋:mongod申請的內存,還沒有使用,依然以cached的形式存在着。