單線程1KB的Redis寫操作有84%都是耗費(fèi)在內(nèi)核上
對(duì)在線真實(shí)系統(tǒng)進(jìn)行性能監(jiān)控,發(fā)現(xiàn)K/V存儲(chǔ)操作并對(duì)服務(wù)器進(jìn)行鎖操作。(依舊是限制服務(wù)器延遲和吞吐量的主要原因)
服務(wù)器I/O 性能仍然很重要。沒(méi)有一個(gè)高性能的I/O子系統(tǒng)是不可能有好的系統(tǒng)性能的。
奇怪的是, 雖然在過(guò)去10年已經(jīng)看到顯著改善硬件的I / O性能, 但是我們沒(méi)有系統(tǒng)I/O性能的飛躍。 所以值得懷疑: 難道依靠標(biāo)準(zhǔn)的商業(yè)化操作系統(tǒng)能改善了I/O性能?
商用Linux硬件的簡(jiǎn)單I/O測(cè)試
這是Simon Peter et al 最近發(fā)表的 OSDI 論文的核心問(wèn)題。
可能我從這篇論文中得到的針對(duì)上面那個(gè)問(wèn)題(標(biāo)準(zhǔn)商用操作系統(tǒng)到底有沒(méi)有裝備這些I/O的改進(jìn)?)的最有意思的答案是no:今天,主要的I/O延時(shí)障礙在操作系統(tǒng)內(nèi)核本身。
在一項(xiàng)顯著的實(shí)驗(yàn)中,他們采用商用Linux并嘗試降低對(duì)商用硬件上的Redis進(jìn)行簡(jiǎn)單讀寫的延時(shí)。
(注意, 這里的“延時(shí)”部分很重要 — 我會(huì)很快提到。通過(guò)多線程改進(jìn)吞吐量是可行的,問(wèn)題在于針對(duì)特殊請(qǐng)求的延時(shí)仍有進(jìn)步空間, 尤其在數(shù)據(jù)中心的層面, 延時(shí)價(jià)值不菲。)
特別地:
-
他們從纜線上接收 1KB 的包。
-
他們對(duì) Redis 進(jìn)行讀或?qū)懀ㄈQ于測(cè)試)。
-
他們重復(fù) 1000 次,取平均耗時(shí) (讀寫一輪算一次)。
-
他們?cè)谏逃?Linux 和商用服務(wù)器上運(yùn)行。
-
例如,價(jià)值1200美元的裝備: Dell PowerEdge R520 has Intel x520 10G NIC and Intel RS3 RAID 1GB flash-backed cache, Sandy bridge CPU, 6 cores, 2.2 GHz.
-
-
他們用 單線程 處理所有數(shù)據(jù)。
結(jié)果很明顯:
讀 (在內(nèi)存中):
寫 (持久化數(shù)據(jù)結(jié)構(gòu)):
需要指出的是在每個(gè)測(cè)試用例中大約70%的內(nèi)核時(shí)間消耗在了網(wǎng)絡(luò)棧(networking stack)中。在更大的有效負(fù)載下 , 這也是幾乎固定的開銷, 因?yàn)榫W(wǎng)絡(luò)棧必須為每個(gè)包重新調(diào)用。這就是說(shuō), 如果應(yīng)用比只向內(nèi)存寫更加復(fù)雜, 應(yīng)用耗時(shí)可能激增。但是網(wǎng)絡(luò)耗時(shí)將保持不變。
對(duì)我來(lái)說(shuō)有趣的是 (盡管我是網(wǎng)絡(luò)/操作系統(tǒng)菜鳥)明智的選擇使用單線程延時(shí)而非吞吐量作為核心度量衡。
注意,有了單線程延時(shí),內(nèi)核的花費(fèi)顯而易見。但是如果有吞吐量和多線程的話,可能會(huì)忘記內(nèi)核的存在 — 我們可能很容易僅僅為了測(cè)量每秒請(qǐng)求數(shù)的增加,完全丟掉每次請(qǐng)求在內(nèi)核中花費(fèi)了 84% 的時(shí)間的事實(shí)。
這種意義明確的方法很重要:你難以優(yōu)化未度量的部分。
邁向更少I/O的操作系統(tǒng)并超越
大致理解一次請(qǐng)求有多少時(shí)間花費(fèi)在內(nèi)核上對(duì)于設(shè)計(jì)和維護(hù)規(guī)模web服務(wù)是有幫助的。
在這一點(diǎn)上,我們對(duì)抗延時(shí)的主要武器已經(jīng)是類似管道和多線程的東西了。盡管如此,如果延遲不再是一個(gè)問(wèn)題,考慮一下可能會(huì)發(fā)生的依然是很有趣的。 比如,我 (一個(gè)網(wǎng)絡(luò)菜鳥)會(huì)考慮是否像 SPDY中的管道棧的東西會(huì)更簡(jiǎn)單。
論文的其他部分探討了我們可以如何降低那些延時(shí),通過(guò)使用這個(gè)實(shí)驗(yàn)作為一項(xiàng)叫做Arrakis的操作系統(tǒng)研發(fā)的動(dòng)機(jī)。
就我所知的Arrakis核心觀點(diǎn)是,很多內(nèi)核提供的I/O實(shí)際上可以通過(guò)商用硬件來(lái)提供——比如保護(hù)、復(fù)用和調(diào)度。
換句話說(shuō),Arrakis 要把 I/O 從 “控制平臺(tái)”中拖出來(lái) (例如,盡可能從內(nèi)核中拖出來(lái)),放到用戶空間 “數(shù)據(jù)平臺(tái)” (例如,硬件上直接發(fā)生的復(fù)用,但從來(lái)不在內(nèi)核中發(fā)生)。
結(jié)果比較理想 — 作者聲稱降低了81%的寫延時(shí)和 65%的讀延時(shí)。
興奮之余,似乎還有進(jìn)步空間。比如,要手動(dòng)配置特定硬件的操作系統(tǒng),尤其在數(shù)據(jù)中心層面并不現(xiàn)實(shí)。大量的服務(wù)斷供都是由配置錯(cuò)誤導(dǎo)致,讓他們更加不透明無(wú)濟(jì)于事。
我認(rèn)為時(shí)間會(huì)證明這種憂慮是否在現(xiàn)實(shí)中有立足之地----我不過(guò)是個(gè)徹頭徹尾的操作系統(tǒng)菜鳥。
英文原文:84% of a single-threaded 1KB write in Redis is spent in the kernel