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&
l 采用預設的磁盤I/O排程(輪詢排程:c2),優先級為3
ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
l 采用空閑的磁盤排程(idle排程:c3),優先級為0
ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
#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 >/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">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”>/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