本博文主要講解Linux對硬件和軟件資源的監控命令,包括:
- 查看cpu、內存、上下文、vm狀態的
vmstat
、top(類似msgtask)和簡單的free; - IO相關信息
iostat -dx x y
; - 查看網絡連接的
netstat
、網絡IO流量概覽的nload
和每個套接字IO流量的iftop
1. vmstat
和其他服務器資源管理命令
vmstat
是virtual memory status的縮寫,即虛擬內存狀態。可以用來監控CUP、虛擬內存、IO等多個服務器指標。
1.1 基本使用方式
vm有兩個參數:
vmstat x y
- x、y為兩個整數,前者表示采樣的時間間隔數,后者表示采樣次數——省略一個參數表示一直采樣直至手動停止,省略兩個參數表示查看機器啟動以來的各指標平均值(第一行打印系統啟動以來的平均值)。
1.2 參數解釋
一次采樣vmstat
:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 1502252 18464 261972 0 0 70 11 158 391 4 0 95 0 0
使用man vmstat
可以查看vmstat參數說明和打印詳解:
進程相關:
- r:可運行的進程數目,包括running、或者等待時間片的進程;
- b:處於阻塞狀態(in uninterruptible sleep不可中斷休眠)的進程數,通常指等待IO,比如磁盤、網絡、輸入。
內存相關:
- swpd:使用的虛擬內存容量,單位字節;
- free:空閑的內存容量;
- buff:作為緩沖buffers的內存容量;
- cache:作為操作系統緩存cache的內存容量;
- inact/active(-a):活躍和不活躍的內存容量;
頁面調度相關swap(以下參數每秒不要超過10):
- si(swap in):每秒內存從磁盤寫入的塊數;
- so(swap out):每秒內存寫出到磁盤的塊數;
IO相關:
- bi(block in):每秒從塊設備(磁盤和其他)獲取的塊數;
- bo:每秒從塊設備獲取的塊數。
- 主存和磁盤以塊為單位傳送數據。
系統相關:
- in:The number of interrupts per second, including the clock;
- cs(context swiches):每秒鍾上下文切換的次數,cs次數太多是需要考慮調整程序線程數量;
cup相關:五種操作對CPU時間的占比
- us(user time):cpu運行非內核代碼的時間;
- sy(system time):cpu運行內核代碼的時間;
- id(idle time):空閑時間,包括IO等待時間;
- wa:等待IO的時間;
- st:time stolen from a virtual machine.位置消耗時間。
1.3 分析思路(注意事項、未實戰,純猜想:
以上重點參數已經加粗:
如果b一直不為0可以考慮是否存在死鎖。
r表示使用和等待cup資源的進程個數,如果超過了cpu核數很多,就可能頻繁的引起上下文切換,表現為cs很大。
如果si、so很大、free很小,可能主存性能滿足不了現在工作,導致頻繁的磁盤IO甚至抖動。
1.4 實例解析
-
當上傳文件並放入到本地磁盤時,bo突然很大:
-
當使用vim將本地磁盤數據讀入到內存中時,bi突然變大:
1.procs ---------2.memory--------- ---3.swap-------4.io---- -5.system--------6.cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1458020 22500 295004 0 0 1388 0 186 456 4 1 93 2 0
- 當開啟爬蟲程序,需要從網絡讀取數據,並寫入磁盤數據庫時,各參數變化如下:
- 從網絡設備讀取數據時bi變大;
- 當寫入數據到數據庫時bo變大;
- 開啟了十幾個線程因此需要頻繁的上下文切換;
- 用戶程序使用cup時間us經常在90%以;
- 等待IO時間占比wa也變得不穩定。
雖然沒有換入換出si/so的例子,但是應當知道這是vmstat
最終要的參數,當這兩個參數太大時應該考慮優化程序的實現和升級內存容量。
1.5 cup密集型機器和IO密集型機器
cup密集型服務器vmstat
的us
輸出通常是一個很高的值,即cup花費在非內核代碼上的cup時間占比應該很高。
cup密集型服務器上下文切換次數警告閾值是10萬/s(具體情況看機器?)。
IO密集型服務器cup會花費大量時間等待IO請求完成,則意味着很多任務處於非中斷休眠狀態(b
列),並且wa
數字也很高(等待IO時間)。
1.6 其他
top命令可以查看動態刷新的各個進程的cup和內存使用率,以及執行的命令和命令執行的用戶和PID(進程ID),界面類似於windows的任務管理器:
free命令,界面如下:
root@iZwz94idfw2r7h2hnepjZ:~# free
total used free shared buff/cache available
Mem: 2048212 587876 981736 5264 478600 1301432
Swap: 0 0 0
2.IO相關信息統計
2.1 iostat -dx a b
設備和分區的IO統計信息和cup統計信息。參數d x
分別表示顯示設備使用狀態和輸出更多信息。a和b分別表示采樣時間間隔和采樣次數,同vmstat,第一次輸出也是系統啟動以來的平均值:iostat -dx
:爬蟲程序啟動后的變化值:
root@iZwz94iww8uynepjZ:~# iostat -dx 3
Linux 4.4.0-63-generic (iZwz94iww8uynepjZ) 05/04/2018 _x86_64_ (1 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 0.33 0.00 5.33 32.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 7.33 0.00 1.33 0.00 37.33 56.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 4.00 0.00 10.00 0.00 57.33 11.47 0.01 0.80 0.00 0.80 0.80 0.80
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 28.52 0.00 87.25 0.00 1268.46 29.08 0.18 2.08 0.00 2.08 1.66 14.50
- 可以看到爬蟲程序啟動后因為要向數據庫寫入數據,相關指數明顯變大;
r/s、w/s
:每秒鍾發送到設備的讀寫請求;avgqu-sz
:在設備隊列中等待的請求數量;await
:磁盤排隊上花費的毫秒數,包括讀和寫;svctm
:服務請求花費的毫秒數,不包括排隊時間。
重要概念:請求服務並發數:
concurrency=(r/s+w/s)*(svctm/1000)
表示在采樣周期內每秒設備處理的請求數。
3. 網絡資源
3.1 netstat
連接詳情
Print network connections, routing tables, interface statistics, masquerade connections, and multicast membership
打印網絡連接、路由表、接口統計、偽裝連接和多播membership。
- a、t、u表示羅列出所有的tcp和udp連接:
root@iZwz94i8afw2r7g62hnepjZ:~# netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:32000 *:* LISTEN
tcp 0 0 *:http-alt *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 172.16.252.71:57346 211.151.27.128:http TIME_WAIT
tcp 0 0 172.16.252.71:57598 211.151.27.128:http TIME_WAIT
tcp 0 0 172.16.252.71:57306 211.151.27.128:http TIME_WAIT
tcp 0 0 172.16.252.71:39240 59.151.32.81:http TIME_WAIT
tcp 0 0 172.16.252.71:39274 59.151.32.81:http TIME_WAIT
tcp 0 0 172.16.252.71:39208 59.151.32.81:http TIME_WAIT
tcp 0 0 172.16.252.71:57480 211.151.27.128:http TIME_WAIT
tcp 0 0 172.16.252.71:39372 59.151.32.81:http TIME_WAIT
tcp 0 0 172.16.252.71:57450 211.151.27.128:http TIME_WAIT
tcp 0 0 172.16.252.71:57482 211.151.27.128:http TIME_WAIT
3.2 輸入輸出流量:nload
、iftop
nload
查看總體的輸入輸出流量,並且可以查看峰值、谷值和平均值,太簡單,如圖開啟爬蟲:
iftop
則可以查看每個套接字的輸出輸出流量:
**以上提到的命令還可以用於數據庫查詢性能分析