Page Cache 同步

FYI

????????廣義上Cache的同步方式有兩種,即Write Through(寫穿)和Write back(寫回). 從名字上就能看出這兩種方式都是從寫操作的不同處理方式引出的概念(純讀的話就不存在Cache一致性了,不是么)。對應(yīng)到Linux的Page Cache上所謂Write Through就是指write()操作將數(shù)據(jù)拷貝到Page Cache后立即和下層進(jìn)行同步的寫操作,完成下層的更新后才返回。而Write back正好相反,指的是寫完P(guān)age Cache就可以返回了。Page Cache到下層的更新操作是異步進(jìn)行的。

? ??????Linux下Buffered IO默認(rèn)使用的是Write back機(jī)制,即文件操作的寫只寫到Page Cache就返回,之后Page Cache到磁盤的更新操作是異步進(jìn)行的。Page Cache中被修改的內(nèi)存頁稱之為臟頁(Dirty Page),臟頁在特定的時(shí)候被一個(gè)叫做pdflush(Page Dirty Flush)的內(nèi)核線程寫入磁盤,寫入的時(shí)機(jī)和條件如下:

? ??????????????當(dāng)空閑內(nèi)存低于一個(gè)特定的閾值時(shí),內(nèi)核必須將臟頁寫回磁盤,以便釋放內(nèi)存。

????????????????當(dāng)臟頁在內(nèi)存中駐留時(shí)間超過一個(gè)特定的閾值時(shí),內(nèi)核必須將超時(shí)的臟頁寫回磁盤。

????????????????用戶進(jìn)程調(diào)用sync(2)、fsync(2)、fdatasync(2)系統(tǒng)調(diào)用時(shí),內(nèi)核會執(zhí)行相應(yīng)的寫回操作。

? ? ? ? Flush策略由以下幾個(gè)參數(shù)決定(數(shù)值單位均為1/100秒):

????????????????# flush每隔5秒執(zhí)行一次

????????????????root@082caa3dfb1d / $ sysctl vm.dirty_writeback_centisecs

????????????????vm.dirty_writeback_centisecs = 500

????????????????# 內(nèi)存中駐留30秒以上的臟數(shù)據(jù)將由flush在下一次執(zhí)行時(shí)寫入磁盤

????????????????root@082caa3dfb1d / $ sysctl vm.dirty_expire_centisecs

????????????????vm.dirty_expire_centisecs = 3000

????????????????# 若臟頁占總物理內(nèi)存10%以上,則觸發(fā)flush把臟數(shù)據(jù)寫回磁盤

????????????????root@082caa3dfb1d / $ sysctl vm.dirty_background_ratio

????????????????vm.dirty_background_ratio = 10

????????默認(rèn)是寫回方式,如果想指定某個(gè)文件是寫穿方式呢?即寫操作的可靠性壓倒效率的時(shí)候,能否做到呢?當(dāng)然能,除了之前提到的fsync()之類的系統(tǒng)調(diào)用外,在open()打開文件時(shí),傳入O_SYNC這個(gè)flag即可實(shí)現(xiàn)。

????????文件讀寫遭遇斷電時(shí),數(shù)據(jù)還安全嗎?相信你有自己的答案了。使用O_SYNC或者fsync()刷新文件就能保證安全嗎?現(xiàn)代磁盤一般都內(nèi)置了緩存,代碼層面上也只能講數(shù)據(jù)刷新到磁盤的緩存了。當(dāng)數(shù)據(jù)已經(jīng)進(jìn)入到磁盤的高速緩存時(shí)斷電了會怎么樣?這個(gè)恐怕不能一概而論了。不過可以使用hdparm -W0命令關(guān)掉這個(gè)緩存,相應(yīng)的,磁盤性能必然會降低。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 關(guān)于Kafka的一個(gè)靈魂拷問:它為什么這么快?或者說,為什么它能做到如此大的吞吐量和如此低的延遲? 有很多文...
    LittleMagic閱讀 12,475評論 12 36
  • lnnoDB是事務(wù)安全的MySQL存儲引擎, 設(shè)計(jì)上采用了類似于Oracle數(shù)據(jù)庫的架構(gòu)。 通常來說,InnoD...
    好好學(xué)習(xí)Sun閱讀 1,818評論 0 5
  • 第一章 MySQL 體系架構(gòu)和存儲引擎 mysql是數(shù)據(jù)庫也是數(shù)據(jù)庫實(shí)例 mysql 是一個(gè)單進(jìn)程多線程架構(gòu)的數(shù)據(jù)...
    snail_knight閱讀 3,753評論 0 6
  • 除非特別說明,否則本文提到的寫操作都是 buffer write/write back。 起因 前幾天討論到一個(gè)問...
    linjinhe閱讀 4,959評論 0 5
  • 顧惜語 裸體狗 顧惜語 我是一只被剃光毛的狗狗 你們可否知道 當(dāng)主人昂首挺胸大步走在前面 我懶洋洋沒精打采的跟在后...
    藍(lán)妮愛糖糖閱讀 919評論 0 4

友情鏈接更多精彩內(nèi)容