dstat 命令是一個用來替換 vmstat、iostat、netstat、nfsstat 和 ifstat 這些命令的工具,是一個全能系統信息統計工具。dstat揚長避短,即克服了這些命令的侷限又增加了一些額外的功能,不但擁有更多的監控項,也更靈活。與 sysstat 相比,dstat 擁有一個彩色的界面,在手動觀察性能狀況時,數據比較顯眼容易觀察;而且 dstat 支持即時刷新,譬如輸入 dstat 3 即每三秒收集一次,但最新的數據都會每秒刷新顯示。和 sysstat 相同的是,dstat 也可以收集指定的性能資源,譬如 dstat -c 即顯示 CPU 的使用情況。dstat在性能測試、基準測試和排除故障過程中可以很方便監控系統運行狀況。
特性
- 結合了vmstat,iostat,ifstat,netstat以及更多的信息
- 實時顯示統計情況,輸出報告
- 在分析和排障時可以通過啓用監控項並排序
- 模塊化設計
- 使用python編寫的,方便擴展現有的工作任務
- 容易擴展和添加你的計數器
- 包含的許多擴展插件——增加新的監控項目很方便
- 可以分組統計塊設備/網絡設備,並給出總數
- 可以顯示每臺設備的當前狀態
- 極準確的時間精度,即便是系統負荷較高也不會延遲顯示
- 顯示準確地單位和和限制轉換誤差範圍
- 不同的計量單位用不同的顏色顯示
- 顯示中間結果延時小於1秒
- 支持輸出CSV格式報表,並能導入到Gnumeric和Excel以生成圖形
安裝
只演示CentOS下的安裝(我的實驗環境爲CentOS)
[root@wmstianjin16172 ~]# yum install dstat
測試命令
安裝完成測試一下命令是否完成安裝
[root@wmstianjin16172 ~]# dstat
直接使用 dstat,默認使用的是 -cdngy 參數,分別顯示 cpu、disk、net、page、system 信息,默認是 1s 顯示一條信息。可以在最後指定顯示一條信息的時間間隔,如 dstat 5 是沒 5s 顯示一條,dstat 5 10 表示沒 5s 顯示一條,一共顯示 10 條。
下面對顯示出來的部分信息作一些說明:
cpu:hiq、siq 分別爲硬中斷和軟中斷次數。
system:int、csw 分別爲系統的中斷次數(interrupt)和上下文切換(context switch)。
其他的都很好理解。
Procs
r: 運行的和等待 (CPU 時間片) 運行的進程數,這個值也可以判斷是否需要增加 CPU(長期大於 1)
b: 處於不可中斷狀態的進程數,常見的情況是由 IO 引起的
Memory
swpd: 切換到交換內存上的內存 (默認以 KB 爲單位)。如果 swpd 的值不爲 0,或者還比較大,比如超過 100M 了,但是 si, so 的值長期爲 0,這種情況我們可以不用擔心,不會影響系統性能。
free: 空閒的物理內存
buff: 作爲 buffer cache 的內存,對塊設備的讀寫進行緩衝
cache: 作爲 page cache 的內存, 文件系統的 cache。如果 cache 的值大的時候,說明 cache 住的文件數多,如果頻繁訪問到的文件都能被 cache 住,那麼磁盤的讀 IO bi 會非常小。
Swap
si: 交換內存使用,由磁盤調入內存
so: 交換內存使用,由內存調入磁盤
內存夠用的時候,這 2 個值都是 0,如果這 2 個值長期大於 0 時,系統性能會受到影響。磁盤 IO 和 CPU 資源都會被消耗。
我發現有些朋友看到空閒內存 (free) 很少或接近於 0 時,就認爲內存不夠用了,實際上不能光看這一點的,還要結合 si,so,如果 free 很少,但是 si,so 也很少 (大多時候是 0),那麼不用擔心,系統性能這時不會受到影響的。
磁盤 IO
bi: 從塊設備讀入的數據總量 (讀磁盤) (KB/s)
bo: 寫入到塊設備的數據總理 (寫磁盤) (KB/s)
注: 隨機磁盤讀寫的時候,這 2 個 值越大(如超出 1M),能看到 CPU 在 IO 等待的值也會越大
System
in: 每秒產生的中斷次數
cs: 每秒產生的上下文切換次數
上面這 2 個值越大,會看到由內核消耗的 CPU 時間會越多
Cpu
usr: 用戶進程消耗的 CPU 時間百分比
us 的值比較高時,說明用戶進程消耗的 CPU 時間多,但是如果長期超過 50% 的使用,那麼我們就該考慮優化程序算法或者進行加速了 (比如 PHP/Perl)
sys: 內核進程消耗的 CPU 時間百分比
sys 的值高時,說明系統內核消耗的 CPU 資源多,這並不是良性的表現,我們應該檢查原因。
wai: IO 等待消耗的 CPU 時間百分比
wa 的值高時,說明 IO 等待比較嚴重,這可能是由於磁盤大量作隨機訪問造成,也有可能是磁盤的帶寬出現瓶頸 (塊操作)。
idl: CPU 處在空閒狀態時間百分比
命令格式
dstat [-afv] [options..] [delay [count]]
命令選項
Options Details
-c, - -cpu 開啓cpu統計
-C 該選項跟cpu的編號(0~cpu核數-1,多個用都好隔開)如:0,3,total表示分別包含cpu0、cpu3和total
-d, - -disk 開啓disk統計
-D 改選跟具體的設備名(多個用逗號隔開)如:total,hda,hdb表示分別統計total、hda、hdb設備塊
-g, - -page 開啓分頁統計
-i, - -int 開啓中斷統計
-I 5,10 沒弄懂呢~巴拉巴拉
-l, - -load 開啓負載均衡統計,分別是1m,5m,15m
-m, - -mem 開啓內存統計,包括used,buffers,cache,free
-n, - -net 開啓net統計,包括接受和發送
-N 該選項可以跟網絡設備名多個用逗號隔開,如eth1,total
-p, - -proc 開啓進程統計,包括runnable, uninterruptible, new
-r, - -io io開啓請求統計,包括read requests, write requests
-s, - -swap 開啓swap統計,包括used, free
-S 該選項可以跟具體的交換區,多個用逗號隔開如swap1,total
-t, - -time 啓用時間和日期輸出
-T, - -epoch 啓用時間計數,從epoch到現在的秒數
-y, - -sys 開啓系統統計,包括中斷和上下文切換
- -aio 開啓同步IO統計 (asynchronous I/O)
- -fs 開啓文件系統統計,包括 (open files, inodes)
- -ipc 開啓ipc統計,包括 (message queue, semaphores, shared memory)
- -lock 開啓文件所統計,包括 (posix, flock, read, write)
- -raw 開啓raw統計 (raw sockets)
- -socket 開啓sockets統計,包括 (total, tcp, udp, raw, ip-fragments)
- -tcp 開啓tcp統計,包括(listen, established, syn, time_wait, close)
- -udp 開啓udp統計 (listen, active)
- -unix 開啓unix統計(datagram, stream, listen, active)
- -vm 開啓vm統計 (hard pagefaults, soft pagefaults, allocated, free)
- -stat 通過插件名稱開啓插件擴展,詳見命令插件 :可能的內置插件爲aio, cpu, cpu24, disk, disk24, disk24old, epoch, fs, int, int24, io, ipc, load, lock, mem, net, page, page24, proc, raw, socket, swap, swapold, sys, tcp, time,udp, unix, vm
- -list 列舉內置插件擴展的名稱
-a, - -all 是默認值相當於 -cdngy (default)
-f, - -full 相當於 -C, -D, -I, -N and -S
-v, - -vmstat 相當於 -pmgdsc -D total
- -bw, - -blackonwhite 在白色背景終端上改變顯示顏色
- -float 在屏幕上的輸出強制顯示爲浮點值(即帶小數)(相反的選項設置爲 - -integer)
- -integer 在屏幕上的輸出強制顯示爲整數值,此爲默認值(相反的選項設置爲- -float)
- -nocolor 禁用顏色(意味着選項 - -noupdate)
- -noheaders 禁止重複輸出header,默認會打印一屏幕輸出一次header
- -noupdate 當delay>1時禁止在過程中更新(即在時間間隔內不允許更新)
- -output file 輸出結果到cvs文件中
命令參數
參數名稱 參數描述
delay 兩次輸出之間的時間間隔,默認是1s
count 報告輸出的次數,默認是沒有限制,一直輸出知道ctrl+c
命令插件
雖然anyone可以自由的爲dstat編寫插件,但dstat附帶大量的插件已經大大擴展其功能,下面是dstat附帶插件的一個概述:
插件名稱 插件描述
- -battery 電池電池百分比(需要ACPI)
- -battery-remain 電池剩餘小時、分鐘(需要ACPI)
- -cpufreq CPU頻率百分比(需要ACPI)
- -dbus dbus連接的數量(需要python-dbus)
- -disk-util 顯示某一時間磁盤的忙碌狀況
- -fan 風扇轉速(需要ACPI)
- -freespace 每個文件系統的磁盤使用情況
- -gpfs gpfs讀/寫 I / O(需要mmpmon)
- -gpfs-ops GPFS文件系統操作(需要mmpmon)
- -helloworld dstat插件Hello world示例
- -innodb-buffer 顯示innodb緩衝區統計
- -innodb-io 顯示innodb I / O統計數據
- -innodb-ops 顯示innodb操作計數器
- -lustre 顯示lustreI / O吞吐量
- -memcache-hits 顯示memcache 的命中和未命中的數量
- -mysql5-cmds 顯示MySQL5命令統計
- -mysql5-conn 顯示MySQL5連接統計
- -mysql5-io MySQL5 I / O統計數據
- -mysql5-keys 顯示MySQL5關鍵字統計
- -mysql-io 顯示MySQL I / O統計數據
- -mysql-keys 顯示MySQL關鍵字統計
- -net-packets 顯示接收和發送的數據包的數量
- -nfs3 顯示NFS v3客戶端操作
- -nfs3-ops 顯示擴展NFS v3客戶端操作
- -nfsd3 顯示NFS v3服務器操作
- -nfsd3-ops 顯示擴展NFS v3服務器操作
- -ntp 顯示NTP服務器的ntp時間
- -postfix 顯示後綴隊列大小(需要後綴)
- -power 顯示電源使用量
- -proc-count 顯示處理器的總數
- -rpc 顯示rpc客戶端調用統計
- -rpcd 顯示RPC服務器調用統計
- -sendmail 顯示sendmail隊列大小(需要sendmail)
- -snooze 顯示每秒運算次數
- -test 顯示插件輸出
- -thermal 熱系統的溫度傳感器
- -top-bio 顯示消耗塊I/O最大的進程
- -top-cpu 顯示消耗CPU最大的進程
- -top-cputime 顯示使用CPU時間最大的進程(單位ms)
- -top-cputime-avg 顯示使用CPU時間平均最大的進程(單位ms)
- -top-io 顯示消耗I/O最大進程
- -top-latency 顯示總延遲最大的進程(單位ms)
- -top-latency-avg 顯示平均延時最大的進程(單位ms)
- -top-mem 顯示使用內存最大的進程
- -top-oom 顯示第一個被OOM結束的進程
- -utmp 顯示utmp連接的數量(需要python-utmp)
- -vmk-hba 顯示VMware ESX內核vmhba統計數
- -vmk-int 顯示VMware ESX內核中斷數據
- -vmk-nic 顯示VMware ESX內核端口統計
- -vz-io 顯示每個OpenVZ請求CPU使用率
- -vz-ubc 顯示OpenVZ用戶統計
- -wifi 無線連接質量和信號噪聲比
常用插件
插件名稱 插件描述
- -disk-util 顯示某一時間磁盤的忙碌狀況
- -freespace 顯示當前磁盤空間使用率
- -proc-count 顯示正在運行的程序數量
- -top-bio 顯示塊I/O最大的進程
- -top-cpu 顯示CPU佔用最大的進程
- -top-io 顯示正常I/O最大的進程
- -top-mem 顯示佔用最多內存的進程
舉一些例子:
內存資源使用情況:
dstat -glms --top-mem
CPU資源使用情況:
dstat -cyl --proc-count --top-cpu
輸出一個csv文件:
dstat --output ~/test.csv
如想監控 swap,process,sockets,filesystem 並顯示監控的時間:
若要將結果輸出到文件可以加 --output filename:
這樣生成的 csv 文件可以用 excel 打開,然後生成圖表。
通過 dstat --list 可以查看 dstat 能使用的所有參數,其中上面 internal 是 dstat 本身自帶的一些監控參數,下面 /usr/share/dstat 中是 dstat 的插件,這些插件可以擴展 dstat 的功能,如可以監控電源(battery)、mysql 等。
下面這些插件並不是都可以直接使用的,有的還依賴其他包,如想監控 mysql,必須要裝 python 連接 mysql 的一些包。
常見問題:
1、cpu分組中”wait”,如果一直處於高使用率,那說明系統存在一些其它問題。當CPU的狀態處在”waits”時,那是因爲它正在等待I/O設備(例如內存,磁盤或者網絡)的響應而且還沒有收到。
2、CPU的使用情況是否正常:用戶態和內核態的使用是否合理;總體佔比是否合理;若不合理可以用dstat對應的插件(- -top-cpu)排查最耗CPU的進程,配合mpstat、top再去下鑽一下分析線程,進一步到程序(比如java可以jstack)。
3、磁盤IO讀寫是否正常:讀寫是否偏大;若不正常可以配合插件- -disk-util、- -freespace、- -top-bio、- -top-io等進行排查,也可以配合iostat排查
3、內存是否正常:一般要配合交換區內存一起判斷,若不正常可以配合插件- -top-mem,可能是開啓的進程太多,或者第三方程序搗亂。
4、應用程序內存是否正常:配合業務表現比如請求響應慢、沒反應等,在結合第三方程序監控(如java可以用jvm監控工具(jprofiler、jconsole、jvisualvm……)監控內存)此種情況和3還不太一樣,一個jvm內存一個sys內存
5、分頁指的是一種內存管理技術用於查找系統場景,一個較大的分頁表明系統正在使用大量的交換空間,或者說內存非常分散,大多數情況下你都希望看到page in(換入)和page out(換出)的值都是0。
6、系統統計僅在有比較基線時纔有意義。中斷和上下文切換較高的統計值通常表示大量的進程造成擁塞,需要對CPU進行關注。服務器一般情況下都會運行運行一些程序,所以這項總是顯示一些數值。
7、使用不同的插件可以快速排查有問題的進程然後配合其他工具下鑽具體問題,當然這個需要建立在你對所有的插件都比較熟悉的基礎之上,知道什麼情況下使用什麼插件。技巧:可以將常用的命令寫成腳本,執行分析,這樣就不用每次都敲了。