一、背景和問題
1. EXT4日志的問題
隨著計(jì)算機(jī)系統(tǒng)加載數(shù)百個(gè)CPU內(nèi)核,文件系統(tǒng)的可擴(kuò)展性得到進(jìn)一步強(qiáng)調(diào)。因此本文主要定位服務(wù)器中廣泛使用的Ext4文件系統(tǒng)在做日志記錄時(shí)的可擴(kuò)展性問題。EXT4日志有兩個(gè)嚴(yán)重的缺點(diǎn);串行提交并提交原始頁面緩存條目。
串行提交:在EXT4中,日志提交是嚴(yán)格的串行活動(dòng)。只有在前面的日志提交完成后,它才能提交后面的日志事務(wù)。因此,在EXT4中,一次最多只能有一個(gè)正在運(yùn)行的事務(wù),最多只能有一個(gè)提交事務(wù)。圖1展示了串行提交的一個(gè)示例:
將前面的fsync()和后面的fsync()的日志事務(wù)分別標(biāo)記為Tx1和Tx2。JBD線程僅在完成提交Tx1后才開始提交Tx2(t3時(shí)刻)。
提交原始頁面緩存條目:EXT4使用原始頁面緩存條目將更新的內(nèi)容提交給磁盤。它不會(huì)為日志提交創(chuàng)建更新的副本。如果關(guān)聯(lián)的頁面緩存條目被提交到磁盤,則需要更新文件系統(tǒng)狀態(tài)的應(yīng)用程序?qū)⒈蛔枞?。這種情況也叫做事務(wù)沖突,會(huì)嚴(yán)重影響EXT4的日志記錄可擴(kuò)展性。
2. EXT4日志可擴(kuò)展性問題的詳細(xì)分析
本文通過EXT4執(zhí)行串行日志提交和BarrierFS執(zhí)行并發(fā)日志操作來探索文件系統(tǒng)日志中的可伸縮性平靜,最終確認(rèn)了影響EXT4 和 BarrierFS 性能可擴(kuò)展性的四個(gè)主要組件;事務(wù)沖突、串行刷新、事務(wù)鎖定間隔的長(zhǎng)度和復(fù)合日志的合并程度。
(1) 事務(wù)沖突
事務(wù)沖突技術(shù)值定義為試圖修改DMA下的日志塊的文件操作數(shù)量。盡管 EXT4 的影子分頁功能可以解決事務(wù)沖突,但 EXT4 日志記錄仍然存在大量事務(wù)沖突。
即使BarrierFS同時(shí)提交多個(gè)事務(wù),它也會(huì)使用單獨(dú)的刷新命令刷新每個(gè)事務(wù)。由于每個(gè)日志提交都會(huì)在存儲(chǔ)設(shè)備上產(chǎn)生單獨(dú)的刷新,因此BarrierFS 的并發(fā)日志設(shè)計(jì)的好處是體現(xiàn)不出來的。此外,當(dāng)正在運(yùn)行的事務(wù)試圖在flush下修改日志塊時(shí),它們都會(huì)發(fā)生沖突并被阻塞。這種提交事務(wù)的更高并發(fā)性導(dǎo)致幾乎 100% 的文件操作在所有線程中都遭受事務(wù)沖突。
(2) 事務(wù)鎖定
并發(fā)日志中可伸縮性失敗的主要原因之一是延長(zhǎng)的鎖定間隔。
對(duì)EXT4,事務(wù)鎖定間隔的長(zhǎng)度可以忽略不計(jì),因?yàn)殒i定期只是等待未完成的文件操作完成的時(shí)間,一般來說是很短的。
BarrierFS可以在正在運(yùn)行的事務(wù)擺脫沖突之前過早地將其置于鎖定狀態(tài),直到所有未完成的文件操作完成并且所有沖突都得到解決。因此,一個(gè)正在運(yùn)行的事務(wù)在 BarrierFS 中停留在鎖定狀態(tài)的時(shí)間間隔比在 EXT4 中長(zhǎng)得多。
兩個(gè)文件系統(tǒng)鎖定時(shí)間的對(duì)比如圖2:
(3) 有限合作
影響文件系統(tǒng)日志性能可伸縮性的關(guān)鍵因素是日志事務(wù)的合并程度——日志事務(wù)中文件系統(tǒng)操作的數(shù)量。
EXT4 日志的嚴(yán)格串行性質(zhì)實(shí)際上有助于增加復(fù)合日志的合并程度。當(dāng)日志提交正在進(jìn)行時(shí),所有與傳入文件操作相關(guān)的更新都被插入到正在運(yùn)行的事務(wù)中。因此,隨著線程數(shù)量的增加,合并機(jī)會(huì)會(huì)增加。
而對(duì)于BarrierFS,由于它過早地將正在運(yùn)行的事務(wù)置于鎖定狀態(tài),從而減少了將多個(gè)文件操作合并到單個(gè)日志事務(wù)中的機(jī)會(huì)。
二、設(shè)計(jì)
作者通過以下幾個(gè)技術(shù)點(diǎn)實(shí)現(xiàn)了一個(gè)支持高并發(fā)的日志文件系統(tǒng)—CJFS。
1. 雙線程日志
作者將日志提交過程分為兩個(gè)階段,即提交階段和刷新階段,并為每個(gè)階段分配單獨(dú)的線程,即提交線程和刷新線程。提交線程負(fù)責(zé)向存儲(chǔ)發(fā)出日志事務(wù)的寫請(qǐng)求。完成后,存儲(chǔ)設(shè)備會(huì)向主機(jī)發(fā)送中斷,通知請(qǐng)求服務(wù)已完成。刷新線程負(fù)責(zé)使日志塊和提交塊持久化。一旦中斷到來,刷新線程被喚醒,并向存儲(chǔ)發(fā)出刷新命令,使日志塊和提交塊持久化。
如圖3所示,通過分離提交線程和刷新線程,CJFS 可以在不等待前面的日志()提交完成的情況下提交后續(xù)事務(wù)。
2. 多版本影子頁
為了解決事務(wù)沖突,作者提出了多版本影子分頁。當(dāng)提交線程啟動(dòng)日志提交時(shí),它會(huì)創(chuàng)建日志事務(wù)中所有頁面的影子副本。在提交日志事務(wù)時(shí),提交線程使用事務(wù)中每一頁的影子副本來將日志事務(wù)傳輸?shù)酱鎯?chǔ)設(shè)備,而不是使用原始頁面。由于日志模塊使用影子頁面進(jìn)行日志提交,后續(xù)的文件操作可以更新原始頁面。
3. 機(jī)會(huì)性合并
由于影子頁面的數(shù)量有限,如果所有預(yù)分配的影子頁面都用于保存日志,仍然會(huì)發(fā)生事務(wù)沖突。如果發(fā)生事務(wù)沖突,正在運(yùn)行的事務(wù)將進(jìn)入鎖定狀態(tài),并且所有修改文件系統(tǒng)狀態(tài)的后續(xù)文件操作都將被阻止。為了解決這個(gè)問題,作者提出了機(jī)會(huì)合并。當(dāng)所有未完成的文件操作完成時(shí),提交線程檢查是否存在任何沖突。如果存在沖突,提交線程會(huì)將鎖定狀態(tài)的事務(wù)返回到運(yùn)行狀態(tài)并被阻塞。當(dāng)提交線程被阻塞后,正在運(yùn)行的事務(wù)可以繼續(xù)容納新傳入的日志塊。
如圖四展示了機(jī)會(huì)合并的一個(gè)例子,在兩個(gè) LOCKED 狀態(tài)之間的時(shí)間段內(nèi)處于RUNNING狀態(tài)。在運(yùn)行事務(wù)的狀態(tài)變?yōu)镽UNNING狀態(tài)后,所有被阻塞等待日志句柄的掛起文件操作都被發(fā)布日志句柄。借助這樣的機(jī)會(huì)合并,CJFS 可以將大量文件操作合并到正在運(yùn)行的事務(wù)中,從而提高文件系統(tǒng)操作的并發(fā)性。
4. 復(fù)合刷新
為了使 CJFS 的日志以完全并發(fā)的方式工作,提交線程和刷新線程都應(yīng)該能夠以并發(fā)的方式處理關(guān)聯(lián)的任務(wù)。針對(duì)EXT4和BarrierFS的序列化刷新問題,作者提出了一種復(fù)合刷新的概念:當(dāng)刷新線程即將發(fā)送刷新命令時(shí),它會(huì)檢查是否存在任何后續(xù)提交事務(wù),如果后續(xù)提交事務(wù)不存在,則發(fā)送刷新命令;如果存在接下來的提交事務(wù),它會(huì)改為發(fā)送cache barrier命令(控制閃存設(shè)備保證請(qǐng)求處理順序的命令),從而將持久化事務(wù)的任務(wù)委托給后面的事務(wù)提交請(qǐng)求。通過cache barrier命令,存儲(chǔ)控制器可以確保各個(gè)事務(wù)的日志塊按順序持久化。
圖5說明了復(fù)合刷新的工作原理。當(dāng)flush線程傳輸完事務(wù)后,flush線程開始傳輸事務(wù),而不是調(diào)用flush來刷新事務(wù)。當(dāng)刷新線程完成傳輸事務(wù)時(shí),它發(fā)現(xiàn)沒有其他正在提交的事務(wù)正在運(yùn)行。然后,它調(diào)用flush使事務(wù)和事務(wù)持久化。
三、實(shí)驗(yàn)效果
1. 實(shí)驗(yàn)設(shè)置
作者將CJFS與BarrierFS、SpanFS [15]、Vanilla EXT4 和帶有 Fast-Commit的EXT4進(jìn)行了比較。同時(shí)使用三個(gè)基準(zhǔn)測(cè)試集進(jìn)行測(cè)試:用于郵件服務(wù)器的varmail,用于文件服務(wù)器的dbench,以及MySQL上的 OLTP-Insert。測(cè)試平臺(tái)為40核服務(wù)器(兩個(gè)Intel Xeon Gold 6230處理器和512 GB DRAM)和三星970 Pro SSD(MLC閃存,NVMe)進(jìn)行實(shí)驗(yàn)。
2. 實(shí)驗(yàn)結(jié)果
圖6
可以看到在多種測(cè)試集及其對(duì)應(yīng)的多種數(shù)據(jù)更新場(chǎng)景下,CJFS都能達(dá)到最好的多核性能擴(kuò)展效果。
-
文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
285瀏覽量
19917 -
線程
+關(guān)注
關(guān)注
0文章
505瀏覽量
19701
原文標(biāo)題:在眾核場(chǎng)景下,EXT4該如何應(yīng)對(duì)才能發(fā)揮性能呢?
文章出處:【微信號(hào):SSDFans,微信公眾號(hào):SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論