主頁(yè) > 知識(shí)庫(kù) > 容易被誤讀的iostat(Linux系統(tǒng))

容易被誤讀的iostat(Linux系統(tǒng))

熱門(mén)標(biāo)簽:百度競(jìng)價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 解決方案 外呼系統(tǒng) 服務(wù)器配置 美團(tuán) 家政服務(wù)網(wǎng)絡(luò) 電話機(jī)器人搭建 硅谷的囚徒呼叫中心

iostat主要用于報(bào)告中央處理器(CPU)統(tǒng)計(jì)信息和整個(gè)系統(tǒng)、適配器、tty 設(shè)備、磁盤(pán)和 CD-ROM 的輸入/輸出統(tǒng)計(jì)信息,下面小編就為大家具體的講解Linux系統(tǒng)中容易被誤讀的IOSTAT。

iostat(1)是在Linux系統(tǒng)上查看I/O性能最基本的工具,然而對(duì)于那些熟悉其它UNIX系統(tǒng)的人來(lái)說(shuō)它是很容易被誤讀的。比如在HP-UX上 avserv(相當(dāng)于Linux上的 svctm)是最重要的I/O指標(biāo),反映了硬盤(pán)設(shè)備的性能,它是指I/O請(qǐng)求從SCSI層發(fā)出、到I/O完成之后返回SCSI層所消耗的時(shí)間,不包括在SCSI隊(duì)列中的等待時(shí)間,所以avserv體現(xiàn)了硬盤(pán)設(shè)備處理I/O的速度,又被稱為disk service time,如果avserv很大,那么肯定是硬件出問(wèn)題了。然而Linux上svctm的含義截然不同,事實(shí)上在iostat(1)和sar(1)的man page上都說(shuō)了不要相信svctm,該指標(biāo)將被廢棄:

“Warning! Do not trust this field any more. This field will be removed in a future sysstat version.”

在Linux上,每個(gè)I/O的平均耗時(shí)是用await表示的,但它不能反映硬盤(pán)設(shè)備的性能,因?yàn)閍wait不僅包括硬盤(pán)設(shè)備處理I/O的時(shí)間,還包括了在隊(duì)列中等待的時(shí)間。I/O請(qǐng)求在隊(duì)列中的時(shí)候尚未發(fā)送給硬盤(pán)設(shè)備,即隊(duì)列中的等待時(shí)間不是硬盤(pán)設(shè)備消耗的,所以說(shuō)await體現(xiàn)不了硬盤(pán)設(shè)備的速度,內(nèi)核的問(wèn)題比如I/O調(diào)度器什么的也有可能導(dǎo)致await變大。那么有沒(méi)有哪個(gè)指標(biāo)可以衡量硬盤(pán)設(shè)備的性能呢?非常遺憾的是,iostat(1)和sar(1)都沒(méi)有,這是因?yàn)樗鼈兯蕾嚨?proc/diskstats不提供這項(xiàng)數(shù)據(jù)。要真正理解iostat的輸出結(jié)果,應(yīng)該從理解/proc/diskstats開(kāi)始。

# cat /proc/diskstats
   8       0 sda 239219 1806 37281259 2513275 904326 88832 50268824 26816609 0 4753060 29329105
   8       1 sda1 338 0 53241 6959 154 0 5496 3724 0 6337 10683
   8       2 sda2 238695 1797 37226458 2504489 620322 88832 50263328 25266599 0 3297988 27770221
   8      16 sdb 1009117 481 1011773 127319 0 0 0 0 0 126604 126604
   8      17 sdb1 1008792 480 1010929 127078 0 0 0 0 0 126363 126363
 253       0 dm-0 1005 0 8040 15137 30146 0 241168 2490230 0 30911 2505369
 253       1 dm-1 192791 0 35500457 2376087 359162 0 44095600 22949466 0 2312433 25325563
 253       2 dm-2 47132 0 1717329 183565 496207 0 5926560 7348763 0 2517753 7532688

/proc/diskstats有11個(gè)字段,以下內(nèi)核文檔解釋了它們的含義https://www.kernel.org/doc/Documentation/iostats.txt,我重新表述了一下,注意除了字段#9之外都是累計(jì)值,從系統(tǒng)啟動(dòng)之后一直累加:

(rd_ios)讀操作的次數(shù)。(rd_merges)合并讀操作的次數(shù)。如果兩個(gè)讀操作讀取相鄰的數(shù)據(jù)塊時(shí),可以被合并成一個(gè),以提高效率。合并的操作通常是I/O scheduler(也叫elevator)負(fù)責(zé)的。(rd_sectors)讀取的扇區(qū)數(shù)量。(rd_ticks)讀操作消耗的時(shí)間(以毫秒為單位)。每個(gè)讀操作從__make_request()開(kāi)始計(jì)時(shí),到end_that_request_last()為止,包括了在隊(duì)列中等待的時(shí)間。(wr_ios)寫(xiě)操作的次數(shù)。(wr_merges)合并寫(xiě)操作的次數(shù)。(wr_sectors)寫(xiě)入的扇區(qū)數(shù)量。(wr_ticks)寫(xiě)操作消耗的時(shí)間(以毫秒為單位)。(in_flight)當(dāng)前未完成的I/O數(shù)量。在I/O請(qǐng)求進(jìn)入隊(duì)列時(shí)該值加1,在I/O結(jié)束時(shí)該值減1。

注意:是I/O請(qǐng)求進(jìn)入隊(duì)列時(shí),而不是提交給硬盤(pán)設(shè)備時(shí)。(io_ticks)該設(shè)備用于處理I/O的自然時(shí)間(wall-clock time)。

請(qǐng)注意io_ticks與rd_ticks(字段#4)和wr_ticks(字段#8)的區(qū)別,rd_ticks和wr_ticks是把每一個(gè)I/O所消耗的時(shí)間累加在一起,因?yàn)橛脖P(pán)設(shè)備通??梢圆⑿刑幚矶鄠€(gè)I/O,所以rd_ticks和wr_ticks往往會(huì)比自然時(shí)間大。而io_ticks表示該設(shè)備有I/O(即非空閑)的時(shí)間,不考慮I/O有多少,只考慮有沒(méi)有。在實(shí)際計(jì)算時(shí),字段#9(in_flight)不為零的時(shí)候io_ticks保持計(jì)時(shí),字段#9(in_flight)為零的時(shí)候io_ticks停止計(jì)時(shí)。(time_in_queue)對(duì)字段#10(io_ticks)的加權(quán)值。字段#10(io_ticks)是自然時(shí)間,不考慮當(dāng)前有幾個(gè)I/O,而time_in_queue是用當(dāng)前的I/O數(shù)量(即字段#9 in-flight)乘以自然時(shí)間。雖然該字段的名稱是time_in_queue,但并不真的只是在隊(duì)列中的時(shí)間,其中還包含了硬盤(pán)處理I/O的時(shí)間。iostat在計(jì)算avgqu-sz時(shí)會(huì)用到這個(gè)字段。

iostat(1)是以/proc/diskstats為基礎(chǔ)計(jì)算出來(lái)的,因?yàn)?proc/diskstats并未把隊(duì)列等待時(shí)間和硬盤(pán)處理時(shí)間分開(kāi),所以凡是以它為基礎(chǔ)的工具都不可能分別提供disk service time以及與queue有關(guān)的值。

注:下面的公式中“Δ”表示兩次取樣之間的差值,“Δt”表示采樣周期。

r/s:每秒讀操作的次數(shù)=[Δrd_ios/Δt]r/s:每秒讀操作的次數(shù)=[Δwr_ios/Δt]tps:每秒I/O次數(shù)=[(Δrd_ios+Δwr_ios)/Δt]rkB/s:每秒讀取的千字節(jié)數(shù)=[Δrd_sectors/Δt]*[512/1024]wkB/s:每秒寫(xiě)入的千字節(jié)數(shù)=[Δwr_sectors/Δt]*[512/1024]rrqm/s:每秒合并讀操作的次數(shù)=[Δrd_merges/Δt]wrqm/s:每秒合并寫(xiě)操作的次數(shù)=[Δwr_merges/Δt]avgrq-sz:每個(gè)I/O的平均扇區(qū)數(shù)=[Δrd_sectors+Δwr_sectors]/[Δrd_ios+Δwr_ios]avgqu-sz:隊(duì)列里的平均I/O請(qǐng)求數(shù)量=[Δtime_in_queue/Δt]

(更恰當(dāng)?shù)睦斫鈶?yīng)該是平均未完成的I/O請(qǐng)求數(shù)量。)await:每個(gè)I/O平均所需的時(shí)間=[Δrd_ticks+Δwr_ticks]/[Δrd_ios+Δwr_ios]

不僅包括硬盤(pán)設(shè)備處理I/O的時(shí)間,還包括了在kernel隊(duì)列中等待的時(shí)間。r_await:每個(gè)讀操作平均所需的時(shí)間=[Δrd_ticks/Δrd_ios]

不僅包括硬盤(pán)設(shè)備讀操作的時(shí)間,還包括了在kernel隊(duì)列中等待的時(shí)間。w_await:每個(gè)寫(xiě)操作平均所需的時(shí)間=[Δwr_ticks/Δwr_ios]

不僅包括硬盤(pán)設(shè)備寫(xiě)操作的時(shí)間,還包括了在kernel隊(duì)列中等待的時(shí)間。%util:該硬盤(pán)設(shè)備的繁忙比率=[Δio_ticks/Δt]

表示該設(shè)備有I/O(即非空閑)的時(shí)間比率,不考慮I/O有多少,只考慮有沒(méi)有。svctm:已被廢棄的指標(biāo),沒(méi)什么意義,svctm=[util/tput]

對(duì)iostat(1)的恰當(dāng)解讀有助于正確地分析問(wèn)題,我們結(jié)合實(shí)際案例進(jìn)一步討論。

關(guān)于rrqm/s和wrqm/s

前面講過(guò),如果兩個(gè)I/O操作發(fā)生在相鄰的數(shù)據(jù)塊時(shí),它們可以被合并成一個(gè),以提高效率,合并的操作通常是I/O scheduler(也叫elevator)負(fù)責(zé)的。

以下案例對(duì)許多硬盤(pán)設(shè)備執(zhí)行同樣的壓力測(cè)試,結(jié)果惟有sdb比其它硬盤(pán)都更快一些,可是硬盤(pán)型號(hào)都一樣,為什么sdb的表現(xiàn)不一樣?

可以看到其它硬盤(pán)的rrqm/s都為0,而sdb不是,就是說(shuō)發(fā)生了I/O合并,所以效率更高,r/s和rMB/s都更高,我們知道I/O合并是內(nèi)核的I/O scheduler(elevator)負(fù)責(zé)的,于是檢查了sdb的/sys/block/sdb/queue/scheduler,發(fā)現(xiàn)它與別的硬盤(pán)用了不同的I/O scheduler,所以表現(xiàn)也不一樣。

%util與硬盤(pán)設(shè)備飽和度

%util表示該設(shè)備有I/O(即非空閑)的時(shí)間比率,不考慮I/O有多少,只考慮有沒(méi)有。由于現(xiàn)代硬盤(pán)設(shè)備都有并行處理多個(gè)I/O請(qǐng)求的能力,所以%util即使達(dá)到100%也不意味著設(shè)備飽和了。舉個(gè)簡(jiǎn)化的例子:某硬盤(pán)處理單個(gè)I/O需要0.1秒,有能力同時(shí)處理10個(gè)I/O請(qǐng)求,那么當(dāng)10個(gè)I/O請(qǐng)求依次順序提交的時(shí)候,需要1秒才能全部完成,在1秒的采樣周期里%util達(dá)到100%;而如果10個(gè)I/O請(qǐng)求一次性提交的話,0.1秒就全部完成,在1秒的采樣周期里%util只有10%??梢?jiàn),即使%util高達(dá)100%,硬盤(pán)也仍然有可能還有余力處理更多的I/O請(qǐng)求,即沒(méi)有達(dá)到飽和狀態(tài)。那么iostat(1)有沒(méi)有哪個(gè)指標(biāo)可以衡量硬盤(pán)設(shè)備的飽和程度呢?很遺憾,沒(méi)有。

await多大才算有問(wèn)題

await是單個(gè)I/O所消耗的時(shí)間,包括硬盤(pán)設(shè)備處理I/O的時(shí)間和I/O請(qǐng)求在kernel隊(duì)列中等待的時(shí)間,正常情況下隊(duì)列等待時(shí)間可以忽略不計(jì),姑且把a(bǔ)wait當(dāng)作衡量硬盤(pán)速度的指標(biāo)吧,那么多大算是正常呢?

對(duì)于SSD,從0.0x毫秒到1.x毫秒不等,具體看產(chǎn)品手冊(cè);

對(duì)于機(jī)械硬盤(pán),可以參考以下文檔中的計(jì)算方法:

http://101.96.10.61/cseweb.ucsd.edu/classes/wi01/cse102/sol2.pdf

大致來(lái)說(shuō)一萬(wàn)轉(zhuǎn)的機(jī)械硬盤(pán)是8.38毫秒,包括尋道時(shí)間、旋轉(zhuǎn)延遲、傳輸時(shí)間。

在實(shí)踐中,要根據(jù)應(yīng)用場(chǎng)景來(lái)判斷await是否正常,如果I/O模式很隨機(jī)、I/O負(fù)載比較高,會(huì)導(dǎo)致磁頭亂跑,尋道時(shí)間長(zhǎng),那么相應(yīng)地await要估算得大一些;如果I/O模式是順序讀寫(xiě),只有單一進(jìn)程產(chǎn)生I/O負(fù)載,那么尋道時(shí)間和旋轉(zhuǎn)延遲都可以忽略不計(jì),主要考慮傳輸時(shí)間,相應(yīng)地await就應(yīng)該很小,甚至不到1毫秒。在以下實(shí)例中,await是7.50毫秒,似乎并不大,但考慮到這是一個(gè)dd測(cè)試,屬于順序讀操作,而且只有單一任務(wù)在該硬盤(pán)上,這里的await應(yīng)該不到1毫秒才算正常:

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdg               0.00     0.00  133.00    0.00  2128.00     0.00    16.00     1.00    7.50   7.49  99.60

對(duì)磁盤(pán)陣列來(lái)說(shuō),因?yàn)橛杏布彺?,?xiě)操作不等落盤(pán)就算完成,所以寫(xiě)操作的service time大大加快了,如果磁盤(pán)陣列的寫(xiě)操作不在一兩個(gè)毫秒以內(nèi)就算慢的了;讀操作則未必,不在緩存中的數(shù)據(jù)仍然需要讀取物理硬盤(pán),單個(gè)小數(shù)據(jù)塊的讀取速度跟單盤(pán)差不多

標(biāo)簽:邢臺(tái) 韶關(guān) 烏蘭察布 北海 南昌 臨沂 防城港 撫州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《容易被誤讀的iostat(Linux系統(tǒng))》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266