天天看點

RH442-5磁盤I/O調優

 Linux磁盤I/O調優

<b>一、     </b><b>概述</b>

<b></b>

1.   磁盤調優目錄:/sys/block

2.   磁盤調優均是調核心參數,要求安裝kernel-doc包,

3.   調預先讀請求量(預設為128kb)

blockdev --getra /dev/sda

blockdev --setra 512 /dev/sda  

#實際修改/sys/block/sda/queue/read_ahead_kb=256kb;如果讀情況多則将此參數調大一點,如寫請求讀,則将此參數調小一點

4.   調磁盤隊列:隊列長則處理快,提升硬碟的吞吐量,但會消耗更大的記憶體

Queue length:/sys/block/sda/queue/nr_requests  

[root@station8 queue]# cat /sys/block/sda/queue/nr_requests

512                                 

 #預設128,沒有機關

<b>二、 </b><b>磁盤I/O的4種排程算法</b>

1.   CFQ(完全公平排隊I/O排程程式)<b> </b>(elevator=cfq)

特點:

l  這是預設算法,對于通用伺服器來說通常是最好的選擇。它試圖均勻地分布對I/O帶寬的通路。是deadline和anticipatory排程器的折中方案.

l  CFQ對于多媒體應用(video,audio)和桌面系統是最好的選擇.

l  CFQ賦予I/O請求一個優先級,而I/O優先級請求獨立于程序優先級,高優先級的程序的讀寫不能自動地繼承高的I/O優先級.

l  CFQ基于64位的隊列請求,使用的輪詢的方法處理隊列.

調優參數:

l  /sys/block/sda/queue/iosched/queued:輪詢時每次處理的最大請求數

l  /sys/block/sda/queue/iosched/quantum:每隔多少個請求數做一次輪詢

cfq調優工具ionice

ionice可以更改任務的類型和優先級,不過隻有cfq排程程式可以用ionice.

有三個例子說明ionice的功能:

l  采用cfq的實時排程(實時排程:c1),優先級為7(數字越低優先級越高)

ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&amp;

l  采用預設的磁盤I/O排程(輪詢排程:c2),優先級為3

ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&amp;

l  采用空閑的磁盤排程(idle排程:c3),優先級為0

ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&amp;

#ionice的三種排程方法,實時排程最高,其次是預設的I/O排程,最後是空閑的磁盤排程.

ionice的磁盤排程優先級有8種,最高是0,最低是7.

注意,磁盤排程的優先級與程序nice的優先級沒有關系.一個是針對程序I/O的優先級,一個是針對程序CPU的優先級.

2.   <b>Deadline</b><b>(截止時間排程程式)(elevator=deadline):</b>

l  Deadline確定了在一個截止時間内服務請求,這個截止時間是可調整的,而預設讀期限短于寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現象.

l  這個算法試圖把每次請求的延遲降至最低。該算法重排了請求的順序來提高性能。可以調隊列的過期的讀寫過程,如 read_expire 和 write_expire 二個參數來控制多久内一定要讀到資料,逾時就放棄排序。

l  比較合适小檔案。還可以使用打開 front_merges 來進行合并鄰近檔案。Deadline對資料庫環境(ORACLE RAC,MYSQL等)是最好的選擇.

調優:

[root@station8 queue]# echo deadline &gt;/sys/block/sda/queue/scheduler

[root@station8 queue]# more /sys/block/sda/queue/scheduler

noop anticipatory [deadline] cfq

[root@station8 queue]# ls /sys/block/sda/queue/iosched/

fifo_batch  front_merges  read_expire  write_expire  writes_starved

[root@station8 queue]# cat iosched/read_expire

500    #預設500ms

[root@station8 queue]# cat iosched/write_expire

5000   #預設5000ms

[root@station8 queue]# cat iosched/front_merges

1                  

#預設為1,請求整合,新的請求和之前請求有關聯,則優先處理該請求,對IO性能沒有影響,但優化了磁盤處理。

3.   <b>Anticipatory</b><b>(預料I/O排程程式)(elevator=as):</b>

特點:

l  預想排程算法。優化完成率,改善讀請求。

l  本質上與Deadline一樣,但在最後一次讀操作後,要等待6ms才能繼續進行對其它I/O請求進行排程。可以從應用程式中預訂一個新的讀請求,改進讀操作的執行,但以一些寫操作為代價,它會在每個6ms中插入新的I/O操作,而會将一些小寫入流合并成一個大寫入流,用寫入延時換取最大的寫入吞吐量。

l  AS适合于寫入較多的環境,比如檔案伺服器;适合大檔案處理,适合web server等。AS對資料庫環境表現很差。

[root@station8 queue]# echo "anticipatory"&gt;scheduler

[root@station8 queue]# more iosched/antic_expire

6       #預設為6秒

[root@station8 queue]# more iosched/read_expire

125      #讀的最大隊列時間

[root@station8 queue]# more iosched/write_expire

250      #寫的最大隊列時間

注:測試時一定要清空緩存

[root@station8 442]# free –m    #檢視緩存

             total    used   free   shared    buffers     cached

Mem:        4054    506   3548   0        140        256

-/+ buffers/cache:      108   3945

Swap:         8189   0    8189

測試:

[root@station8 442]# sysctl -w vm.drop_caches=3   #清空緩存

[root@station8 442]#rpm –ivh elevator-test-0.1-3.i386.rpm  #安裝測試軟體

[root@station8 442]#dd if=/dev/urandom of=/root/bigfile bs=1M count=100

[root@station8 442]#watch –n 1 ls –lh /root/bigfile   #每隔一秒查寫入bigfile的資料量

l 預設排程類型為cfq下,測試讀資料速度(測試時要求清空緩存)

[root@station8 442]#cat /sys/block/sda/queue/scheduler

noop anticipatory deadline [cfq]

[root@station8 442]#et_start reader /root/bigfile

Launching

Reading 25600 pages

Read 20000 pages

real    0m1.552s

user    0m0.011s

sys     0m0.147s

l 将排程類型改為anticipatory,測試讀資料速度(測試時要求清空緩存)

[root@station8 442]#echo “anticipatory”&gt;/sys/block/sda/queue/scheduler

noop anticipatory deadline [anticipatory]

[root@station8 442]#cat /sys/block/sda/queue/iosched/antic_expire

12    #該值預設為6,為提高速度,改成12

[root@ station8 442]# et_start reader /root/bigfile

real    0m1.456s

user    0m0.007s

sys     0m0.144s

l 結論:很明顯讀的數度提高了。

4.   <b>NOOP</b><b>(電梯式排程程式)(elevator=noop):</b>

l  不做任何調優,主要用于節省CPU資源。

l  Noop排程算法指的是當請求被存儲到隊列并交由I/O子系統處理時由磁盤硬體對其進行優化。該算法一般隻對一些特定的硬體(例如RAM disk和TCQ disk等)。

l  Noop對于I/O不那麼操心,對所有的I/O請求都用FIFO隊列形式處理,預設認為 I/O不會存在性能問題。這也使得CPU也不用那麼操心

<b>三、 </b><b>I/O</b><b>排程算法使用建議</b>

1.   Deadline I/O scheduler 

   在這個中 deadline 排程算法通過降低性能而獲得更短的等待時間,它使用輪詢的排程器,簡潔小巧,提供了最小的讀取延遲和尚佳的吞吐量,特别适合于讀取較多的環境(比如資料庫,Oracle 10G 之類).

2.   Anticipatory I/O scheduler

   anticipatory 算法通過增加等待時間來獲得更高的性能,假設一個塊裝置隻有一個實體查找磁頭(例如一個單獨的SATA硬碟),将多個随機的小寫入流合并成一個大寫入流(相當于給随機讀寫變順序讀寫), 使用這個原理來使用讀取寫入的延時換取最大的讀取寫入吞吐量.适用于大多數環境,特别是讀取寫入較多的環境,比如檔案伺服器,Web 應用,App等應用我們可以采納as排程.後面我會教大家怎麼調這個的合并的等待時間。

3.   CFQ I/O scheduler

這個是 對所有因素也都做了折中而盡量獲得公平性,使用QoS政策為所有任務配置設定等量的帶寬,避免程序被餓死并實作了較低的延遲,可以認為是上述兩種排程器的折中.适用于有大量程序的多使用者系統。

本文轉自netsword 51CTO部落格,原文連結:http://blog.51cto.com/netsword/635661