IO調(diào)度器(譯)

這篇文章中缚陷,將會(huì)介紹Linux上常見(jiàn)的IO Scheduler,以及如何修改Linux上面的默認(rèn)的IO Scheduler。在翻譯的過(guò)程中,對(duì)原文的內(nèi)容有所刪減撵幽,有些地方也重寫(xiě)排列了一下順序是牢。

原文鏈接: Improving Linux System Performance with I/O Scheduler Tuning

什么是IO調(diào)度器僵井?

磁盤(pán)的訪問(wèn)速度,一直都是計(jì)算機(jī)的瓶頸驳棱。盡管現(xiàn)在固態(tài)硬盤(pán)的出現(xiàn)批什,緩解了一下這個(gè)尷尬的狀況。但是社搅,磁盤(pán)的訪問(wèn)速度依然是系統(tǒng)中的瓶頸驻债。

對(duì)于機(jī)械硬盤(pán)來(lái)說(shuō),當(dāng)我們需要訪問(wèn)硬盤(pán)上的數(shù)據(jù)的時(shí)候形葬,首先需要經(jīng)過(guò)一個(gè)被稱(chēng)為尋道時(shí)間的過(guò)程合呐,即,將盤(pán)片旋轉(zhuǎn)到特定的扇區(qū)笙以,然后由磁頭來(lái)讀取數(shù)據(jù)合砂。一般來(lái)說(shuō),這個(gè)尋道時(shí)間會(huì)占硬盤(pán)訪問(wèn)時(shí)間中的很大比重源织。

IO調(diào)度器就是為了優(yōu)化這個(gè)過(guò)程翩伪,而工作的。IO調(diào)度器谈息,一般是將訪問(wèn)磁盤(pán)上相鄰數(shù)據(jù)的請(qǐng)求缘屹,放在一起處理,進(jìn)而減少無(wú)謂的尋道時(shí)間侠仇,提高速度轻姿。

在Linux系統(tǒng)上犁珠,已經(jīng)存在了好多個(gè)IO調(diào)度器。它們都有各自的特色互亮。在這篇文章剩下的部分里犁享,我們將會(huì)依次介紹這幾個(gè)IO調(diào)度器,并比較他們的性能豹休。

修改IO調(diào)度器

在本文中炊昆,我們使用Ubuntu來(lái)做實(shí)驗(yàn),因?yàn)樵赨buntu中威根,我們既可以在運(yùn)行時(shí)修改IO調(diào)度器凤巨,也可以在啟動(dòng)時(shí)就修改IO調(diào)度器。

如果想要在運(yùn)行時(shí)修改IO調(diào)度器洛搀,只需要修改一個(gè)位于/sys目錄中的文件的值敢茁,就可以了。

如果想要在啟動(dòng)時(shí)修改IO調(diào)度器留美,那么需要在啟動(dòng)時(shí)彰檬,修改GRUB項(xiàng)。

在修改IO調(diào)度器之前谎砾,我們先查看一下當(dāng)前系統(tǒng)中的IO調(diào)度器逢倍。通過(guò)讀取/sys/block/<disk device>/queue/scheduler這個(gè)文件的內(nèi)容來(lái)獲取。

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

上面的輸出棺榔,說(shuō)明sda這個(gè)磁盤(pán)的IO調(diào)度器為deadline.

盡管IO調(diào)度器是內(nèi)核級(jí)別的參數(shù)瓶堕,但是隘道,可以分別為不同的磁盤(pán)設(shè)置不同的IO調(diào)度器症歇。如果我們修改sda的IO調(diào)度器,sda上面的全部的文件系統(tǒng)都會(huì)使用這個(gè)新的IO調(diào)度器谭梗。

正如性能調(diào)優(yōu)的一般步驟那樣忘晤,我們需要先了解我們要進(jìn)行調(diào)優(yōu)的環(huán)境,然后根據(jù)測(cè)試結(jié)果選擇一個(gè)合適的IO調(diào)度器激捏。

在運(yùn)行時(shí)修改IO調(diào)度器

只需要修改/sys/block/<diskdevice>/queue/scheduler這個(gè)文件的內(nèi)容:

# echo "cfq" > /sys/block/sda/queue/scheduler
# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]

從上面的輸出結(jié)果中我們可以看到设塔,IO調(diào)度器被馬上替換為CFQ。這也就意味著远舅,我們并不需要重啟我們的PostgreSQL實(shí)例或者其他的服務(wù)來(lái)進(jìn)行測(cè)試闰蛔。

啟動(dòng)時(shí)修改IO調(diào)度器

編輯/etc/default/grub,找到GRUB_CMDLINE_LINUX這一項(xiàng)图柏。將它修改成下面這樣序六,告訴它使用noop這個(gè)IO調(diào)度器。

GRUB_CMDLINE_LINUX="elevator=noop"

然后蚤吹,運(yùn)行update-grub2命令來(lái)使設(shè)置生效例诀。

# update-grub2
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.4.0-62-generic
Found initrd image: /boot/initrd.img-4.4.0-62-generic
Found linux image: /boot/vmlinuz-4.4.0-57-generic
Found initrd image: /boot/initrd.img-4.4.0-57-generic
done

通過(guò)reboot命令重啟系統(tǒng)之后随抠,我們可以查看我們的設(shè)置是否生效。

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

測(cè)試PostgreSQL在不同IO調(diào)度器下的性能

CFQ

CFQ的全稱(chēng)是Complete Fairness Queueing繁涂,它的工作原理是這樣的拱她,它先創(chuàng)建一個(gè)IO請(qǐng)求隊(duì)列,然后在對(duì)隊(duì)列中的請(qǐng)求根據(jù)上文我們說(shuō)到的那種方式扔罪,即將要訪問(wèn)磁盤(pán)上相鄰數(shù)據(jù)的請(qǐng)求放到一起秉沼,按照這種方式進(jìn)行排序之后,再依次處理IO請(qǐng)求隊(duì)列中的請(qǐng)求步势。

我們可以看到氧猬,CFQ實(shí)際上并沒(méi)有區(qū)分不同優(yōu)先級(jí)的IO請(qǐng)求。這也就意味著坏瘩,在某些需要優(yōu)先處理某些請(qǐng)求的場(chǎng)合盅抚,它并不適合。

在理解了CFQ之后倔矾,我們通過(guò)pgbench來(lái)測(cè)試我們的PostgreSQL實(shí)例妄均。

# su - postgres
$ pgbench -c 100 -j 2 -t 1000 example
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 50
query mode: simple
number of clients: 100
number of threads: 2
number of transactions per client: 1000
number of transactions actually processed: 100000/100000
latency average: 60.823 ms
tps = 1644.104024 (including connections establishing)
tps = 1644.228715 (excluding connections establishing)

從結(jié)果中,我們可以看到哪自,現(xiàn)在的tps基本上是1644/s丰包。盡管不是一個(gè)非常差的結(jié)果,但是這個(gè)結(jié)果并不是最優(yōu)的壤巷。

Deadline

Deadline調(diào)度器邑彪,會(huì)創(chuàng)建兩個(gè)隊(duì)列,一個(gè)讀隊(duì)列胧华,一個(gè)寫(xiě)隊(duì)列寄症。并且每個(gè)IO請(qǐng)求都會(huì)有一個(gè)與其相關(guān)聯(lián)的過(guò)期時(shí)間戳。

當(dāng)Deadline調(diào)度器在處理IO請(qǐng)求的時(shí)候矩动,它會(huì)通過(guò)過(guò)期時(shí)間戳來(lái)對(duì)IO請(qǐng)求進(jìn)行優(yōu)先級(jí)排序有巧。那些將要過(guò)期的IO請(qǐng)求會(huì)被賦予更高的優(yōu)先級(jí)。

默認(rèn)情況下悲没,Deadline為讀請(qǐng)求設(shè)置的過(guò)期時(shí)間為500ms篮迎,而為寫(xiě)請(qǐng)求設(shè)置的過(guò)期時(shí)間則為5000ms。我們可以看到示姿,Deadline實(shí)際上比較適合于那種讀請(qǐng)求比寫(xiě)請(qǐng)求多好多的場(chǎng)景中甜橱。

我們將IO調(diào)度器修改成Deadline,然后查看PostgreSQL的性能栈戳。

# echo deadline > /sys/block/sda/queue/scheduler
# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

現(xiàn)在我們已經(jīng)將IO調(diào)度器修改成了Deadline岂傲,我們?cè)俅螠y(cè)試系統(tǒng)的性能:

# su - postgres
$ pgbench -c 100 -j 2 -t 1000 example
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 50
query mode: simple
number of clients: 100
number of threads: 2
number of transactions per client: 1000
number of transactions actually processed: 100000/100000
latency average: 46.700 ms
tps = 2141.318132 (including connections establishing)
tps = 2141.489076 (excluding connections establishing)

我們可以看到,相對(duì)與CFQ荧琼,TPS有接近500/s的提升譬胎。

我們同樣可以看到秉撇,盡管pgbench在測(cè)試時(shí)餐塘,基本上按照1:1的比例生成讀寫(xiě)請(qǐng)求,但是依舊可以從Deadline調(diào)度器中受益。

Noop

Noop調(diào)度器是一個(gè)非常特殊的調(diào)度器洪囤。它并不會(huì)對(duì)特殊請(qǐng)求進(jìn)行優(yōu)先處理废菱,與此相反搀继,它將全部的IO請(qǐng)求都放到一個(gè)FIFO隊(duì)列中吟策。但是,它還會(huì)對(duì)相似的請(qǐng)求進(jìn)行合并苟翻。

Noop調(diào)度器是為了那些實(shí)際上并不需要任何IO調(diào)度器的系統(tǒng)而進(jìn)行優(yōu)化的韵卤。比如,在那些虛擬機(jī)實(shí)例中崇猫,實(shí)際的IO請(qǐng)求都是由宿主機(jī)處理的沈条。

在虛擬機(jī)場(chǎng)景中,因?yàn)樗拗鳈C(jī)上诅炉,實(shí)際上已經(jīng)有了IO調(diào)度器了蜡歹。所以,在這種場(chǎng)景中涕烧,每個(gè)IO請(qǐng)求都會(huì)被傳遞到兩個(gè)IO調(diào)度器中月而,一個(gè)是VM的調(diào)度器,一個(gè)是宿主機(jī)上的IO調(diào)度器议纯。

# echo noop > /sys/block/sda/queue/scheduler
# cat /sys/block/sda/queue/scheduler
[noop] deadline cfq
# su - postgres
$ pgbench -c 100 -j 2 -t 1000 example
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 50
query mode: simple
number of clients: 100
number of threads: 2
number of transactions per client: 1000
number of transactions actually processed: 100000/100000
latency average: 46.364 ms
tps = 2156.838618 (including connections establishing)
tps = 2157.102989 (excluding connections establishing)

從結(jié)果中父款,我們可以看到,僅僅只是比Deadline調(diào)度器的結(jié)果好一點(diǎn)點(diǎn)瞻凤。

由于我們的這次測(cè)試是在虛擬機(jī)中進(jìn)行的憨攒,所以,盡管修改了虛擬機(jī)上面的IO調(diào)度器鲫构,實(shí)際上起作用的還是宿主機(jī)上的IO調(diào)度器浓恶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玫坛,一起剝皮案震驚了整個(gè)濱河市结笨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湿镀,老刑警劉巖炕吸,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異勉痴,居然都是意外死亡赫模,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蒸矛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瀑罗,“玉大人胸嘴,你說(shuō)我怎么就攤上這事≌都溃” “怎么了劣像?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)摧玫。 經(jīng)常有香客問(wèn)我耳奕,道長(zhǎng),這世上最難降的妖魔是什么诬像? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任屋群,我火速辦了婚禮,結(jié)果婚禮上坏挠,老公的妹妹穿的比我還像新娘芍躏。我一直安慰自己,他們只是感情好降狠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布纸肉。 她就那樣靜靜地躺著,像睡著了一般喊熟。 火紅的嫁衣襯著肌膚如雪柏肪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天芥牌,我揣著相機(jī)與錄音烦味,去河邊找鬼。 笑死壁拉,一個(gè)胖子當(dāng)著我的面吹牛谬俄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弃理,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼溃论,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了痘昌?” 一聲冷哼從身側(cè)響起钥勋,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辆苔,沒(méi)想到半個(gè)月后算灸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驻啤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年菲驴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骑冗。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赊瞬,死狀恐怖先煎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巧涧,我是刑警寧澤榨婆,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站褒侧,受9級(jí)特大地震影響良风,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闷供,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一烟央、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歪脏,春花似錦疑俭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至豪硅,卻和暖如春哩照,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懒浮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工飘弧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砚著。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓次伶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親稽穆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冠王,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一 OS系統(tǒng)優(yōu)化 1 內(nèi)核優(yōu)化 1)IO調(diào)度優(yōu)化 調(diào)整Linux默認(rèn)的IO調(diào)度算法. IO調(diào)度器的總體目標(biāo)是希望讓...
    PennLi閱讀 583評(píng)論 0 2
  • 文件系統(tǒng)優(yōu)化 ** 動(dòng)態(tài)調(diào)整請(qǐng)求隊(duì)列數(shù)來(lái)提高效率,默認(rèn)請(qǐng)求隊(duì)列數(shù)為:128, 可配置512 **[root@c37...
    肖金光xjg閱讀 4,802評(píng)論 1 8
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)舌镶,斷路器柱彻,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • 許多應(yīng)用都有跳轉(zhuǎn)AppStore 評(píng)分或者下載的功能,網(wǎng)上有很多文章關(guān)于跳轉(zhuǎn)的方法乎折,在此僅僅總結(jié)下: 跳轉(zhuǎn)到App...
    加菲貓的日常閱讀 1,571評(píng)論 0 1
  • 想把你寫(xiě)成一首詩(shī) 詩(shī)中藏著你的名字 想養(yǎng)一只貓 看著它在你懷里安靜睡著 想回到初次相遇的起點(diǎn) 重溫年少的心跳 想在...
    墨爾本的海閱讀 272評(píng)論 0 1