常見的io監控工具包括iostat、iotop,這裡從工具的安裝、使用、優缺點進行分析,並給出目前缺少的監控工具 1 iostat 功能:用於報告CPU(中央處理器)統計信息和整個系統、適配器、tty設備、磁碟和CD-ROM的輸入/輸出統計信息;通過觀察設備處於活動狀態的時間(相對於其平均傳輸速率) ...
常見的io監控工具包括iostat、iotop,這裡從工具的安裝、使用、優缺點進行分析,並給出目前缺少的監控工具
1 iostat
- 功能:用於報告CPU(中央處理器)統計信息和整個系統、適配器、tty設備、磁碟和CD-ROM的輸入/輸出統計信息;通過觀察設備處於活動狀態的時間(相對於其平均傳輸速率)來整理實時報告輸出 ,主要用於監視nfs網路文件系統和本地文件系統。
- 參數詳解:
- iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [ ... ] | ALL ] [ -p [ device | ALL ] ] [ interval [ count ] ]
- -c: 僅顯示CPU統計信息.與-d選項互斥.
- -d:僅顯示磁碟統計信息.與-c選項互斥.
- -k:以K為單位顯示每秒的磁碟請求數,預設單位塊.
- -m: 以M為單位顯示每秒的磁碟請求數
- -p:device | ALL,與-x選項互斥,用於顯示塊設備及系統分區的統計信息.也可以在-p後指定一個設備名,如:# iostat -p hda 或顯示所有設備# iostat -p ALL
- -t : 在輸出數據時,列印搜集數據的時間.
- -V: 列印版本號和幫助信息.
- -x : 輸出擴展信息
- 輸出
- 輸出分為avg-cpu段和Device段
- 常用命令
- iostat -xm 1 : 每秒輸出一次cpu&device信息
- iostat -c 1 2 : 每秒輸出一次cpu信息,總共輸出2次
- iostat -d 2 : 間隔2秒輸出一次device信息
- iostat -xm 1 /dev/sdb : 每秒輸出1次sdb的device信息和cpu信息
- iostat -p /dev/sdb -d 1 2 : 每秒輸出一次sdb的分區的設備信息,總共輸出2次
- 註意事項
- util代表磁碟使用率,對於hdd,使用率達到100%代表已經達到磁碟瓶頸,但對於ssd並不代表已經達到瓶頸,因為util是按照(svctm*(r/s+w/s))/1000,對於ssd因為有併發,所以達到100%只能說明單通道達到了100%
- 參考來源:(23條消息) 優化命令iostat詳解_灌南第一帥的博客-CSDN博客_iostat命令詳解參數
2 sar
- 功能:系統維護的重要工具,主要幫助我們掌握系統資源的使用情況,特別是記憶體和CPU 的使用情況,是UNIX系統使用者應該掌握的工具之一
- 參數詳解:
- sar [options] [-A] [-o file] t [n]
- 在命令行中,n 和t 兩個參數組合起來定義採樣間隔和次數,t為採樣間隔,是必須有的參數,n為採樣次數,是可選的,預設值是1,-o file表示將命令結果以二進位格式存放在文件中,file 在此處不是關鍵字,是文件名。options 為命令行選項
- -A:所有報告的總和。
- -u:CPU利用率
- -v:進程、I節點、文件和鎖表狀態。
- -d:硬碟使用報告。
- -r:沒有使用的記憶體頁面和硬碟塊。
- -g:串口I/O的情況。
- -b:緩衝區使用情況。
- -a:文件讀寫情況。
- -c:系統調用情況。
- -R:進程的活動情況。
- -y:終端設備活動情況
- -w:系統交換活動。
- -p: 列印出設備名稱,不加輸出的是設備節點,如dev8-0
- -n: 某個埠設備的網路狀態
- sar -d -v -R
- 輸出:
-
DEV: 網卡/EDEV: 網卡(錯誤)
- NFS/NFSD/SOCK/IP/EIP/ICMP/EICMP/TCP/ETCP/UDP/SOCK6/IP6/EIP6/ICMP6/EICMP6/UDP6
-
- 常用命令:
- sar -d 1 : 間隔1s輸出一次設備情況
- sar -u 1 10 : 間隔1s輸出一次cpu使用情況,總共輸出10次
- sar -d -f /var/log/sa/sa03 -p|grep -E "DEV|sd" : 從文件sa03中過濾出磁碟信息(sa03代表3號,最多保存一個月的日誌)
- sar -r 1 10 -o mem.log : 將記憶體信息每秒列印一次,總共列印10s,並將結果輸出到mem.log中
- sar -v 1 3 : 監控目前系統中的資源使用情況
- 參考鏈接:
3 iotop
- 功能:一個類似 top 的工具,用來顯示實時的磁碟活動。Linux下的IO統計工具如iostat,nmon等大多數是只能統計到per設備的讀寫情況。iotop 監控 Linux 內核輸出的 I/O 使用信息,並且顯示一個系統中進程或線程的當前 I/O 使用情況。它顯示每個進程/線程讀寫 I/O 帶寬。它同樣顯示當等待換入和等待 I/O 的線程/進程花費的時間的百分比。它是一款開源、免費的用來監控磁碟I/O使用狀況的類似top命令的工具,iotop可以監控進程的I/O信息。它是Python語言編寫的,與iostat工具比較,iostat是系統級別的IO監控,而iotop是進程級別IO監控。
- 參數:
- -o:只顯示有io操作的進程
- -b:批量顯示,無交互,主要用作記錄到文件。
- -n NUM:顯示NUM次,主要用於非互動式模式。
- -d SEC:間隔SEC秒顯示一次。
- -p PID:監控的進程pid。
- -u USER:監控的進程用戶
- -P :只顯示進程,不顯示線程
- -a :顯示累計的io(從iotop啟動)
- -k : 以KB為單位顯示
- -t : 非交互模式下,顯示時間
- -q: 只在第一次監測時顯示列名. 去除頭部一些行:這個參數可以設置最多3次來移除頭部行:-q列頭部只在最初交互顯示一次;-qq列頭部不顯示;-qqq,I/O的總結不顯示
- 輸出:
- 常用命令:
- iotop -o -P : 顯示有io操作的進程
- 參考鏈接:
4 top
- 功能:監視進程和Linux整體性能的工具,所有用戶可使用
- 參數:
- top [-] [d delay] [q] [c] [S] [s] [n]
- d : 改變顯示的更新速度,或是在交談式指令列( interactive command)按 s
- q : 沒有任何延遲的顯示速度,如果使用者是有 superuser 的許可權則 top 將會以最高的優先序執行
- c : 切換顯示模式,共有兩種模式,一是只顯示執行檔的名稱,另一種是顯示完整的路徑與名稱
- S : 累積模式,會將己完成或消失的子行程 ( dead child process ) 的 CPU time 累積起來
- s : 安全模式,將交談式指令取消, 避免潛在的危機
- i : 不顯示任何閑置 (idle) 或無用 (zombie) 的行程
- n : 更新的次數,完成後將會退出 top
- b : 批次檔模式,搭配 “n” 參數一起使用,可以用來將 top 的結果輸出到檔案內
- 1 :交互界面中輸入數字1,可查看每個cpu的情況
- b : 交互界面中輸入字母b,可高亮顯示當前運行進程
- 輸出:
- 常用命令:
- top 然後在交互中輸入i(僅活躍的進程),然後輸入1(查看每個cpu的情況),然後輸入b(高亮顯示)
5 vmstat
- 功能:報告關於內核線程、虛擬記憶體、磁碟、陷阱和 CPU 活動的統計信息。由 vmstat 命令生成的報告可以用於平衡系統負載活動。系統範圍內的這些統計信息(所有的處理器中)都計算出以百分比表示的平均值,或者計算其總和。Linux系統的記憶體分為物理記憶體和虛擬記憶體兩種。物理記憶體是真實的,也就是物理記憶體條上的記憶體。而虛擬記憶體則是採用硬碟空間補充物理記憶體,將暫時不使用的記憶體頁寫到硬碟上以騰出更多的物理記憶體讓有需要的進程使用。當這些已被騰出的記憶體頁需要再次使用時才從硬碟(虛擬記憶體)中讀回記憶體。這一切對於用戶來說是透明的。通常對Linux系統來說,虛擬記憶體就是swap分區。vmstat(VirtualMeomoryStatistics,虛擬記憶體統計)是Linux中監控記憶體的常用工具,可對操作系統的虛擬記憶體、進程、CPU等的整體情況進行監視
- 參數:
-
- vmstat [-a] [-n] [-S unit] [delay [ count]} : -a顯示活躍和非活躍記憶體 -n只在開始時顯示列名稱 dealy刷新的時間間隔 count輸出的次數 -S:使用制定單位顯示(k/K/m/M等)
- vmstat [-s] [-n] [-S unit] : -s顯示系統相關信息(如記憶體/cpu等)
- vmstat [-m] [-n] [delay [ count]] : -m 顯示slab信息
- vmstat [-d] [-n] [delay [ count]] : -d顯示磁碟相關統計
- vmstat [-p disk partition] [-n] [delay [ count]] : -p顯示磁碟分區統計信息
- vmstat [-f] : -f從系統啟動至今的fork數量
- vmstat [-V] : -v顯示版本信息
- 輸出:
- swpd: 使用虛擬記憶體大小
- free: 可用記憶體大小
- buff: 用作緩衝的記憶體大小
- cache: 用作緩存的記憶體大小
- si: 每秒從交換區寫到記憶體的大小
- so: 每秒寫入交換區的記憶體大小
- bi: 每秒讀取的塊數
- bo: 每秒寫入的塊數
- in: 代表每秒的中斷數目
- 常用命令:
- vmstat 1 5: 每隔1s輸出一次,共輸出5次
- vmstat -f : 查看系統已經fork了多少次
- vmstat -a : 查看active和非active記憶體情況【註:inact和active的數據來自於/proc/meminfo】
- vmstat -s : 查看記憶體占用總體情況
- vmstat -d 1 5 : 查看5次磁碟io情況 【註:這些信息主要來自於/proc/diskstats】
- vmstat -p /dev/sdb1 : 查看分區sdb1的情況,只能用來查看分區
- 參考鏈接:
6 pidstat
- 簡介:
- sysstat工具的一個命令,用於監控全部或指定進程的cpu、記憶體、線程、設備IO等系統資源的占用情況。pidstat首次運行時顯示自系統啟動開始的各項統計信息,之後運行pidstat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息
- 參數:
- pidstat [ 選項 ] [ <時間間隔> ] [ <次數> ]
- -u:預設的參數,顯示各個進程的cpu使用統計
- -r:顯示各個進程的記憶體使用統計
- -d:顯示各個進程的IO使用情況
- -p:指定進程號
- -w:顯示每個進程的上下文切換情況
- -t:顯示選擇任務的線程的統計信息外的額外信息
- -T { TASK | CHILD | ALL } 這個選項指定了pidstat監控的。TASK表示報告獨立的task,CHILD關鍵字表示報告進程下所有線程統計信息。ALL表示報告獨立的task和task下麵的所有線程。註意:task和子線程的全局的統計信息和pidstat選項無關。這些統計信息不會對應到當前的統計間隔,這些統計信息只有在子線程kill或者完成的時候才會被收集。
- -V:版本號
- -h:在一行上顯示了所有活動,這樣其他程式可以容易解析。
- -I:在SMP環境,表示任務的CPU使用率/內核數量
- -l:顯示命令名和所有參數
- 輸出:
- 常用命令:
- pidstat -d 1 -l: 顯示磁碟io使用情況,並顯示詳細指令
- pidstat -r : 顯示記憶體占用情況
- pidstat -u : 顯示cpu占用情況
- 參考鏈接:
7 pt-ioprofile
- 簡介
- Percona Toolkit簡稱pt工具,是Percona公司開發用於管理MySQL的工具,功能包括檢查主從複製的數據一致性、檢查重覆索引、定位IO占用高的表文件、線上DDL等,DBA熟悉掌握後將極大提高工作效率,常用來定位哪個文件IO占用比較高,其原理是對某個pid附加一個strace進程進行IO分析, --profile-pid指定pid, --cell=sizes,該參數將結果已 B/s 的方式展示出來
- 參數:
- pt-ioprofile --profile-pid=18934 --cell=sizes
- 輸出:
- 常用命令:
- pt-ioprofile --profile-pid=11220--cell=sizes
- 參考鏈接:
- 註意事項:
- pt-ioprofile可能會凍結服務,crash進程,是進程變得更糟糕,或者使進程休眠
- pt-ioprofile是一個有干擾的工具,一般不用在生產環境中,除非你能理解和接受風險
8 lsof
- 簡介:lsof(list open files),一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網路連接和硬體。因為 lsof 需要訪問核心記憶體和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能
- 參數:
- lsof [option] filename
- -c: 顯示command列中包含string的進程所打開的文件
- -u: 顯示某個用戶打開的文件
- -a: 顯示滿足後續所有條件的文件
- -p: 列出進程號所打開的文件
- -h: 顯示幫助信息
- -v: 顯示版本信息
- -n:列出使用nfs的文件
- +D: 遞歸打開目錄下的所有文件
- +d:列出目錄下被打開的文件
- -d:列出占用該文件號的進程
- -g:列出gid(groupid)號進程詳情
- -t:僅列出進程
- -r: 迴圈列出文件直到被中斷,後面數字代表迴圈的頻率,
- 輸出:
-
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 3,3 1024 2 / init 1 root rtd DIR 3,3 1024 2 / init 1 root txt REG 3,3 38432 1763452 /sbin/init init 1 root mem REG 3,3 106114 1091620 /lib/libdl-2.6.so init 1 root mem REG 3,3 7560696 1091614 /lib/libc-2.6.so init 1 root mem REG 3,3 79460 1091669 /lib/libselinux.so.1 init 1 root mem REG 3,3 223280 1091668 /lib/libsepol.so.1 init 1 root mem REG 3,3 564136 1091607 /lib/ld-2.6.so init 1 root 10u FIFO 0,15 1309 /dev/initctl
- Command: 進程名稱
- PID: 進程號
- USER: 用戶名
- FD: 文件描述符,如cwd(某個進程運行時所在的目錄) 、txt(程式代碼,如應用程式的二進位庫或者是共用庫)、rtd(根目錄)、mem(記憶體映射文件)、mmap(記憶體映射設備)、數字大頭的(0|1|2U|R|W)
- TYPE: 類型,REG(文件)、DIR(目錄)、CHR(字元)、BLK(塊設備)、UNIX(套接字)、FIFO(先進先出隊列)、IPV4(網際協議套接字)
- DEVICE: 指定磁碟的名稱
- SIZE: 文件的大小
- NODE:索引節點,文件在磁碟上的標識
- NAME:打開文件的確切名稱
-
- 常用命令
- lsof filename : 打開filename的所有進程
- lsof -c string: 顯示command列中包含string的進程所打開的文件
- lsof -u user: 顯示所屬user進程打開的文件
- lsof -a -c string -u user :同時滿足-c&-u兩個屬性的被打開的文件
- lsof -u ^baihh : 顯示不屬於baihh進程的文件
- lsof -i : 顯示所有打開的埠
- lsof -i :80 : 顯示所有打開80埠的進程
- lsof /dev/sda[1234] : 顯示打開sda1 sda2 sda3 sda4中任意一個的設備的文件
- lsof -p 300,400,500 : 列出進程300、400、500打開的所有文件
- lsof -t -i: 列出使用某個埠的進程pid
- 參考鏈接:
9 dstat
- 簡介
- 參數
- dstat [-afv] [option] [gap count]: 預設1s顯示一次信息
- -c: 顯示cpu信息
- -C:只顯示指定cpu的信息
- -d:顯示磁碟設備信息
- -n:顯示網路設備信息
- -N: 指定要顯示的網卡
- -g:顯示頁面(page)相關信息
- -y:顯示系統(system)相關信息
- -a: 預設選項,等同於-cdngy
- -p: 顯示進程狀態
- -m: 顯示記憶體使用情況
- -D: hda,total: include hds and total
- -s: 顯示交換分區使用情況
- -S:類似於D/N
- -v: 等同於-pmgdsc -D total
- -r: io請求情況
- --output : 將輸出結果以csv格式重定向到指定文件中(可用excel打開)
- -aio: 開啟同步io統計
- -fs:開啟文件系統統計
- -ipc:開啟ipc統計
- -lock:開啟文件鎖統計
- -raw:開啟raw統計(raw lock)
- -socket: 開啟socket統計
- -tcp/-udp/-unix/-vm: 開啟相關統計
- -stat 通過插件名稱開啟插件擴展,可能的插件包括(aio/cpu/disk/disk24/disk240ld/fs/int/mem/net/socket/vm等)
- -list:列出所有的插件名稱
- -float/-integer: 終端顯示浮點型/整型
- -nocolor: 無需顏色
- --disk-util : 顯示某一時刻磁碟的繁忙程度
- --disk-tps:磁碟每秒事務數統計
- -top-io 顯示正常I/O最大的進程
- --top-io-adv:詳細顯示
- --freespace 顯示當前磁碟空間使用率
- -top-bio 顯示塊I/O最大的進程,僅顯示進程
- --top-bio-ad : 詳細顯示最消耗塊io的進程,包括pid和其他信息
- dstat --top-latency:顯示哪個進程有最大的延遲
- 輸出
-
[root@iZ23uulau1tZ ~]# dstat ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 0 0 99 0 0 0|7706B 164k| 0 0 | 0 0 | 189 225 0 0 100 0 0 0| 0 0 |4436B 826B| 0 0 | 195 248 1 0 99 0 0 0| 0 0 |4744B 346B| 0 0 | 203 242 0 0 100 0 0 0| 0 0 |5080B 346B| 0 0 | 206 242 0 1 99 0 0 0| 0 0 |5458B 444B| 0 0 | 214 244 1 0 99 0 0 0| 0 0 |5080B 346B| 0 0 | 208 242
- hiq: cpu硬中斷的次數
- siq:cpu軟中斷的次數
- int:系統的中斷次數(interrrupt)
- csw:系統的上下文切換次數(context switch)
-
- 常用命令
- dstat -stat disk --disk-util --top-io --freespace
- dstat -dD sda --top-io-adv: 顯示指定盤的耗用cpu最多的進程【待驗證】
- dstat --dstat : 顯示dstat本身的cpu、延遲等
- 參考鏈接
10 atop
- 簡介
11 sysdig
12 sysstat
參考:Linux 系統監控工具 atop - 走看看 (zoukankan.com)
11 ioping
參考:(23條消息) linux 查看共用磁碟_用於檢測查看磁碟活動的Linux命令_小透明熊熊的博客-CSDN博客
總結:以上工具通過某些指令都可以用來分析磁碟io,但目前的工具還缺少分析指定盤的帶寬占用進程統計,而此統計在實際應用有重要的意義,比如系統盤io占用,一般我們需要分析哪個進程占用系統盤的io資源比較多,據此來限制此進程的操作,若各位有這種工具,歡迎推薦,共同進步,增長見識!!!