數據庫操做是磁盤IO密集型的論證

背景是咱們在數據庫進行大量的數據更新操做,速度比較慢,以此來查看磁盤的狀態狀況。ios

1、iostat

咱們查看磁盤IO,也主要是經過iostat 這個命令來進行查看。數據庫

iostat -d -k 1 5

-d 表示,顯示設備(磁盤)使用狀態,去掉能夠和CPU狀態一塊兒顯示;
-k某些使用block爲單位的列強制使用Kilobytes爲單位,改成-m(以MB爲單位展現);
1 5表示,數據顯示每隔1秒刷新一次,共顯示10次。express

[root@olap02 ~]# iostat -d -k 1 5
Linux 3.10.0-514.el7.x86_64      06/09/2018      _x86_64_        (32 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              10.53       319.13       488.33 8783422264 13440316927
dm-0              0.16         0.03         1.35     757398   37188411
dm-1              0.00         0.00         0.01     117580     301216
dm-2             10.41       319.10       486.97 8782517912 13402825288

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda            1028.00     18624.00     71374.50      18624      71374
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0
dm-2           1033.00     19392.00     71630.50      19392      71630

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             854.00     24464.00     70580.50      24464      70580
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0
dm-2            855.00     23696.00     70674.00      23696      70674

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             849.00     13312.00     87219.50      13312      87219
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0
dm-2            876.00     14336.00     87750.00      14336      87750

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             770.00     19456.00     70206.50      19456      70206
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0
dm-2            745.00     19456.00     69771.00      19456      69771

kB_read/s:每秒從設備(drive expressed)讀取的數據量;
kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;
kB_read:讀取的總數據量;
kB_wrtn:寫入的總數量數據量;這些單位都爲Kilobytes。服務器

參數-k

[root@olap02 ~]# iostat -d -x -k 1 
Linux 3.10.0-514.el7.x86_64    06/09/2018      _x86_64_        (32 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
sda               0.00     0.04    6.07    4.47   319.23   488.61   153.32     0.01    1.12    1.05    1.23   0.33   0.35
dm-0              0.00     0.00    0.00    0.16     0.03     1.35    17.12     0.00    0.19    1.78    0.17   0.03   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.01     8.01     0.00    0.43    0.42    0.43   0.03   0.00
dm-2              0.00     0.00    6.06    4.35   319.20   487.25   154.87     0.01    1.14    1.05    1.28   0.34   0.35

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   10.00  467.00  2080.00 10256.00    51.72   155.43  342.20  334.70  342.36   2.10 100.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    7.00  489.00  1312.00 11232.00    50.58   160.96  339.23  614.29  335.29   2.02 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    6.00  343.00  1056.00 10408.00    65.70   146.90  374.37  300.83  375.65   2.87 100.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    8.00  322.00  1808.00  6704.00    51.59   152.25  407.81  336.75  409.57   3.03 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    8.00  429.00  2048.00  4576.00    30.32   146.42  341.64  278.25  342.82   2.29 100.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    5.00  448.00  1280.00  7992.00    40.94   150.86  340.85  623.60  337.69   2.21 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    4.00  447.00  1024.00 10622.00    51.65   146.52  336.33  506.50  334.81   2.22 100.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    5.00  454.00  1040.00 11302.00    53.78   151.71  340.31  464.20  338.94   2.18 100.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    7.00  435.00  1072.00 13248.00    64.80   146.15  351.56  252.86  353.15   2.26 100.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00   11.00  416.00  1856.00  9192.00    51.75   152.02  378.61  290.09  380.95   2.34 100.00

能夠看到磁盤的平均響應時間>300ms,磁盤使用率>100。磁盤響應不正常,IO已經滿負載了。ide

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 操做,或者說一秒中有多少時間 I/O 隊列是非空的.即 delta(use)/s/1000 (由於use的單位爲毫秒)性能

若是 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。
idle小於70% IO壓力就較大了,通常讀取速度有較多的wait. 測試

CPU的負載很低,磁盤接近100%,因此說大量的數據庫更新操做瓶頸在於磁盤IO。操作系統

若是svctm 比較接近await,說明I/O 幾乎沒有等待時間;
若是await 遠大於svctm,說明I/O隊列太長,應用獲得的響應時間變慢線程

2、舉例

舉一個例子,咱們在超市排隊 checkout 時,怎麼決定該去哪一個交款臺呢? 首當是看排的隊人數,5我的總比20人要快吧?除了數人頭,咱們也經常看看前面人購買的東西多少,若是前面有個採購了一星期食品的大媽,那麼能夠考慮換個隊排了。還有就是收銀員的速度了,若是碰上了連錢都點不清楚的新手,那就有的等了。另外,時機也很重要,可能 5分鐘前還人滿爲患的收款臺,如今已經是人去樓空,這時候交款但是很爽啊,固然,前提是那過去的 5 分鐘裏所作的事情比排隊要有意義(不過我還沒發現什麼事情比排隊還無聊的)。code

I/O 系統也和超市排隊有不少相似之處:

r/s+w/s 相似於交款人的總數
平均隊列長度(avgqu-sz)相似於單位時間裏平均排隊人的個數
平均服務時間(svctm)相似於收銀員的收款速度
平均等待時間(await)相似於平均每人的等待時間
平均I/O數據(avgrq-sz)相似於平均每人所買的東西多少
I/O 操做率 (%util)相似於收款臺前有人排隊的時間比例。
咱們能夠根據這些數據分析出 I/O 請求的模式,以及 I/O 的速度和響應時間。

下面是別人寫的這個參數輸出的分析:

[root@olap02 ~]# iostat -x -m 1    
Linux 3.10.0-514.el7.x86_64     06/09/2018      _x86_64_        (32 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.64    0.00    3.95    6.15    0.00   86.25

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda             923.00    20.00  290.00   20.00     9.70     0.16    65.08     1.21    3.91    3.62    8.05   3.19  98.90

上面的 iostat 輸出代表秒有 310 次設備 I/O 操做: 總IO(io)/s = r/s(讀) +w/s(寫) = 290+20 = 310 (次/秒) 其中寫操做佔了主體 (w:r = 29:2)。
平均每次設備 I/O 操做只須要 5ms 就能夠完成,但每一個I/O 請求卻須要等上 78ms,爲何? 由於發出的 I/O 請求太多 (每秒鐘約29 個),假設這些請求是同時發出的,那麼平均等待時間能夠這樣計算:
平均等待時間 = 單個I/O 服務時間 ( 1 + 2 + ... + 請求總數-1) / 請求總數
應用到上面的例子: 平均等待時間 = 5ms
(1+2+...+28)/29 = 70ms,和 iostat 給出的78ms 的平均等待時間很接近。這反過來代表 I/O 是同時發起的。
每秒發出的 I/O 請求不少 (約29 個),平均隊列卻不長 (只有2 個左右),這代表這 29 個請求的到來並不均勻,大部分時間 I/O是空閒的。
一秒中有 14.29% 的時間 I/O 隊列中是有請求的,也就是說,85.71% 的時間裏 I/O 系統無事可作,全部 29 個I/O 請求都在142毫秒以內處理掉了。
delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s=78.21 delta(io)/s = 78.2128.57 =2232.8,代表每秒內的I/O請求總共須要等待2232.8ms。因此平均隊列長度應爲 2232.8ms/1000ms = 2.23,而iostat 給出的平均隊列長度(avgqu-sz) 卻爲22.35,爲何?由於iostat 中有bug,avgqu-sz值應爲2.23,而不是22.35。

※附帶說明下,我用iostat對服務器檢測時,通常用iostat -d命令;而返回的結果,我關注的通常是tps、blk_read/s、blk_wrth/s這三項,我通常是拿三臺不一樣型號的服務器在相同環境下做對比測試,這樣性能上的差別,一會兒就出來了。

3、磁盤IOPS與讀寫速度

IOPS (Input/Output Per Second)即每秒的輸入輸出量(或讀寫次數),是衡量磁盤性能的主要指標之一。IOPS是指單位時間內系統能處理的I/O請求數量,通常以每秒處理的I/O請求數量爲單位,I/O請求一般爲讀或寫數據操做請求。隨機讀寫頻繁的應用,如OLTP(Online Transaction Processing),IOPS是關鍵衡量指標。另外一個重要指標是數據吞吐量(Throughput),指單位時間內能夠成功傳輸的數據數量。對於大量順序讀寫的應用,如VOD(Video On Demand),則更關注吞吐量指標。

傳統磁盤本質上一種機械裝置,如FC, SAS, SATA磁盤,轉速一般爲5400/7200/10K/15K rpm不等。影響磁盤的關鍵因素是磁盤服務時間,即磁盤完成一個I/O請求所花費的時間,它由尋道時間、旋轉延遲和數據傳輸時間三部分構成。

尋道時間Tseek是指將讀寫磁頭移動至正確的磁道上所須要的時間。尋道時間越短,I/O操做越快,目前磁盤的平均尋道時間通常在3-15ms。

旋轉延遲Trotation是指盤片旋轉將請求數據所在扇區移至讀寫磁頭下方所須要的時間。旋轉延遲取決於磁盤轉速,一般使用磁盤旋轉一週所需時間的1/2表示。好比,7200 rpm的磁盤平均旋轉延遲大約爲60*1000/7200/2 = 4.17ms,而轉速爲15000 rpm的磁盤其平均旋轉延遲約爲2ms。

數據傳輸時間Ttransfer是指完成傳輸所請求的數據所須要的時間,它取決於數據傳輸率,其值等於數據大小除以數據傳輸率。目前IDE/ATA能達到133MB/s,SATA II可達到300MB/s的接口數據傳輸率,數據傳輸時間一般遠小於前兩部分時間。

所以,理論上能夠計算出磁盤的最大IOPS,即IOPS = 1000 ms/ (Tseek + Troatation),忽略數據傳輸時間。假設磁盤平均物理尋道時間爲3ms, 磁盤轉速爲7200,10K,15K rpm,則磁盤IOPS理論最大值分別爲,

  • IOPS = 1000 / (3 + 60000/7200/2) = 140
  • IOPS = 1000 / (3 + 60000/10000/2) = 167
  • IOPS = 1000 / (3 + 60000/15000/2) = 200

固態硬盤SSD是一種電子裝置, 避免了傳統磁盤在尋道和旋轉上的時間花費,存儲單元尋址開銷大大下降,所以IOPS能夠很是高,可以達到數萬甚至數十萬。實際測量中,IOPS數值會受到不少因素的影響,包括I/O負載特徵(讀寫比例,順序和隨機,工做線程數,隊列深度,數據記錄大小)、系統配置、操做系統、磁盤驅動等等。所以對比測量磁盤IOPS時,必須在一樣的測試基準下進行,即使如何也會產生必定的隨機不肯定性。

可是實際狀況不可能達到理論最大值,尋道時間要高於3ms,常見磁盤平均物理尋道時間爲:

  • 7200轉/分的SATA硬盤平均物理尋道時間是9ms
  • 10000轉/分的SATA硬盤平均物理尋道時間是6ms
  • 15000轉/分的SAS硬盤平均物理尋道時間是4ms

則IOPS計算爲,

  • IOPS = 1000 / (9 + 60000/7200/2) = 76
  • IOPS = 1000 / (6 + 60000/10000/2) = 111
  • IOPS = 1000 / (4 + 60000/15000/2) = 166

機械硬盤:

  • 5400轉筆記本硬盤平均讀寫速度大體在60-90MB這個區間
  • 7200轉檯式機硬盤大體在130-190MB區間,10000轉的西數黑盤也在這個區間內
  • 10000轉和15000轉檯式機硬盤數據不詳

固態硬盤:

  • 固態硬盤讀寫速度與容量成正比,目前市售的至少300MB+
  • 1TB固態硬盤廣泛500MB+
  • 2013新Mac Pro採用PCIE鏈接方式的SSD能夠達到700MB左右
相關文章
相關標籤/搜索