iostatios
iostat主要用於監控系統設備的IO負載狀況、IO統計工具,iostat首次運行時顯示自系統啓動開始的各項統計信息,以後運行iostat將顯示自上次運行該命令之後的統計信息。用戶能夠經過指定統計的次數和時間來得到所需的統計信息。express
[root@localhost app]# yum list|grep iostat pcp-import-iostat2pcp.x86_64 3.11.8-7.el7 base [root@localhost app]# yum -y install pcp-import-iostat2pcp [root@localhost app]# iostat Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 10/24/2017 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.44 0.00 0.30 0.04 0.00 99.22 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.43 9.55 14.19 737417 1095615 scd0 0.00 0.00 0.00 44 0 [root@localhost app]#
各個輸出項目的含義以下:緩存
avg-cpu段:整體cpu使用狀況統計信息,對於多核cpu,這裏爲全部cpu的平均值bash
%user: 在用戶級別運行所使用的CPU的百分比.服務器
%nice: nice操做所使用的CPU的百分比.併發
%sys: 在系統級別(kernel)運行所使用CPU的百分比.app
%iowait: CPU等待硬件I/O時,所佔用CPU百分比.它指示cpu用於等待io請求完成的時間,主要看iowait的值。%iowait並不能反應磁盤瓶頸,iowait實際測量的是cpu時間: %iowait = (cpu idle time)/(all cpu time)dom
%idle: CPU空閒時間的百分比.小於70% IO壓力就較大了,通常讀取速度有較多的wait。ide
Device段:各磁盤設備的IO統計信息函數
tps:每秒進程下發的IO讀、寫請求數量,該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。"一次傳輸"意思是"一次I/O請求"。多個邏輯請求可能會被合併爲"一次I/O請求"。"一次傳輸"請求的大小是未知的。
kB_read/s:每秒從設備(drive expressed)讀取的block數據量(一扇區爲512bytes),單位爲K;
kB_wrtn/s:每秒向設備(drive expressed)寫入的block數據量,單位爲K;
kB_read:讀取的block總數據量,單位爲K;
kB_wrtn:寫入的block總數量數據量,單位爲K。
語法
iostat [options] [interval [count]]
參數
-d [facility]表示,顯示設備(磁盤)使用狀態,默認監控全部的硬盤設備,能夠指定某一設備,如-d sda。;
-k某些使用block爲單位的列強制使用Kilobytes爲單位,默認單位塊
-m 某些使用block爲單位的列強制使用MB爲單位,默認單位塊
[root@localhost app]# iostat -d -k 1 3 #沒1秒一次 刷新3次磁盤的使用狀態 Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 10/25/2017 _x86_64(1 CPU) Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn fd0 0.00 0.00 0.00 4 0 sda 0.26 4.66 7.25 746585 1161425 scd0 0.00 0.00 0.00 44 0 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn fd0 0.00 0.00 0.00 0 0 sda 0.00 0.00 0.00 0 0 scd0 0.00 0.00 0.00 0 0 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn fd0 0.00 0.00 0.00 0 0 sda 0.00 0.00 0.00 0 0 scd0 0.00 0.00 0.00 0 0 [root@localhost app]# iostat -d -k 1 Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 10/25/2017 _x86_64(1 CPU) Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn fd0 0.00 0.00 0.00 4 0 sda 0.26 4.66 7.25 746585 1161490 scd0 0.00 0.00 0.00 44 0 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn fd0 0.00 0.00 0.00 0 0 sda 0.00 0.00 0.00 0 0 scd0 0.00 0.00 0.00 0 0 ^C [root@localhost app]# iostat -d sda 1 4 Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 10/25/2017 _x86_64(1 CPU) Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.26 4.66 7.25 746585 1161502 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 1.01 0.00 1.01 0 1 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.00 0.00 0.00 0 0 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.00 0.00 0.00 0 0 [root@localhost app]#
-x 顯示和io相關的擴展數據
[root@localhost app]# iostat -d sda -x -k 1 1 Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 10/25/2017 _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 sda 0.02 0.11 0.12 0.14 0 4.62 7.19 90.47 0.01 26.45 11.86 38.50 2.43 0.06 [root@localhost ~]# iostat -x Linux 3.10.0-327.el7.x86_64 (localhost.localdomain) 01/09/2018 _x86_64_ (8 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.06 0.00 0.02 0.00 0.00 99.92 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.00 0.00 0.00 0.19 0.20 1.72 19.47 0.00 0.42 2.51 0.36 0.37 0.01 [root@localhost ~]#
rrqm/s:每秒這個設備相關的讀取請求有多少被Merge了(當系統調用須要讀取數據的時候,VFS將請求發到各個FS,若是FS發現不一樣的讀取請求讀取的是相同Block的數據,FS會將這個請求合併Merge);
wrqm/s:每秒這個設備相關的寫入請求有多少被Merge了。
rsec/s:每秒讀取的扇區數;
wsec/:每秒寫入的扇區數。
rKB/s:The number of read requests that were issued to the device per second,單位爲K;
wKB/s:The number of write requests that were issued to the device per second,單位爲K;
r/s 和 w/s 分別是每秒的讀操做和寫操做,而rKB/s 和wKB/s 列以每秒千字節爲單位顯示了讀和寫的數據量 若是這兩對數據值都很高的話說明磁盤io操做是很頻繁。
avgrq-sz 平均請求扇區的大小,單位是扇區
avgqu-sz 是平均請求隊列的長度。毫無疑問,隊列長度越短越好。
await: 每個IO請求的處理的平均時間(單位是毫秒),這裏能夠理解爲IO的響應時間,通常地系統IO響應時間應該低於5ms,若是大於10ms就比較大了。
這個時間包括了隊列時間和服務時間,也就是說,通常狀況下,await大於svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。
svctm 表示平均每次設備I/O操做的服務時間(以毫秒爲單位)。若是svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,若是await的值遠高於svctm的值,則表示I/O隊列等待太長, 系統上運行的應用程序將變慢。svctm一項正常時間在20ms左右(一次讀寫就是一次尋到+一次旋轉延遲+數據傳輸的時間。因爲,現代硬盤數據傳輸就是幾微秒或者幾十微秒的事情,遠遠小於尋道時間2~20ms和旋轉延遲4~8ms,因此只計算這兩個時間就差很少了,也就是15~20ms。只要大於20ms,就必須考慮是否交給磁盤讀寫的次數太多,致使磁盤性能下降了)
正常狀況下svctm應該是小於await值的,而svctm的大小和磁盤性能有關,CPU、內存的負荷也會對svctm值形成影響,過多的請求也會間接的致使svctm值的增長。
await值的大小通常取決與svctm的值和I/O隊列長度以及I/O請求模式,若是svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,若是await的值遠高於svctm的值,則表示I/O隊列等待太長,系統上運行的應用程序將變慢,此時能夠經過更換更快的硬盤來解決問題。
%util: 在統計時間內全部處理IO時間,除以總共統計時間,util = (r/s+w/s) * (svctm/1000),util=(0.12+0.14)*(2.43/1000)=0.0006318,因此該參數暗示了設備的繁忙程度,即一秒中有百分之多少的時間用於 I/O 操做,或者說一秒中有多少時間 I/O 隊列是非空的
。通常地,若是該參數是100%表示設備已經接近滿負荷運行了(固然若是是多磁盤,即便%util是100%,由於磁盤的併發能力,因此磁盤使用未必就到了瓶頸)。
若是 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。 idle小於70% IO壓力就較大了,通常讀取速度有較多的wait.
-p device | ALL
與-x選項互斥,用於顯示塊設備及系統分區的統計信息.也能夠在-p後指定一個設備名,如:
# iostat -p hda
或顯示全部設備
# iostat -p ALL
-c 獲取cpu部分狀態值
-t 在輸出數據時,打印蒐集數據的時間.
-V 打印版本號和幫助信息.
top 命令
Tasks:
total 進程總數
running 正在運行的進程數
sleeping 睡眠的進程數
stopped 中止的進程數
zombie 殭屍進程數
Cpu(s):
us 用戶空間佔用CPU百分比
sy 內核空間佔用CPU百分比
ni 用戶進程空間內改變過優先級的進程佔用CPU百分比
id 空閒CPU百分比
wa 等待輸入輸出的CPU時間百分比
wa 的百分比能夠大體的體現出當前的磁盤io請求是否頻繁。若是 wa的數量比較大,說明等待輸入輸出的的io比較多。
vmstat
vmstat 命令報告關於線程、虛擬內存、磁盤、陷阱和 CPU 活動的統計信息。由 vmstat 命令生成的報告能夠用於平衡系統負載活動。系統範圍內的這些統計信息(全部的處理器中)都計算出以百分比表示的平均值,或者計算其總和。
格式: vmstat [-V] [-n] [-S unit] [delay [count]]
參數解釋:
-V:顯示vmstat版本信息
-n:只在開始時顯示一次各字段名稱
-a:顯示活躍和非活躍內存
-d:顯示各個磁盤相關統計信息
-D:顯示磁盤整體信息
-p:顯示指定磁盤分區統計信息
-s:顯示內存相關統計信息及多種系統活動數量
-m:顯示slabinfo
-t:在輸出信息的時候也將時間一併輸出出來
-S:使用指定單位顯示。參數有k、K、m、M,分別表明1000、102四、1000000、1048576字節(byte)。默認單位爲K(1024bytes)
delay:刷新時間間隔。若是不指定,只顯示一條結果
count:刷新次數。若是不指定刷新次數,但指定了刷新時間間隔,這時刷新次數爲無窮
r 表示運行隊列(就是說多少個進程真的分配到CPU),當這個值超過了CPU數目,就會出現CPU瓶頸了。
b 表示阻塞的進程,在等待資源的進程數,好比正在等待I/O或者內存交換等。
swpd 虛擬內存已使用的大小(單位KB),
free 空閒的物理內存的大小(單位KB),
buff Linux/Unix系統是用來存儲(單位KB)目錄裏面有什麼內容,權限等的緩存,
cache cache直接用來記憶咱們打開的文件,給文件作緩衝,把空閒的物理內存的一部分拿來作文件和目錄的緩存,是爲了提升程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)
si 每秒從磁盤讀入虛擬內存的大小(單位:KB/秒),若是這個值大於0,表示物理內存不夠用或者內存泄露了,要查找耗內存進程解決掉。個人機器內存充裕,一切正常。
so 每秒虛擬內存寫入磁盤的大小(單位:KB/秒),若是這個值大於0,同上。
bi 塊設備每秒接收的塊數量,單位kb/s,這裏的塊設備是指系統上全部的磁盤和其餘塊設備,默認塊大小是1024byte,
bo 塊設備每秒發送的塊數量,單位kb/s,例如咱們讀取文件,bo就要大於0。bi和bo通常都要接近0,否則就是IO過於頻繁,須要調整。
注意:若是bi+bo的值過大,且wa值較大,則表示系統磁盤IO瓶頸
in 每秒CPU的中斷次數,包括時間中斷
cs 每秒上下文切換次數,例如咱們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,上下文切換次數過多表示你的CPU大部分浪費在上下文切換,致使CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。
us 用戶CPU時間
sy 系統CPU時間,若是過高,表示系統調用時間長,例如是IO操做頻繁。
id 空閒 CPU時間,通常來講,id + us + sy = 100,通常我認爲id是空閒CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。
wa:表示IO等待所佔用的CPU時間百分比,wa值越高,說明I/O等待越嚴重,根據經驗wa的參考值爲20%,若是超過20%,說明I/O等待嚴重,引發I/O等待的緣由多是磁盤大量隨機讀寫形成的,也多是磁盤或者監控器的貸款瓶頸(主要是塊操做)形成的
iotop
用來監視磁盤I/O使用情況的top類工具,IO統計工具如iostat,nmon等大多數是隻能統計到per設備的讀寫狀況,使用iotop命令能夠很方便的查看每一個進程是如何使用IO的。otop使用Python語言編寫而成,要求Python2.5(及以上版本)和Linux kernel2.6.20(及以上版本);
通常排查系統IO性能時,先使用iostat查看系統IO是否有延遲,若是有延遲能夠經過iotop來查看是哪一個進程佔用了IO
yum install iotop
iotop(選項)
--version #顯示版本號
-h, --help #顯示幫助信息
-o, --only #顯示進程或者線程實際上正在作的I/O,而不是所有的,能夠隨時切換按o
-b, --batch #運行在非交互式的模式
-n NUM, --iter=NUM #在非交互式模式下,設置顯示的次數,
-d SEC, --delay=SEC #設置顯示的間隔秒數,支持非整數值
-p PID, --pid=PID #只顯示指定PID的信息
-u USER, --user=USER #顯示指定的用戶的進程的信息
-P, --processes #只顯示進程,通常爲顯示全部的線程
-a, --accumulated #顯示從iotop啓動後每一個線程完成了的IO總數
-k, --kilobytes #以千字節顯示
-t, --time #在每一行前添加一個當前的時間
-q, --quie
快捷鍵:
左右箭頭:改變排序方式,默認是按IO排序。
r:改變排序順序。
o:只顯示有IO輸出的進程。
p:進程/線程的顯示方式的切換。
a:顯示累積使用量。
q:退出。
服務器的IO負載很高(iostat中的util)