Linux磁盤I/O性能監控——iostat

iostat命令可以查看CPU利用率和磁盤性能相關數據,有時候我們會覺得系統響應慢,傳數據很慢,這個慢可能是多方面原因導致的,如CPU利用率高、網絡差、系統平均負載高甚至是磁盤已經損壞了。對此,系統性能出問題時,磁盤I/O是一個值得重點分析的重要指標。
  命令的使用方法很簡單,但是要關注哪些報告值,報告的各個含義是什麼,這個是必須要搞清楚的。對於Linux 塊I/O不清楚的,可以參看我之前的文章: Linux內核之快I/O層

一、iostat命令使用
1.1 命令默認報告
默認報告CPU和磁盤的使用情況
以 blocks/s(塊每秒)的形式報告利用率
默認只報告一次使用情況。可通過傳參修改報告時間和次數。如:iostat 2 3,這表示每2秒報告一次,共計報告3次
1.2 常用選項
-c 只顯示CPU利用率
-d 只顯示磁盤利用率
-p 可以報告出每塊磁盤的每個分區的使用情況
-k 以 字節/秒 爲單位顯示磁盤利用率報告
-x 顯示擴張統計
-n 顯示NFS(network filesystem)報告

1.3 各個報告結果字段含義
磁盤相關字段(磁盤性能指標)
tps 每秒I/O數(即IOPS。磁盤連續讀和連續寫之和)

Blk_read/s 每秒從設備讀取的數據大小,單位是block/s(塊每秒)
Blk_wrtn/s 每秒寫入設備的數量,單位是block/s
Blk_read 從磁盤讀出的塊的總數
Blk_wrtn 寫入磁盤的塊的總數

kB_read/s 每秒從磁盤讀取數據大小,單位KB/s
kB_wrtn/s 每秒寫入磁盤的數據的大小,單位KB/s
kB_read 從磁盤讀出的數據總數,單位KB
kB_wrtn 寫入磁盤的的數據總數,單位KB

rrqm/s 每秒合併到設備的讀取請求數
wrqm/s 每秒合併到設備的寫請求數

r/s 每秒向磁盤發起的讀操作數。
w/s 每秒向磁盤發起的寫操作數。
rsec/s 每秒從設備讀取的扇區數量。
wsec/s 每秒向設備寫入的扇區數量。

avgrq-sz I/O 請求的平均大小,以扇區爲單位,扇區個數。
avgqu-sz 向設備發起的I/O 請求隊列的的平均隊列長度

await I/O 請求的平均等待時間,單位爲毫秒。這個時間包括請求隊列(這個概念很重要)消耗的時間和爲每個請求服務的時間
svctm I/O 請求的平均服務時間,單位爲毫秒(這個數據不可信!)
%util 處理 I/O 請求所佔用的時間的百分比,即設備利用率。I/O請求期間CPU時間的百分比(即設備的帶寬利用率)。當這個值接近100%時,表示磁盤I/O已經飽和

這裏有一個比較重要的概念就是請求隊列,這點我在之前的文章中已經講過了,不清楚的可以看文章開頭的鏈接

1.4 常用組合
iostat -d -x
iostat -d 2 10
iostat -d -x 2 10
iostat -d -x -k 2 10

命令後的第一個數字表示報告時間間隔,第二個數字表示報告總次數
我一般用的多的是iostat -d -x ,因爲這個報告的數據時從系統開機時的一個整體情況,如果加了時間和次數後,後續報告的數據就是設置的時間內磁盤使用情況變化。如果需要一直觀察的話,可以使用iostat -d -x

如:

[root@master dev]# iostat -d -x 2 2
Linux 2.6.32-431.el6.x86_64 (master) 02/22/2017 _x86_64_ (2 CPU)

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
scd0 0.01 0.00 0.01 0.00 0.16 0.00 29.65 0.00 6.35 6.18 0.00
sda 0.39 0.51 1.05 0.31 37.88 6.59 32.62 0.00 2.53 1.04 0.14

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.50 0.00 0.50 0.00 7.96 16.00 0.01 16.00 16.00 0.80

二、磁盤I/O性能監控指標
  磁盤I/O性能主要監控的指標有如下幾類:
1. 磁盤吞吐量。硬盤傳輸數據的能力,傳輸數據是讀、寫數據之和。當傳輸大塊不連續數據時,該值可做參考。
吞吐量計算公式:

I/O吞吐量 = IOPS * 平均I/O數據大小(size)

注意:IOPS就是tps,即每秒I/O數
  從公式可以看出,IOPS和平均數據大小越大,吞吐量則越大。

2. IOPS。磁盤每秒的I/O數(讀、寫之和)。當傳輸小塊不連續數據時,該值可作爲參考對象。在iostat報告中,tps=r/s+w/s

3. 數據平均大小。平均 I/O 數據尺寸爲吞吐量除以 I/O 數目,該指標對揭示磁盤使用模式有重要意義。一般來說,如果平均 I/O 數據尺寸小於 32K,可認爲磁盤使用模式以隨機存取爲主;如果平均每次 I/O 數據尺寸大於 32K,可認爲磁盤使用模式以順序存取爲主。
備註:iostat命令輸出的平均尺寸是以扇區爲單位的,因此,轉換成字節時,應該用 512 x 扇區數

4. 磁盤活動時間比 . 該值對用iostat輸出的%util字段,表示磁盤處於活動時間的百分比,即磁盤利用率,磁盤在數據傳輸和處理命令(如尋道)處於活動狀態。磁盤利用率與資源爭用程度成正比,與性能成反比。也就是說磁盤利用率越高,資源爭用就越嚴重,性能也就越差,響應時間就越長。一般來說,如果磁盤利用率超過 70%,應用進程將花費較長的時間等待 I/O 完成,因爲絕大多數進程在等待過程中將被阻塞或休眠。

5. 服務時間。指磁盤讀或寫操作執行的時間,包括尋道,旋轉時延,和數據傳輸等時間。其大小一般和磁盤性能有關,CPU/ 內存的負荷也會對其有影響,請求過多也會間接導致服務時間的增加。如果該值持續超過 20ms,一般可考慮會對上層應用產生影響。

6. I/O 等待隊列長度。對用iostat輸出的avgqu-sz。指待處理的 I/O 請求的數目,如果 I/O 請求壓力持續超出磁盤處理能力,該值將增加。如果單塊磁盤的隊列長度持續超過 2,一般認爲該磁盤存在 I/O 性能問題。需要注意的是,如果該磁盤爲磁盤陣列虛擬的邏輯驅動器,需要再將該值除以組成這個邏輯驅動器的實際物理磁盤數目,以獲得平均單塊硬盤的 I/O 等待隊列長度。

7. 等待時間。對應iostat輸出的await字段。指磁盤讀或寫操作等待執行的時間,即在隊列中排隊的時間。如果 I/O 請求持續超出磁盤處理能力,意味着來不及處理的 I/O 請求不得不在隊列中等待較長時間。

  這裏我重點講下吞吐量和IOPS(tps)。爲什麼呢?因爲不同的業務場景,所需要的磁盤性能側重點不同。對於磁盤隨機讀寫頻繁的業務,比如圖片存取、數據庫、郵件服務器等,此類業務嗎,IOPS纔是關鍵點。對於順序讀寫頻繁的業務,需要傳輸大塊數據的,如視頻點播、文件同步,關注的是磁盤的吞吐量。——如果平均 I/O 數據尺寸小於 32K,可認爲磁盤使用模式是以隨機存取爲主(關注IOPS);如果平均每次 I/O 數據尺寸大於 32K,可認爲磁盤使用模式以順序存取爲主(關注吞吐量)。
  對上述論述可以做一個測試:寫10MB文件,一個做法是一次寫1024B,寫10000次。第二個是一次寫1B,寫10240000次,測試結果如下:

[root@master dev]# dd if=/dev/zero of=/dev/null bs=1024 count=10000
10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.00982995 s, 1.0 GB/s
[root@master dev]# dd if=/dev/zero of=/dev/null bs=1 count=10240000
10240000+0 records in
10240000+0 records out
10240000 bytes (10 MB) copied, 7.95257 s, 1.3 MB/s

從結果看出,寫大塊數據和寫小塊數據,吞吐量是不一樣的。耗時相差也是很大。

在進行磁盤性能分析時要注意下各個指標之間的關係,結合iostat是要注意換算。

三、 磁盤性能怎麼解決?
  關於這點,我能想到的就是以下幾種:
1. raid
2. 磁盤緩存、緩衝(內核層面,頁高速緩存、緩衝)
3. 利用現有的一些開源軟件緩存數據,如redis
  其實牽扯到緩存的話,就是讓程序直接和內存打交道,儘量避免去直接訪問磁盤。但是有的情況下, 直接I/O(跳過緩存)又是業務所需求的,關於這點,具體問題具體分析吧。。。

 

四、iostat輸出內容參數介紹

[root@host-47-106-141-17 ~]# iostat -d -k -x 1
Linux 3.10.0-693.2.2.el7.x86_64 (host-47-106-141-17) 06/20/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.32 0.05 0.56 0.80 3.80 15.21 1.23 3.41 1.41 3.58 0.67 0.04

對於以上示例輸出,我們可以獲取到以下信息:
每秒向磁盤上寫3.8kb左右數據(wkB/s值)
每秒有0.61次IO操作(r/s+w/s=0.05+0.56),其中以寫操作爲主體
平均每次IO請求等待時間爲3.58毫秒(await),處理時間爲0.67毫秒
等待處理的IO請求隊列中,平均有1.23(avgqu-sz)個請求駐留

選項 說明
%user CPU在用戶態執行進程的時間百分比。
%nice CPU在用戶態模式下,用於nice操作,所佔用CPU總時間的百分比
%system CPU處在內核態執行進程的時間百分比
%iowait CPU用於等待I/O操作佔用CPU總時間的百分比
%steal 管理程序(hypervisor)爲另一個虛擬進程提供服務而等待虛擬CPU的百分比
%idle CPU空閒時間百分比
注:
1. 若 %iowait 的值過高,表示硬盤存在I/O瓶頸
2. 若 %idle 的值高但系統響應慢時,有可能是CPU等待分配內存,此時應加大內存容量
3. 若 %idle 的值持續低於1,則系統的CPU處理能力相對較低,表明系統中最需要解決的資源是 CPU


選項 說明
rrqm/s: 每秒進行 merge 的讀操作數目.即 delta(rmerge)/s
wrqm/s: 每秒進行 merge 的寫操作數目.即 delta(wmerge)/s
r/s: 每秒完成的讀 I/O 設備次數.即 delta(rio)/s
w/s: 每秒完成的寫 I/O 設備次數.即 delta(wio)/s
rsec/s: 每秒讀扇區數.即 delta(rsect)/s
wsec/s: 每秒寫扇區數.即 delta(wsect)/s
rkB/s: 每秒讀K字節數.是 rsect/s 的一半,因爲每扇區大小爲512字節.(需要計算)
wkB/s: 每秒寫K字節數.是 wsect/s 的一半.(需要計算)
avgrq-sz:平均每次設備I/O操作的數據大小 (扇區).delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:平均I/O隊列長度.即 delta(aveq)/s/1000 (因爲aveq的單位爲毫秒).
await: 平均每次設備I/O操作的等待時間 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次設備I/O操作的服務時間 (毫秒).即 delta(use)/delta(rio+wio)
%util:在 I/O 請求發送到設備期間,佔用 CPU 時間的百分比。用於體現設備的帶寬利用率。

注:
1. avgqu-sz 的值較低時,設備的利用率較高。
2. 當 %util 的值接近 100% 時,表示設備帶寬已經佔滿。

 

作者:東城絕神
來源:CSDN
原文:https://blog.csdn.net/m0_37814112/article/details/80661481
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章