Page Cache的落地问题
除非特別說明,否則本文提到的寫操作都是 buffer write/write back。
起因
前幾天討論到一個問題:Linux 下文件 close成功,會不會觸發(fā) “刷盤”?
其實這個問題根本不用討論,查一下就知道。
man 2 close 的 NOTES 一節(jié)里有這么一段話:
A successful close does not guarantee that the data has been successfully saved to disk, as the kernel defers writes. It is not common for a filesystem to flush the buffers when the stream is closed. If you need to be sure that the data is physically stored use fsync(2). (It will depend on the disk hardware at this point.)
所以,一個文件的描述符被 close 成功,并不會觸發(fā)操作系統(tǒng)刷盤。
那么,問題來了,除了主動調(diào)用fsync(或相關(guān)函數(shù))之外,Linux 什么時候會“刷盤”呢?
一次正常的寫流程
一次寫數(shù)據(jù)的典型流程(不考慮異常和其它特殊情況):
1、數(shù)據(jù)在用戶態(tài)的 buffer 中,調(diào)用 write 將數(shù)據(jù)傳給內(nèi)核;
2、數(shù)據(jù)在 Page Cache 中,返回寫入的字節(jié)數(shù)(成功返回);
3、內(nèi)核將數(shù)據(jù)刷新到磁盤。
第二步如果返回成功,說明數(shù)據(jù)已經(jīng)到達(dá)操作系統(tǒng)的Page Cache,可以保證的是如果進程掛了,但是操作系統(tǒng)沒掛,數(shù)據(jù)不會丟失。
如果調(diào)用 fsync 將數(shù)據(jù)刷新到磁盤上,返回成功,說明數(shù)據(jù)已經(jīng)刷新到硬件上了——我們一般認(rèn)為如果 fsync 返回成功,則表示數(shù)據(jù)持久化成功。
Page Cache 的異步刷新
那么,如果不調(diào)用fsync或其它類似功能的接口,Page Cache 是什么時候刷回磁盤的呢?
簡單總結(jié)一下,有兩種情況:
1、臟頁太多。
2、臟頁太久。
這些都由 Linux 內(nèi)核的后臺線程執(zhí)行。相關(guān)的控制參數(shù)有:
說明: centy 中文意思是“百分之十”。
- dirty_writeback_centisecs 表示多久喚醒一次刷新臟頁的后臺線程。這里的500表示5秒喚醒一次。
- dirty_expire_centisecs 表示臟數(shù)據(jù)多久會被刷新到磁盤上。這里的3000表示 30秒。
- dirty_background_ratio 表示當(dāng)臟頁占總內(nèi)存的的百分比超過這個值時,后臺線程開始刷新臟頁。這個值如果設(shè)置得太小,可能不能很好地利用內(nèi)存加速文件操作。如果設(shè)置得太大,則會周期性地出現(xiàn)一個寫 IO 的峰值。
- dirty_ratio 當(dāng)臟頁占用的內(nèi)存百分比超過此值時,內(nèi)核會阻塞掉寫操作,并開始刷新臟頁。
- dirty_background_bytes、dirty_bytes 是和 dirty_background_ratio、dirty_ratio 表示同樣意義的不同單位的表示。兩者不會同時生效。
總結(jié)
觸發(fā)刷新臟頁的條件:
1、調(diào)用fsync等。
2、臟頁太多(相關(guān)參數(shù):dirty_background_ratio與dirty_ratio)。
3、臟頁太久(相關(guān)參數(shù):dirty_expire_centisecs)。
參考資料
- Linux Man Page
- Better Linux Disk Caching & Performance with vm.dirty_ratio & vm.dirty_background_ratio
作者:linjinhe
鏈接:https://www.jianshu.com/p/ed5900d31f1f
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
轉(zhuǎn)載于:https://www.cnblogs.com/lushilin/p/9145523.html
總結(jié)
以上是生活随笔為你收集整理的Page Cache的落地问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从操作系统层面描述线程的五种状态
- 下一篇: 【Java】JavaSocket编程开发