Linux Performance Monitoring with Vmstat and Iostat Commands
概述
Linux-使用vmstat和iostat/iotop命令進行Linux性能監控
vmstat和iostat兩個命令都適用于所有主要的類unix系統(Linux/unix/FreeBSD/Solaris)。
磁盤IO是服務器性能的一個重要指標,下面介紹兩個常用的觀察IO的命令,iostat我一般用來查看磁盤的IO,以及在測試磁盤時做一個監控工具,iotop在排查服務器問題時,可以用來找到某些異常程序!下面都會做一個簡要的介紹!
博文中使用的操作系統為:
[xgj@entel2 ~]$ cat /etc/redhat-release CentOS release 6.5 (Final) [xgj@entel2 ~]$在Linux系統中安裝sysstat
如果vmstat和iostat命令在你的系統中不可用,請安裝sysstat軟件包。vmstat,sar和iostat命令都包含在sysstat(系統監控工具)軟件包中。iostat命令生成CPU和所有設備的統計信息。你可以從http://sebastien.godard.pagesperso-orange.fr/download.html下載源代碼包編譯安裝sysstat,但是我們建議通過YUM命令進行安裝。
#yum -y install sysstat- vmstat - 內存,進程和分頁等的簡要信息。
- iostat - CPU統計信息,設備和分區的輸入/輸出統計信息。
Linux下vmstat命令的6個范例
1. 列出活動和非活動的內存
如下范例中輸出6列。vmstat的man頁面中解析的每一列的意義。最重要的是內存中的free屬性和交換分區中的si和so屬性。
[xgj@entel2 ~]$ vmstat -a procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----r b swpd free inact active si so bi bo in cs us sy id wa st1 1 5560648 432300 60687632 69192544 0 0 16 24 0 0 1 1 98 1 0 [xgj@entel2 ~]$- Free – 空閑的內存空間
- si – 每秒從磁盤中交換進內存的數據量(以KB為單位)。
- so – 每秒從內存中交換出磁盤的數據量(以KB為單位)。
注意:如果你不帶參數的執行vmstat命令,它會輸出自系統啟動以來的總結報告。
2. 每X秒執行vmstat,共執行N次
下面命令將會每2秒中執行一次vmstat,執行6次后自動停止執行。
[xgj@entel2 ~]$ vmstat 2 6 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 1 5596576 396640 1747456 113387648 0 0 16 24 0 0 1 1 98 1 0 0 1 5598864 385620 1747464 113398368 0 1144 10956 11130 13465 24846 1 1 94 4 0 0 1 5599376 412456 1747480 113369968 0 256 9040 8690 13822 24798 1 1 94 4 0 0 1 5599772 422664 1747480 113359576 0 198 10252 9540 13831 24521 1 1 94 4 0 1 0 5599772 386808 1747504 113400336 0 0 10760 9584 13634 24454 1 1 94 4 0 0 1 5599976 377404 1747504 113408784 0 102 10252 9982 13895 24758 2 1 94 4 0 [xgj@entel2 ~]$3. 帶時間戳的vmstat命令
帶-t參數執行vmstat命令,該命令將會在每一行輸出后都帶一個時間戳,如下所示。
[xgj@entel2 ~]$ vmstat -t 1 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 5606336 441880 1747820 113351312 0 0 16 24 0 0 1 1 98 1 0 2017-01-19 19:37:01 BOT2 1 5606336 420764 1747820 113373088 0 0 11144 10248 13626 24692 1 1 94 4 0 2017-01-19 19:37:02 BOT1 1 5606332 394668 1747836 113394960 32 0 11700 10752 14271 25457 2 1 93 4 0 2017-01-19 19:37:03 BOT [xgj@entel2 ~]$4. 統計各種計數器
vmstat命令的-s參數,將輸出各種事件計數器和內存的統計信息。
[xgj@entel2 ~]$ vmstat -s132223776 total memory131831080 used memory69132688 active memory60717320 inactive memory392696 free memory1748412 buffer memory113362880 swap cache16777212 total swap5624704 used swap11152508 free swap124326607 non-nice user cpu ticks11823 nice user cpu ticks94812107 system cpu ticks17320027017 idle cpu ticks127489886 IO-wait cpu ticks327 IRQ cpu ticks1298224 softirq cpu ticks0 stolen cpu ticks2848730960 pages paged in4254100177 pages paged out287406 pages swapped in1893055 pages swapped out3780708913 interrupts737819991 CPU context switches1477424738 boot time51132198 forks [xgj@entel2 ~]$5. 磁盤統計信息
vmstat的-d參數將會輸出所有磁盤的統計信息。
[xgj@entel2 ~]$ vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------total merged sectors ms total merged sectors ms cur sec ram0 0 0 0 0 0 0 0 0 0 0 ram1 0 0 0 0 0 0 0 0 0 0 ram2 0 0 0 0 0 0 0 0 0 0 ram3 0 0 0 0 0 0 0 0 0 0 ram4 0 0 0 0 0 0 0 0 0 0 ram5 0 0 0 0 0 0 0 0 0 0 ram6 0 0 0 0 0 0 0 0 0 0 ram7 0 0 0 0 0 0 0 0 0 0 ram8 0 0 0 0 0 0 0 0 0 0 ram9 0 0 0 0 0 0 0 0 0 0 ram10 0 0 0 0 0 0 0 0 0 0 ram11 0 0 0 0 0 0 0 0 0 0 ram12 0 0 0 0 0 0 0 0 0 0 ram13 0 0 0 0 0 0 0 0 0 0 ram14 0 0 0 0 0 0 0 0 0 0 ram15 0 0 0 0 0 0 0 0 0 0 loop0 0 0 0 0 0 0 0 0 0 0 loop1 0 0 0 0 0 0 0 0 0 0 loop2 0 0 0 0 0 0 0 0 0 0 loop3 0 0 0 0 0 0 0 0 0 0 loop4 0 0 0 0 0 0 0 0 0 0 loop5 0 0 0 0 0 0 0 0 0 0 loop6 0 0 0 0 0 0 0 0 0 0 loop7 0 0 0 0 0 0 0 0 0 0 sdb 22221426 22382 5487009964 44045589 45506192 152270 4023259784 401825121 0 111140 sda 5793066 784038 211341364 38795413 208224442 81100325 4485833433 1269735263 0 715938 dm-0 31239 0 630834 147239 57173 0 3474960 3407531 0 345 dm-1 288499 0 2307992 2150847 1894999 0 15159944 124189941 0 1598 dm-2 29840 0 1503610 145689 2668937 0 71531824 81253517 0 11178 dm-3 1011 0 8082 1904 69 0 464 685 0 1 dm-4 5306 0 42442 7200 2696005 0 31951584 42201059 0 21685 dm-5 1020 0 8154 2128 1324 0 12168 19261 0 8 dm-6 229541 0 3241218 659663 98793 0 790712 7317801 0 348 dm-7 220706 0 4067906 741873 6904210 0 76988648 149072927 0 42371 dm-8 918 0 7338 1650 30 0 152 275 0 1 disk- ------------reads------------ ------------writes----------- -----IO------total merged sectors ms total merged sectors ms cur sec dm-9 6466 0 740538 16764 11926 0 95712 186257 0 109 dm-10 24533644 0 5508246266 59711348 131753441 0 5139101144 3639924222 0 517566 dm-11 3018872 0 173300066 36321168 134949598 0 3174908528 3964229623 0 334654 [xgj@entel2 ~]$6. 以MB為單位輸出統計信息
vmstat的-S和-M參數(大寫和MB)將會以MB為單位輸出。vmstat默認以KB為單位輸出統計信息。
[xgj@entel2 ~]$ vmstat -S M 1 5 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st1 1 5503 403 1725 110653 0 0 16 24 0 0 1 1 98 1 0 2 1 5503 398 1725 110659 0 0 3088 5012 13901 25028 1 1 94 4 0 0 1 5503 391 1725 110665 0 0 3600 4800 13976 24952 1 1 94 4 0 0 2 5503 385 1725 110672 0 0 3080 4272 13583 24804 1 1 94 4 0 0 1 5503 378 1726 110679 0 0 3600 4940 14160 25357 1 0 94 4 0 [xgj@entel2 ~]$ free -mtotal used free shared buffers cached Mem: 129124 128713 411 0 1728 110639 -/+ buffers/cache: 16345 112779 Swap: 16383 5503 10880 [xgj@entel2 ~]$linux下的iostat命令的6個范例
常用-x和-d選項
iostat是一個統計設備IO和和CPU的工具。最常用的是-x和-d選項
一般我們需要持續觀察IO狀況:
[xgj@entel2 ~]$ iostat -x 1 2每1秒鐘顯示一次報告,顯示兩次
man中文手冊
1.直接執行iostat不接參數,是指系統從啟動到現在為止的統計數據。
2.間隔參數代表每次報告的間隔時間,同樣第一條是系統從啟動到現在為止的統計數據,后續的每條都是iostat執行間隔時間內的統計數據。
3.iostat創建3種類型報告,cpu使用率,設備使用率,網絡文件系統報告。
4.cpu使用率報告:
(1).%user:用戶態所占用的CPU使用率百分比(應用程序)。
(2).%nice:用戶態執行nice優先級所占用的CPU使用率百分比。
(3).%system:內核態所占用的CPU使用率百分比(內核)
(4).%iowait:CPU處于idle狀態等待磁盤IO請求所占用的百分比。
(5).%steal:當hypervisor服務另一個(虛擬)CPU時,(虛擬)CPU強制等待的時間占比。
(6).%idle:沒有磁盤請求時,CPU的空閑時間占比。
5.設備使用率報告:
(1).Device:監測的設備或分區名稱
(2).tps:代表每秒的傳輸數(transfer),傳輸數可以是單個的IO請求或合并多個邏輯請求到單個IO請求。
(3).Blk_read/s:每秒讀取的block數,block相當于扇區的大小,即512字節。舊內核可能不確定。
(4).Blk_wrtn/s:每秒寫入的block數。
(5).Blk_read:總讀取的block數。
(6).Blk_wrtn:總寫入的block數。
(7).kB_read/s kB_wrtn/s kB_read kB_wrtn MB_read/s MB_wrtn/s MB_read MB_wrtn: 同上,只是單位不同
(8).rrqm/s:每秒合并的讀請求數。
(9).wrqm/s:每秒合并的寫請求數。
(10).r/s:每秒讀請求數。
(11).w/s:每秒寫請求數。
(12).rsec/s:每秒的讀扇區數。
(13).wsec/s:每秒的寫扇區數。
(14).rkB/s:每秒讀的kB數。
(15).wkB/s:每秒寫的kB數。
(16).rMB/s:每秒讀的MB數。
(17).wMB/s:每秒寫的MB數。
(18).avgrq-sz:平均請求的大小(扇區)。
(19).avgqu-sz:平均隊列長度。
(20).await:IO請求發送給設備和設備執行請求的時間(毫秒)。
(21).svctm:設備執行請求的時間(毫秒),此項不準,不可信。
(22).%util:I/O請求發送到設備期間,占用CPU時間的百分比。
監測NFS的統計數據 iostat -n 1
6.網絡文件系統(NFS)報告
顯示每個掛載的網絡文件系統統計數據
(1).Filesystem:掛載的NFS服務器的主機名和目錄
(2).rBlk_nor/s:使用read(2)系統調用接口讀取的block數,block大小是512byte。
(3).wBlk_nor/s:使用write(2)系統調用接口寫入的block數,block大小是512byte。
(4).rBlk_dir/s:使用O_DIRECT標志位讀取的block數。
(5).wBlk_dir/s:使用O_DIRECT標志位寫入的block數。
(6).rBlk_svr/s:NFS客戶端通過NFS讀請求從服務端讀取的block數。
(7).wBlk_svr/s:NFS客戶端通過NFS寫請求往服務端寫入的block數。
(8).rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s rMB_nor/s wMB_nor/s rMB_dir/s wMB_dir/s rMB_svr/s wMB_svr/s,同上,單位不同而已
(9).ops/s:每秒到文件系統的總操作數
(10).rops/s:每秒到文件系統的讀操作數
(11).wops/s:每秒到文件系統的寫操作數
選項:
-c 顯示CPU使用率報告。
-d 顯示設備使用率報告。
-h 使-n的NFS報告對人更易讀。
-k 使統計數據以KB來表示,而不是扇區。
-m 使統計數據以MB來表示,而不是扇區。
-N 顯示注冊的設備映射名字,在使用邏輯卷LVM2時很好用。
-n 顯示網絡文件系統報告
-p [ { device [,…] | ALL } ] 后面接要監測的設備,例如sda
-t 顯示時間戳,時間戳的格式受 S_TIME_FORMAT 環境變量影響。
-V 顯示版本號然后退出
-x 顯示擴展的統計數據,需要/proc/diskstats,掛載的sysfs,/proc/partitions等支持。
-z 如果統計時間內沒有活動,iostat就不輸出
環境
iostat命令會受以下環境變量影響
S_TIME_FORMAT 如果這個環境變量存在,會影響iostat的時間戳格式,遵循ISO 8601格式
例子
iostat 顯示自啟動以來的CPU和設備的報告。
iostat -d 2 每2秒間隔持續顯示報告
iostat -d 2 6 每2秒間隔持續顯示報告,顯示6次
iostat -x hda hdb 2 6 為hda和hdb顯示報告,每2秒間隔,顯示6次
iostat -p sda 2 6 為sda及子分區顯示報告,每2秒間隔,顯示6次
BUGS
/proc 文件系統必須以掛載,iostat依賴它。擴展的統計數據只對2.5以上的內核可用。
svctm已經沒有意義,由于I/O統計是通過block層計算出來的,我們并不知道磁盤驅動器什么時候開始處理一個請求。
因此,下一個版本將刪除svctm這項。
文件
/proc/stat 包含系統統計數據
/proc/uptime 包含系統uptime.
/proc/partitions 包含磁盤統計數據,2.5內核支持
/proc/diskstats 包含磁盤統計數據,2.5內核支持
/sys contains 塊設備的統計數據 (post 2.5 kernels).
/proc/self/mountstats 包含網絡文件系統統計數據
1. 輸出CPU和輸入/輸出(I/O)的統計信息
不帶參數的iostat命令將會輸出CPU和每個分區的輸出/輸出的統計信息,如下所示。
2. 只輸出CPU的統計信息
iostat命令的-c參數僅輸出CPU的統計信息,如下所示。
[xgj@entel2 ~]$ iostat -c Linux 3.10.5-3.el6.x86_64 (entel2) 01/19/2017 _x86_64_ (24 CPU)avg-cpu: %user %nice %system %iowait %steal %idle0.70 0.00 0.54 0.72 0.00 98.03[xgj@entel2 ~]$3. 只輸出磁盤的輸入/輸出統計信息
iostat命令的-d參數僅輸出磁盤的所有分區的輸入/輸出的統計信息,如下所示。
4. 只輸出某個磁盤的輸入/輸出統計信息
在默認情況下iostat命令會輸出所有分區的統計信息,但是若在iostat命令后加上-p參數和磁盤設備名,該命令將會僅輸出列出的磁盤的輸入/輸出統計信息,如下所示。
5. 輸出邏輯卷管理(LVM)的統計信息
iostat命令的-N(大寫)參數將會輸出LVM(LVM是linux環境下對磁盤分區進行管理的一種機制,是磁盤分區和文件系統間的一個邏輯層)的統計信息,如下所示。
6. iostat版本信息
iostat的-V(大寫)參數將會輸出iostat的版本信息,如下所示。
[xgj@entel2 ~]$ iostat -V sysstat version 9.0.4 (C) Sebastien Godard (sysstat <at> orange.fr) [xgj@entel2 ~]$iotop
官網:http://guichaz.free.fr/iotop/
需要用root用戶執行
在某些場景下,我們需要找到占用IO特別大的進程,然后關閉它,需要知道PID或者進程名稱,這就需要用到iotop。iotop是一個檢測Linux系統進程IO的工具,界面類似top,如下圖。
[xgj@entel2 ~]$ iotop Netlink error: Operation not permitted (1)The Linux kernel interfaces that iotop relies on now require root privileges or the NET_ADMIN capability. This change occurred because a security issue (CVE-2011-2494) was found that allows leakage of sensitive data across user boundaries. If you require the ability to run iotop as a non-root user, please configure sudo to allow you to run iotop as root.Please do not file bugs on iotop about this. [xgj@entel2 ~]$ sudo iotopiotop和top一樣,也可以通過鍵入相應鍵,觸發排序選項,例如按o可以在IO活動進程和所有進程之間切換??梢酝ㄟ^左右箭頭,選擇響應的列進行數據排序。
手冊:
名稱
iotop - 簡單的top類I/O監視器 總覽
iotop [OPTIONS] 描述
iotop根據Linux內核(需要2.6.20及以上)來監測I/O,并且能顯示當前進程/線程的I/O使用率。
Linux內核build的時候,需要開啟CONFIG_TASK_DELAY_ACCT和CONFIG_TASK_IO_ACCOUNTING選項,這些選項依賴于CONFIG_TASKSTATS。
在采樣周期里,iotop按列顯示每個進程/線程的I/O讀寫帶寬,同時也顯示進程/線程做swap交換和等待I/O所占用的百分比。
每一個進程都會顯示I/O優先級(class/level),另外在最上面顯示每個采樣周期內的讀寫帶寬。
使用左右箭頭來改變排序,r用來改變排序順序,o用來觸發–only選項,p用來觸發–processes選項。
a用來觸發–accumulated選項,q用來退出,i用來改變進程或線程的監測優先級,其它任繼健是強制刷新。
選項
–version 顯示版本號然后退出
-h, –help 顯示幫助然后退出
-o, –only 只顯示正在產生I/O的進程或線程。除了傳參,可以在運行過程中按o生效。
-b, –batch 非交互模式,一般用來記錄日志
-n NUM, –iter=NUM 設置監測的次數,默認無限。在非交互模式下很有用
-d SEC, –delay=SEC 設置每次監測的間隔,默認1秒,接受非整形數據例如1.1
-p PID, –pid=PID 指定監測的進程/線程
-u USER, –user=USER 指定監測某個用戶產生的I/O
-P, –processes 僅顯示進程,默認iotop顯示所有線程
-a, –accumulated 顯示累積的I/O,而不是帶寬
-k, –kilobytes 使用kB單位,而不是對人友好的單位。在非交互模式下,腳本編程有用。
-t, –time 加上時間戳,非交互非模式。
-q, –quiet 禁止頭幾行,非交互模式。有三種指定方式。
-q 只在第一次監測時顯示列名
-qq 永遠不顯示列名。
-qqq 永遠不顯示I/O匯總
總結
以上是生活随笔為你收集整理的Linux Performance Monitoring with Vmstat and Iostat Commands的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle海量数据优化-02分区在海量
- 下一篇: Linux - Sysstat [ Al