論述密集事務導致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就越忙。