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"