最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Linux I/O調(diào)度的4種算法!

2022-08-21 13:14 作者:補給站Linux內(nèi)核  | 我要投稿

IO調(diào)度器的總體目標是希望讓磁頭能夠總是往一個方向移動,移動到底了再往反方向走,這恰恰就是現(xiàn)實生活中的電梯模型,所以IO調(diào)度器也被叫做電梯. (elevator)而相應的算法也就被叫做電梯算法.而Linux中IO調(diào)度的電梯算法有好幾種,一個叫做as(Anticipatory),一個叫做 cfq(Complete Fairness Queueing),一個叫做deadline,還有一個叫做noop(No Operation).具體使用哪種算法我們可以在啟動的時候通過內(nèi)核參數(shù)elevator來指定.


一、I/O調(diào)度的4種算法#

1)CFQ(完全公平排隊I/O調(diào)度程序)#

特點: 在最新的內(nèi)核版本和發(fā)行版中,都選擇CFQ做為默認的I/O調(diào)度器,對于通用的服務器也是最好的選擇. CFQ試圖均勻地分布對I/O帶寬的訪問,避免進程被餓死并實現(xiàn)較低的延遲,是deadline和as調(diào)度器的折中. CFQ對于多媒體應用(video,audio)和桌面系統(tǒng)是最好的選擇. CFQ賦予I/O請求一個優(yōu)先級,而I/O優(yōu)先級請求獨立于進程優(yōu)先級,高優(yōu)先級的進程的讀寫不能自動地繼承高的I/O優(yōu)先級.

工作原理: CFQ為每個進程/線程,單獨創(chuàng)建一個隊列來管理該進程所產(chǎn)生的請求,也就是說每個進程一個隊列,各隊列之間的調(diào)度使用時間片來調(diào)度, 以此來保證每個進程都能被很好的分配到I/O帶寬.I/O調(diào)度器每次執(zhí)行一個進程的4次請求.

2)NOOP(電梯式調(diào)度程序)#

特點: 在Linux2.4或更早的版本的調(diào)度程序,那時只有這一種I/O調(diào)度算法. NOOP實現(xiàn)了一個簡單的FIFO隊列,它像電梯的工作主法一樣對I/O請求進行組織,當有一個新的請求到來時,它將請求合并到最近的請求之后,以此來保證請求同一介質(zhì). NOOP傾向餓死讀而利于寫. NOOP對于閃存設備,RAM,嵌入式系統(tǒng)是最好的選擇. 電梯算法餓死讀請求的解釋: 因為寫請求比讀請求更容易. 寫請求通過文件系統(tǒng)cache,不需要等一次寫完成,就可以開始下一次寫操作,寫請求通過合并,堆積到I/O隊列中. 讀請求需要等到它前面所有的讀操作完成,才能進行下一次讀操作.在讀操作之間有幾毫秒時間,而寫請求在這之間就到來,餓死了后面的讀請求.

3)Deadline(截止時間調(diào)度程序)#

特點: 通過時間以及硬盤區(qū)域進行分類,這個分類和合并要求類似于noop的調(diào)度程序. Deadline確保了在一個截止時間內(nèi)服務請求,這個截止時間是可調(diào)整的,而默認讀期限短于寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現(xiàn)象. Deadline對數(shù)據(jù)庫環(huán)境(ORACLE RAC,MYSQL等)是最好的選擇.

4)AS(預料I/O調(diào)度程序)#

特點: 本質(zhì)上與Deadline一樣,但在最后一次讀操作后,要等待6ms,才能繼續(xù)進行對其它I/O請求進行調(diào)度. 可以從應用程序中預訂一個新的讀請求,改進讀操作的執(zhí)行,但以一些寫操作為代價. 它會在每個6ms中插入新的I/O操作,而會將一些小寫入流合并成一個大寫入流,用寫入延時換取最大的寫入吞吐量. AS適合于寫入較多的環(huán)境,比如文件服務器 AS對數(shù)據(jù)庫環(huán)境表現(xiàn)很差.


【文章福利】小編推薦自己的Linux內(nèi)核技術交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ??


二、查看系統(tǒng)配置#

1.查看當前系統(tǒng)支持的IO調(diào)度算法#

dmesg | grep -i scheduler [root@localhost ~]# dmesg | grep -i scheduler io scheduler noop registered io scheduler anticipatory registered io scheduler deadline registered io scheduler cfq registered (default)

2.查看當前系統(tǒng)的I/O調(diào)度方法:#

cat /sys/block/sda/queue/scheduler noop anticipatory deadline [cfq]

臨地更改I/O調(diào)度方法: 例如:想更改到noop電梯調(diào)度算法: echo noop > /sys/block/sda/queue/scheduler

3.永久的更改I/O調(diào)度方法:#

修改內(nèi)核引導參數(shù),加入elevator=調(diào)度程序名 vi /boot/grub/menu.lst 更改到如下內(nèi)容: kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

重啟之后,查看調(diào)度方法: cat /sys/block/sda/queue/scheduler noop anticipatory [deadline] cfq 已經(jīng)是deadline了

三、I/O調(diào)度程序的測試#

本次測試分為只讀,只寫,讀寫同時進行. 分別對單個文件600MB,每次讀寫2M,共讀寫300次.

1.測試磁盤讀:#

[root@test1 tmp]# echo deadline > /sys/block/sda/queue/scheduler [root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 6.81189 seconds, 92.4 MB/s real 0m6.833s user 0m0.001s sys 0m4.556s [root@test1 tmp]# echo noop > /sys/block/sda/queue/scheduler [root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 6.61902 seconds, 95.1 MB/s real 0m6.645s user 0m0.002s sys 0m4.540s [root@test1 tmp]# echo anticipatory > /sys/block/sda/queue/scheduler [root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 8.00389 seconds, 78.6 MB/s real 0m8.021s user 0m0.002s sys 0m4.586s [root@test1 tmp]# echo cfq > /sys/block/sda/queue/scheduler [root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 29.8 seconds, 21.1 MB/s real 0m29.826s user 0m0.002s sys 0m28.606s 結果: 第一 noop:用了6.61902秒,速度為95.1MB/s 第二 deadline:用了6.81189秒,速度為92.4MB/s 第三 anticipatory:用了8.00389秒,速度為78.6MB/s 第四 cfq:用了29.8秒,速度為21.1MB/s

2.測試寫磁盤:#

[root@test1 tmp]# echo cfq > /sys/block/sda/queue/scheduler [root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 6.93058 seconds, 90.8 MB/s real 0m7.002s user 0m0.001s sys 0m3.525s [root@test1 tmp]# echo anticipatory > /sys/block/sda/queue/scheduler [root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 6.79441 seconds, 92.6 MB/s real 0m6.964s user 0m0.003s sys 0m3.489s [root@test1 tmp]# echo noop > /sys/block/sda/queue/scheduler [root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 9.49418 seconds, 66.3 MB/s real 0m9.855s user 0m0.002s sys 0m4.075s [root@test1 tmp]# echo deadline > /sys/block/sda/queue/scheduler [root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 6.84128 seconds, 92.0 MB/s real 0m6.937s user 0m0.002s sys 0m3.447s 測試結果: 第一 anticipatory,用了6.79441秒,速度為92.6MB/s 第二 deadline,用了6.84128秒,速度為92.0MB/s 第三 cfq,用了6.93058秒,速度為90.8MB/s 第四 noop,用了9.49418秒,速度為66.3MB/s

3.測試同時讀/寫#

[root@test1 tmp]# echo deadline > /sys/block/sda/queue/scheduler [root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 15.1331 seconds, 41.6 MB/s [root@test1 tmp]# echo cfq > /sys/block/sda/queue/scheduler [root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 36.9544 seconds, 17.0 MB/s [root@test1 tmp]# echo anticipatory > /sys/block/sda/queue/scheduler [root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 23.3617 seconds, 26.9 MB/s [root@test1 tmp]# echo noop > /sys/block/sda/queue/scheduler [root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300 300+0 records in 300+0 records out 629145600 bytes (629 MB) copied, 17.508 seconds, 35.9 MB/s 測試結果: 第一 deadline,用了15.1331秒,速度為41.6MB/s 第二 noop,用了17.508秒,速度為35.9MB/s 第三 anticipatory,用了23.3617秒,速度為26.9MS/s 第四 cfq,用了36.9544秒,速度為17.0MB/s

四、ionice更改任務的類型和優(yōu)先級#

ionice可以更改任務的類型和優(yōu)先級,不過只有cfq調(diào)度程序可以用ionice. 有三個例子說明ionice的功能: 采用cfq的實時調(diào)度,優(yōu)先級為7 ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300& 采用缺省的磁盤I/O調(diào)度,優(yōu)先級為3 ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300& 采用空閑的磁盤調(diào)度,優(yōu)先級為0 ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300& ionice的三種調(diào)度方法,實時調(diào)度最高,其次是缺省的I/O調(diào)度,最后是空閑的磁盤調(diào)度. ionice的磁盤調(diào)度優(yōu)先級有8種,最高是0,最低是7. 注意,磁盤調(diào)度的優(yōu)先級與進程nice的優(yōu)先級沒有關系. 一個是針對進程I/O的優(yōu)先級,一個是針對進程CPU的優(yōu)先級.

Anticipatory I/O scheduler 適用于大多數(shù)環(huán)境,但不太合適數(shù)據(jù)庫應用 Deadline I/O scheduler 通常與Anticipatory相當,但更簡潔小巧,更適合于數(shù)據(jù)庫應用 CFQ I/O scheduler 為所有進程分配等量的帶寬,適合于桌面多任務及多媒體應用,默認IO調(diào)度器 Default I/O scheduler



Linux I/O調(diào)度的4種算法!的評論 (共 條)

分享到微博請遵守國家法律
西安市| 农安县| 齐齐哈尔市| 泊头市| 永宁县| 银川市| 新昌县| 尉氏县| 玉屏| 三都| 泊头市| 嫩江县| 洛阳市| 顺昌县| 阿瓦提县| 玉田县| 曲周县| 凤城市| 鄱阳县| 山西省| 芦山县| 闸北区| 莎车县| 昌吉市| 玉树县| 桐乡市| 黄龙县| 靖安县| 乾安县| 青神县| 南川市| 华池县| 静宁县| 黄平县| 渝中区| 荥阳市| 玉门市| 法库县| 闻喜县| 贵港市| 大安市|