溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

linux的數(shù)據(jù)一致性和io類型怎么理解

發(fā)布時(shí)間:2022-01-06 14:41:34 來(lái)源:億速云 閱讀:120 作者:iii 欄目:云計(jì)算

這篇文章主要講解了“l(fā)inux的數(shù)據(jù)一致性和io類型怎么理解”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“l(fā)inux的數(shù)據(jù)一致性和io類型怎么理解”吧!

對(duì)linux內(nèi)核來(lái)說(shuō),讀寫(xiě)要經(jīng)過(guò)層層路徑,才能真正讀寫(xiě)硬盤(pán)。從io路徑來(lái)說(shuō),io要經(jīng)過(guò)page cache,io調(diào)度隊(duì)列,dispatch隊(duì)列,ncq隊(duì)列和硬盤(pán)cache,才能真正到達(dá)硬盤(pán)。

Page cache:page cache是linux內(nèi)核提供的緩存接口,page cache的名字就說(shuō)明內(nèi)核是通過(guò)page單元(通常4K大?。﹣?lái)管理cache。讀操作首先在page cache查找,如果找到,就復(fù)制page cache的內(nèi)容返回,找不到,才真正調(diào)用下層處理。寫(xiě)操作,buffer io 寫(xiě)到page cache就返回,真正的磁盤(pán)寫(xiě),是由內(nèi)核的pdflush內(nèi)核線程負(fù)責(zé)

IO調(diào)度隊(duì)列:

Linux內(nèi)核提供了四種io調(diào)度算法,as,deadline,cfq,noop。每種調(diào)度算法都實(shí)現(xiàn)了一個(gè)調(diào)度隊(duì)列,io首先在隊(duì)列中排序(noop最簡(jiǎn)單,不排序),然后根據(jù)條件,決定是否到dispatch隊(duì)列。從調(diào)度隊(duì)列下發(fā),涉及一個(gè)unplug的概念。也就是說(shuō),調(diào)度隊(duì)列通常處于阻塞(plug)狀態(tài),當(dāng)執(zhí)行unplug操作時(shí),io離開(kāi)調(diào)度隊(duì)列,開(kāi)始下發(fā)。unplug是個(gè)循環(huán)動(dòng)作,將調(diào)度隊(duì)列的所有io都嘗試下發(fā),直到不能下發(fā)為止。
總結(jié)一下,執(zhí)行unplug有下列條件:

  • 第一個(gè)io啟動(dòng)了三毫秒的定時(shí)器,定時(shí)器到了,會(huì)unplug,開(kāi)始下發(fā)

  • io請(qǐng)求超過(guò)設(shè)定的限制(缺省是4),執(zhí)行unplug,開(kāi)始下發(fā)

  • Sync標(biāo)志的io,立即unplug,開(kāi)始下發(fā)。

  • Barrier標(biāo)志的io,清空調(diào)度隊(duì)列后,執(zhí)行unplug,開(kāi)始下發(fā)

  • 一個(gè)io執(zhí)行完畢,也要unplug隊(duì)列。

dispatch隊(duì)列:dispatch隊(duì)列對(duì)應(yīng)用關(guān)系不大。但是內(nèi)核層對(duì)日志文件系統(tǒng)的joural數(shù)據(jù),提供了一種barrier io,這個(gè)主要在dispatch隊(duì)列實(shí)現(xiàn)。

Ncq隊(duì)列:
NCQ是sata硬盤(pán)自身的隊(duì)列。(sas硬盤(pán)的隊(duì)列叫TCQ)。NCQ隊(duì)列是由操作系統(tǒng)創(chuàng)建的,但是加入到NCQ隊(duì)列的io,是由硬盤(pán)來(lái)決定執(zhí)行順序。為了實(shí)現(xiàn)這個(gè),NCQ隊(duì)列創(chuàng)建在內(nèi)核的DMA內(nèi)存中,然后通知硬盤(pán),至于硬盤(pán)選擇那個(gè)io執(zhí)行,是硬盤(pán)自身選擇的結(jié)果。

硬盤(pán)cache:
硬盤(pán)cache是硬盤(pán)內(nèi)部的cache。如果打開(kāi)硬盤(pán)cache的話,寫(xiě)硬盤(pán)的io,首先是到硬盤(pán)cache,而非直接落到硬盤(pán)。

一. Pdflush的回寫(xiě)邏輯

Pdflush提供了四個(gè)參數(shù)來(lái)控制回寫(xiě)。在內(nèi)核實(shí)現(xiàn)中,pdflush的回寫(xiě)策略控制還比較復(fù)雜。

但是簡(jiǎn)單一點(diǎn)說(shuō),內(nèi)核缺省情況下,每5秒鐘掃描臟頁(yè),如果臟頁(yè)生存時(shí)間超過(guò)30秒(缺省數(shù)值),就刷臟頁(yè)到磁盤(pán)。

詳細(xì)的可參考本人寫(xiě)的《linux內(nèi)核回寫(xiě)機(jī)制和調(diào)整》一文。

二. 數(shù)據(jù)下盤(pán)和一致性分析

從上文的分析,通常的io寫(xiě),到page cache層就結(jié)束返回了,并沒(méi)真正寫(xiě)到硬盤(pán)。這樣機(jī)器掉電或者故障的時(shí)候,就有丟失數(shù)據(jù)的風(fēng)險(xiǎn)。為了盡快下io,系統(tǒng)又提供了一些措施解決這個(gè)問(wèn)題。

O_SYNC:打開(kāi)文件的時(shí)候,可以設(shè)置O_SYNC標(biāo)志,在page cache的寫(xiě)完成后,如果文件有O_SYNC標(biāo)志,立即開(kāi)始將io下發(fā),進(jìn)入調(diào)度隊(duì)列。隨后將文件系統(tǒng)的meta data數(shù)據(jù)也下發(fā),然后開(kāi)始循環(huán)執(zhí)行unplug操作,直到所有的寫(xiě)io完成。和回寫(xiě)機(jī)制比較,O_SYNC沒(méi)有等臟頁(yè)生存30秒,就嘗試立即下發(fā)到硬盤(pán)。

O_SYNC本質(zhì)就是io下發(fā),然后執(zhí)行unplug操作。O_SYNC的幾個(gè)問(wèn)題是:

  • 寫(xiě)page cache時(shí)候要把io拆成4k的單元?;貙?xiě)也是每次寫(xiě)4K的頁(yè)面,如果是大io,就需要內(nèi)核的調(diào)度層把4k的io重新再合并起來(lái)。這是冗余的過(guò)程

  • 每個(gè)io都要立即unplug,這樣就不能實(shí)現(xiàn)io的排序和合并。O_SYNC的性能相當(dāng)?shù)汀?/p>

  • 如果多個(gè)進(jìn)程并發(fā)寫(xiě),不能保證寫(xiě)操作的順序。Ncq隊(duì)列根據(jù)硬盤(pán)磁頭的位置和磁盤(pán)旋轉(zhuǎn)位置確定執(zhí)行的順序。一般是meta data數(shù)據(jù)一起寫(xiě),這樣存在不同步的風(fēng)險(xiǎn)。

  • 如果硬盤(pán)cache打開(kāi)了,那么寫(xiě)只到硬盤(pán)cache就返回了。存在丟數(shù)據(jù)的風(fēng)險(xiǎn)。通常存儲(chǔ)廠商都要求硬盤(pán)cache關(guān)閉。不過(guò)騰訊的服務(wù)器都是打開(kāi)硬盤(pán)cache的。

O_DIRECT:打開(kāi)文件的時(shí)候,可設(shè)置O_DIRECT標(biāo)志。O_DIRECT不使用內(nèi)核提供的page cache。這樣讀操作,就不會(huì)到page cache中檢查是否有需要數(shù)據(jù)存在。而寫(xiě)操作,也不會(huì)將數(shù)據(jù)寫(xiě)入page cache,而是送入調(diào)度隊(duì)列。

O_DIRECT執(zhí)行寫(xiě)io的時(shí)候,會(huì)置WRITE_SYNC標(biāo)志。這個(gè)標(biāo)志在io進(jìn)入調(diào)度隊(duì)列后,會(huì)執(zhí)行一次unplug操作。而不是像O_SYNC那樣,循環(huán)執(zhí)行unplug操作。

為了避免O_SYNC每個(gè)寫(xiě)io都要阻塞等待的問(wèn)題,系統(tǒng)提供了fsync和fdatasync系統(tǒng)調(diào)用,可以讓?xiě)?yīng)用層自己控制同步的時(shí)機(jī)。

Fsync:fsync將文件范圍內(nèi),所有的臟頁(yè)面都下發(fā)到硬盤(pán)。然后也要將臟的元數(shù)據(jù)寫(xiě)到 硬盤(pán)。如果文件的inode本身有變化,同樣需要寫(xiě)到硬盤(pán)。

Fdatasync:fdatasync和fsync的區(qū)別其實(shí)很輕微。比如ext2文件系統(tǒng),如果文件的inode只有輕微的變化,fdatasync此時(shí)不更新inode。典型的輕微變化是文件atime的變化。而在ext3文件系統(tǒng),fsync和fdatasync是完全一樣的。不管是否輕微變化,都要回寫(xiě)inode。

Fsync和fdatasync都是對(duì)整個(gè)文件的操作,如果應(yīng)用只想刷新文件的指定位置,這兩個(gè)系統(tǒng)調(diào)用就失效了。所以新的內(nèi)核還提供了sync_file_range來(lái)指定范圍寫(xiě)。不過(guò)要注意,sync_file_range是不回寫(xiě)文件的meta data。必須應(yīng)用層保證meta data沒(méi)有更新。

三. Pdflush的回寫(xiě)邏輯

Pdflush提供了四個(gè)參數(shù)來(lái)控制回寫(xiě)。在內(nèi)核實(shí)現(xiàn)中,pdflush的回寫(xiě)策略控制還比較復(fù)雜。

但是簡(jiǎn)單一點(diǎn)說(shuō),內(nèi)核缺省情況下,每5秒鐘掃描臟頁(yè),如果臟頁(yè)生存時(shí)間超過(guò)30秒(缺省數(shù)值),就刷臟頁(yè)到磁盤(pán)。

四. 內(nèi)核的barrier io

從上文的分析看出,內(nèi)核沒(méi)有為用戶態(tài)提供保證順序的,確定寫(xiě)到硬盤(pán)的系統(tǒng)調(diào)用。但是對(duì)于內(nèi)核文件系統(tǒng)來(lái)說(shuō),必須提供這樣的接口。比如日志文件系統(tǒng),必須要數(shù)據(jù)落到硬盤(pán)后,才能修改元數(shù)據(jù)的日志。否則,出錯(cuò)情況下就可能造成文件系統(tǒng)崩潰。為此,內(nèi)核專門(mén)提供了一個(gè)barrier方式實(shí)現(xiàn)日志的準(zhǔn)確寫(xiě)到硬盤(pán)。

文件系統(tǒng)的barrier io,意味著,這個(gè)barrier io之前的寫(xiě)io必須完成。同時(shí),在barrier io完成之前(是真正寫(xiě)到硬盤(pán),不是寫(xiě)到cache就返回),也不能有別的寫(xiě)io再執(zhí)行。為此,上文分析的dispatch 隊(duì)列完成了這個(gè)功能。

當(dāng)寫(xiě)io從調(diào)度隊(duì)列進(jìn)入dispatch隊(duì)列的時(shí)候,要檢查是否是一個(gè)barrier io。如果是barrier io,dispatch首先在隊(duì)列中插入一個(gè)SCSI命令SYNCHRONIZE_CACHE,這個(gè)命令指示硬盤(pán)cache刷所有的寫(xiě)io到硬盤(pán)。然后再下發(fā)barrier io,之后再插入一個(gè)SYNCHRONIZE_CACHE命令,指示硬盤(pán)將剛才的barrier io真正寫(xiě)到硬盤(pán)(還有一種方式,是通過(guò)命令攜帶FUA標(biāo)志實(shí)現(xiàn)不經(jīng)過(guò)cache直接下盤(pán))。

感謝各位的閱讀,以上就是“l(fā)inux的數(shù)據(jù)一致性和io類型怎么理解”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)linux的數(shù)據(jù)一致性和io類型怎么理解這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI