密集事務導致iowait嚴重

1.概述

在linux系統中,一臺安裝有雙sata盤,做raid1的數據庫服務器上。我跑一個存儲過程,將2千萬條記錄插入到一張表中。這屬於密集型小事務操作。在iostat檢測中,發現大量的IO等待,讀寫速度始終上不去,一直在每秒10M左右。

$ sudo iostat

Linux 2.6.30-2-amd64 (lukahn) 12/12/2009  _x86_64_ (2 CPU)

 

avg-cpu:  %user   %nice %system %iowait  %steal  %idle

           7.13    0.00   1.94   27.96    0.00  62.97

 

Device:            tps   Blk_read/s  Blk_wrtn/s   Blk_read   Blk_wrtn

sda             144.02       198.41     11139.44   9322418  523399320

sdb             143.78       165.59     11137.39   7780516  523303000

hda               0.01         0.05         0.00       2492          0

md0               0.66         6.44         0.71     302538     33496

md1               7.32        67.02         7.51   3148938     352960

md2               6.08       240.02        18.95  11277610     890584

md3            1389.80        46.85     11106.55   2201410  521853640

md4               0.41         3.03         0.21     142322       9824

從iostat中看出,cpu在iowait上消耗了大量的資源。tps值始終不高,每秒的讀寫速度也上不去。

但是,建立一個大文件測試時,發現速度還是能上去的,能達到每秒200MB左右。

因此,客戶說我們的磁盤速度不慢的,問題在你的應用那裏。

2.分析

這裏學習一個概念,我對存儲也是一知半解,這裏講的是自己所理解的,不一定對。

我們知道,在磁盤購買時,都說7200轉每分鐘,15000轉沒分鐘等。這個指標是對於機械硬盤而言的。

這個每分鐘7200轉換算成每秒就是120轉,15000轉就是每秒250轉。每轉一次就是磁盤軌道尋址一次。這裏磁盤軌道訪問有Sequential操作和Random 操作兩類,前者用於大尺寸數據傳輸如128KB,後者是小尺寸如4KB。這點好理解。

如建立表空間,一次建立個10GB,就屬於Sequential操作,大尺寸數據傳輸操作。

如多個小事務密集插入記錄到數據庫中某表時,就屬於Random操作。

但是,磁盤每秒支持的操作次數是一定的,如15000轉的,就是每秒250次,多了磁盤也忙不過來,CPU就在iowait上消耗資源。

我上面講的不專業,通常專業術語爲說IOPS 即每秒的輸入輸出量(或讀寫次數)。這是衡量磁盤性能的主要指標之一。還有一個重要指標是數據吞吐量(Throughput),指單位時間內可以成功傳輸的數據數量。

3.技術

聲明一下,以下內容來自互聯網,屬於技術名詞介紹,這裏摘錄一下。

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

(1)尋道時間

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

(2)旋轉延遲

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

(3)數據傳輸時間

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

 

IOPS(每秒IO次數) = 1s/(尋道時間+旋轉延遲+數據傳輸時間)

 

因此,理論上可以計算出磁盤的最大IOPS,即IOPS= 1000ms/ (Tseek + Troatation),忽略數據傳輸時間。假設磁盤平均物理尋道時間爲3ms,磁盤轉速爲7200,10K,15Krpm,則磁盤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時,必須在同樣的測試基準下進行,即便如何也會產生一定的隨機不確定性。 

通常情況下,IOPS可細分爲如下幾個指標:

         Toatal IOPS:混合讀寫和順序隨機I/O負載情況下的磁盤IOPS,這個與實際I/O情況最爲相符,大多數應用關注此指標。

         Random Read IOPS:100%隨機讀負載情況下的IOPS。

         Random WriteIOPS:100%隨機寫負載情況下的IOPS。

         Sequential ReadIOPS:100%順序負載讀情況下的IOPS。

         Sequential WriteIOPS:100%順序寫負載情況下的IOPS。

 

4.結論

在linux的iostat檢測工具中,tps我就理解成磁盤iops,Blk_read/s   Blk_wrtn/s我就理解成磁盤的吞吐量。SATA盤在處理小事務的讀寫時,即隨機讀寫時,只能達到每秒200次左右的事務數。從吞吐量上看,也就是每秒10MB的量。

因此,就這個磁盤而言,這個結果是很正常的。磁盤每秒讀寫大小隻能是這樣。大量的CPU資源都浪費在IOWAIT上。對於現在處理的密集型事務處理來說,磁盤是整個系統的瓶頸,再多的內存和CPU都沒用。甚至可以這麼說,每秒鐘CPU處理的事務數越多,IO就越忙。

再分析了磁盤特性後,我們該如何解決的這個問題呢。似乎是隻有將小事務變成一個大事務,才能加快處理速度。

那麼,該如何修改呢?

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