vmstat
可以用來監控虛擬記憶體。可對作業系統的虛擬記憶體、IO、CPU等多個指標的整體情況進行監視。
Linux系統的記憶體分為實體記憶體和虛擬記憶體兩種。實體記憶體是真實的,也就是實體記憶體條上的記憶體。而虛擬記憶體則是採用硬碟空間補充實體記憶體,將暫時不使用的記憶體頁寫到硬碟上以騰出更多的實體記憶體讓有需要的程式使用。當這些已被騰出的記憶體頁需要再次使用時才從硬碟(虛擬記憶體)中讀回記憶體。這一切對於使用者來說是透明的。通常對Linux系統來說,虛擬記憶體就是swap分割槽。
hello@ubuntu:~$ vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 10336 287032 16856 266904 0 9 556 278 155 452 15 4 79 2 0
記憶體方面:
swpd:已經使用的交換記憶體(kb)
free:空閒的實體記憶體(kb)
buff:用作緩衝區的記憶體數(kb)
cache:用作快取記憶體的記憶體數(kb)
si、so 兩列,表示磁碟和記憶體之間交換的頻繁程度。
分析思路:
如果 si、so 數值長期很大並且free長期很小,表示實體記憶體不能滿足需要,也就是記憶體不足。由於磁碟的效能比記憶體是慢很多的,所以如果存在大量的頁面交換,那麼系統的效能必然會受到很大影響。
CPU方面:
r:展示了正在執行和等待cpu資源的任務個數。當這個值超過了cpu個數,就會出現cpu瓶頸。
us:使用者CPU時間。
sy:系統CPU時間。
id:空閒CPU時間。
wa:等等I/O CPU時間。
us+sy+id+wa=100%
分析思路:
如果 r 經常大於4,且id經常小於40,表面CPU的負荷很重。
free
可以用來觀察記憶體使用情況。
hello@ubuntu:~$ free total used free shared buffers cached Mem: 1024708 735760 288948 3712 43352 291540 -/+ buffers/cache: 400868 623840 Swap: 1046524 0 1046524
total= used + free
分析思路:
當 –/+ buffers/cache中的free長時間接近0,且 swap used長時間比較大時,說明實體記憶體已經不夠用了,需要升級記憶體或降低記憶體的使用量。
pmap
格式 pmap pid
會詳細顯示該程式所用的記憶體情況。
iostat
可以用來監控磁碟I/O的情況。
hello@ubuntu:~$ iostat Linux 3.19.0-25-generic (ubuntu) 01/12/2017 _i686_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 5.02 5.66 4.47 1.92 0.00 82.94 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 35.98 599.77 179.38 644419 192732
顯示結果為從系統開機到當前執行時刻的統計資訊。
第一行顯示系統版本、主機名、日期等資訊。
avg-cpu:顯示總體CPU使用情況統計資訊。如果是多核CPU的話,這裡取平均值。
Device: 顯示各磁碟裝置的IO統計資訊。
主要關注點:
avg-cpu 的 %iowait:表明CPU用於等待I/O請求完成的時間。
Device 的 tps:每秒程式下發的I/O讀寫請求數量。
hello@ubuntu:~$ iostat -x Linux 3.19.0-25-generic (ubuntu) 01/12/2017 _i686_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 5.51 1.66 5.25 1.89 0.00 85.69 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.20 10.88 31.60 4.14 660.97 131.62 44.36 0.44 12.45 7.26 52.10 1.94 6.95
顯示和I/O相關的更詳細的資料。
主要關注點:
avgqu-sz:是平均請求佇列的長度。毫無疑問,佇列長度越短越好。
await: 每一個IO請求的處理的平均時間(單位是微秒毫秒)。這裡可以理解為IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。這個時間包括了佇列時間和服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明佇列時間越短,反之差值越大,佇列時間越長,說明系統出了問題。
svctm 表示平均每次裝置I/O操作的服務時間(以毫秒為單位)。如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁碟效能很好,如果await的值遠高於svctm的值,則表示I/O佇列等待太長, 系統上執行的應用程式將變慢。
%util:在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該裝置有0.8秒在處理IO,而0.2秒閒置,那麼該裝置的%util = 0.8/1 = 80%,所以該引數暗示了裝置的繁忙程度。一般地,如果該引數是100%表示裝置已經接近滿負荷執行了(當然如果是多磁碟,即使%util是100%,因為磁碟的併發能力,所以磁碟使用未必就到了瓶頸)。
分析思路:
如果%util值長期處於100%左右,並且avgqu-sz的值比較大,同時await的值遠大於svctm,可以認為磁碟的處理能力不夠。
如果只有一個指標持續走高,需要結合mem指標來看,是否是由於記憶體空間不夠導致磁碟的使用增加。
mpstate
Multiprocessor Statistics的縮寫。在多CPU的系統裡,可以檢視所有CPU的資訊。
hello@ubuntu:~$ mpstat Linux 3.19.0-25-generic (ubuntu) 01/12/2017 _i686_ (1 CPU) 02:25:11 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 02:25:11 PM all 1.20 0.03 0.60 0.05 0.00 0.00 0.00 0.00 0.00 98.12
雖然vmstat、iostat以及 top 也可以檢視CPU資訊,但是它們都是顯示平均數,並不會顯示每個CPU的情況。
top
可以實時顯示系統中各個程式的佔用情況。
top - 11:09:48 up 6 min, 2 users, load average: 0.09, 0.38, 0.24 Tasks: 213 total, 1 running, 212 sleeping, 0 stopped, 0 zombie %Cpu(s): 6.4 us, 6.9 sy, 1.0 ni, 84.5 id, 1.3 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 1024708 total, 724056 used, 300652 free, 43336 buffers KiB Swap: 1046524 total, 0 used, 1046524 free. 291540 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1062 root 20 0 42800 6268 5656 S 6.3 0.6 0:00.66 vmtoolsd 1359 root 20 0 152696 38144 18172 S 6.3 3.7 0:04.40 Xorg 2621 root 20 0 127824 27712 23344 S 6.3 2.7 0:01.52 gnome-termi+ 1 root 20 0 4472 3664 2576 S 0.0 0.4 0:03.98 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.12 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
上部分列出了系統整體的統計資訊:任務、CPU、記憶體、交換區等資訊。
下部分列出了程式的詳細情況。
uptime
可以檢視系統負載。顯示的和top命令第一行一樣。
hello@ubuntu:~$ uptime 14:54:25 up 3:36, 2 users, load average: 0.00, 0.01, 0.05
當前時間 14:54:25
系統已執行時間 3:36
當前線上使用者 2個
平均負載:一定時間內CPU任務佇列的平均長度,是在一段時間內CPU正在處理以及等待CPU處理的程式數之和的統計資訊。上面3個數分別是“最近一分鐘系統的負載(0.00)、最近5分鐘系統的負載(0.01)、最近15分鐘系統的負載(0.05)”
分析思路:
如果load average指標的5分鐘以及15分鐘的值長 大於 CPU個數*CPU核數*0.7,並且us長時間比較高,說明CPU不夠用,需要升級CPU或調整程式的演算法降低CPU的使用率。
ps
顯示10個消耗CPU最多的程式:
ps aux|sort -rnk +3|head -10
顯示10個消耗記憶體最多的程式:
ps aux|sort -rnk +4|head -10
netstat
可以顯示各種網路相關資訊,比如各個連線的型別、狀態等。
hello@ubuntu:~$ netstat Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp6 1 0 ip6-localhost:57202 ip6-localhost:ipp CLOSE_WAIT Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node Path unix 22 [ ] DGRAM 9729 /dev/log unix 3 [ ] STREAM CONNECTED 15455 unix 3 [ ] STREAM CONNECTED 15033 @/tmp/dbus-EgyAIj0Ftz unix 3 [ ] STREAM CONNECTED 16260 unix 3 [ ] STREAM CONNECTED 13897 unix 3 [ ] STREAM CONNECTED 15077 /var/run/dbus/system_bus_socket
比如顯示所有狀態為“TIME_WAIT”的連線:
hello@ubuntu:~$ netstat -ae|grep "TIME_WAIT"
備註
實時監控時,可以用watch命令。
watch可以幫你監測一個命令的執行結果,省得你一遍遍的手動執行。在Linux下,watch是週期性的執行下個程式,並全屏顯示執行結果。你可以拿他來監測你想要的一切命令的結果變化。
比如實時顯示網路流量:
hello@ubuntu:~$ watch -n 1 "/sbin/ifconfig eth0|grep bytes"