Linux系統(tǒng)出現(xiàn)了性能問(wèn)題,一般我們可以通過(guò)top、iostat、free、vmstat等命令來(lái)查看初步定位問(wèn)題。其中iostat可以給我們提供豐富的IO狀態(tài)數(shù)據(jù)。
1. 基本使用
$iostat -d -k 1 10
參數(shù) -d 表示,顯示設(shè)備(磁盤(pán))使用狀態(tài);-k某些使用block為單位的列強(qiáng)制使用Kilobytes為單位;1 10表示,數(shù)據(jù)顯示每隔1秒刷新一次,共顯示10次。
$iostat -d -k 1 10Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 39.29 21.14 1.44 441339807 29990031sda1 0.00 0.00 0.00 1623 523sda2 1.32 1.43 4.54 29834273 94827104sda3 6.30 0.85 24.95 17816289 520725244sda5 0.85 0.46 3.40 9543503 70970116sda6 0.00 0.00 0.00 550 236sda7 0.00 0.00 0.00 406 0sda8 0.00 0.00 0.00 406 0sda9 0.00 0.00 0.00 406 0sda10 60.68 18.35 71.43 383002263 1490928140Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 327.55 5159.18 102.04 5056 100sda1 0.00 0.00 0.00 0 0
tps:該設(shè)備每秒的傳輸次數(shù)(Indicate the number of transfers per second that were issued to the device.)?!耙淮蝹鬏敗币馑际恰耙淮蜪/O請(qǐng)求”。多個(gè)邏輯請(qǐng)求可能會(huì)被合并為“一次I/O請(qǐng)求”。“一次傳輸”請(qǐng)求的大小是未知的。
kB_read/s:每秒從設(shè)備(drive expressed)讀取的數(shù)據(jù)量;kB_wrtn/s:每秒向設(shè)備(drive expressed)寫(xiě)入的數(shù)據(jù)量;kB_read:讀取的總數(shù)據(jù)量;kB_wrtn:寫(xiě)入的總數(shù)量數(shù)據(jù)量;這些單位都為Kilobytes。
上面的例子中,我們可以看到磁盤(pán)sda以及它的各個(gè)分區(qū)的統(tǒng)計(jì)數(shù)據(jù),當(dāng)時(shí)統(tǒng)計(jì)的磁盤(pán)總TPS是39.29,下面是各個(gè)分區(qū)的TPS。(因?yàn)槭撬查g值,所以總TPS并不嚴(yán)格等于各個(gè)分區(qū)TPS的總和)
2. -x 參數(shù)
使用-x參數(shù)我們可以獲得更多統(tǒng)計(jì)信息。
iostat -d -x -k 1 10Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilsda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilsda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20
rrqm/s:每秒這個(gè)設(shè)備相關(guān)的讀取請(qǐng)求有多少被Merge了(當(dāng)系統(tǒng)調(diào)用需要讀取數(shù)據(jù)的時(shí)候,VFS將請(qǐng)求發(fā)到各個(gè)FS,如果FS發(fā)現(xiàn)不同的讀取請(qǐng)求讀取的是相同Block的數(shù)據(jù),F(xiàn)S會(huì)將這個(gè)請(qǐng)求合并Merge);wrqm/s:每秒這個(gè)設(shè)備相關(guān)的寫(xiě)入請(qǐng)求有多少被Merge了。
rsec/s:每秒讀取的扇區(qū)數(shù);wsec/:每秒寫(xiě)入的扇區(qū)數(shù)。r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;
await:每一個(gè)IO請(qǐng)求的處理的平均時(shí)間(單位是微秒毫秒)。這里可以理解為IO的響應(yīng)時(shí)間,一般地系統(tǒng)IO響應(yīng)時(shí)間應(yīng)該低于5ms,如果大于10ms就比較大了。
%util:在統(tǒng)計(jì)時(shí)間內(nèi)所有處理IO時(shí)間,除以總共統(tǒng)計(jì)時(shí)間。例如,如果統(tǒng)計(jì)間隔1秒,該設(shè)備有0.8秒在處理IO,而0.2秒閑置,那么該設(shè)備的%util = 0.8/1 = 80%,所以該參數(shù)暗示了設(shè)備的繁忙程度。一般地,如果該參數(shù)是100%表示設(shè)備已經(jīng)接近滿負(fù)荷運(yùn)行了(當(dāng)然如果是多磁盤(pán),即使%util是100%,因?yàn)榇疟P(pán)的并發(fā)能力,所以磁盤(pán)使用未必就到了瓶頸)。
3. -c 參數(shù)
iostat還可以用來(lái)獲取cpu部分狀態(tài)值:
iostat -c 1 10 avg-cpu: %user %nice %sys %iowait %idle 1.98 0.00 0.35 11.45 86.22 avg-cpu: %user %nice %sys %iowait %idle 1.62 0.00 0.25 34.46 63.67
4. 常見(jiàn)用法
$iostat -d -k 1 10 #查看TPS和吞吐量信息iostat -d -x -k 1 10 #查看設(shè)備使用率(%util)、響應(yīng)時(shí)間(await)iostat -c 1 10 #查看cpu狀態(tài)
5. 實(shí)例分析
$$iostat -d -k 1 |grep sda10Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda10 60.72 18.95 71.53 395637647 1493241908sda10 299.02 4266.67 129.41 4352 132sda10 483.84 4589.90 4117.17 4544 4076sda10 218.00 3360.00 100.00 3360 100sda10 546.00 8784.00 124.00 8784 124sda10 827.00 13232.00 136.00 13232 136
上面看到,磁盤(pán)每秒傳輸次數(shù)平均約400;每秒磁盤(pán)讀取約5MB,寫(xiě)入約1MB。
iostat -d -x -k 1Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilsda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24
可以看到磁盤(pán)的平均響應(yīng)時(shí)間<5ms,磁盤(pán)使用率>80。磁盤(pán)響應(yīng)正常,但是已經(jīng)很繁忙了。