核心緩衝區的後台刷新
我的 Ubuntu Xenial 系統如下:
# uname -r 4.4.0-179-generic #
我有以下簡單的 C 程式碼,它每秒將 5 個字節寫入文件,總共 5 次:
{ int fd = open("test.txt", O_WRONLY | O_TRUNC); if (fd == -1) return -1; int x = 0; while (x++ < 5) { write(fd, "Hello", 5); sleep(1); } }
我還有以下內容:
# cat /proc/sys/vm/dirty_writeback_centisecs 500 #
但是,當我
tail -f test.txt
看到輸出立即出現在文件中時:根據上述內容,我希望它只在 5 秒後出現。我對此進行了大量研究,發現它pdflush
不再存在,但無法找出哪個程序/執行緒負責在我的核心中寫回臟頁。有人可以解決這個問題,以及我如何控制數據何時刷新到我的文本文件?
更新:
在下面的答案之後,我測試了查看文件的修改時間。
LinuxScratch
是前面顯示的程式碼所在的二進製文件的名稱。我們可以看到文件確實每秒都在更新:
$ ./LinuxScratch & [1] 1475 $ ls --time-style='+%d-%m-%Y %H:%M:%S' -l total 104 -rwxrwxr-x 1 ubuntu ubuntu 37576 22-12-2020 19:35:46 LinuxScratch -rw-rw-r-- 1 ubuntu ubuntu 15 22-12-2020 19:41:47 test.txt $ ls --time-style='+%d-%m-%Y %H:%M:%S' -l total 104 -rwxrwxr-x 1 ubuntu ubuntu 37576 22-12-2020 19:35:46 LinuxScratch -rw-rw-r-- 1 ubuntu ubuntu 20 22-12-2020 19:41:48 test.txt $ ls --time-style='+%d-%m-%Y %H:%M:%S' -l total 104 -rwxrwxr-x 1 ubuntu ubuntu 37576 22-12-2020 19:35:46 LinuxScratch -rw-rw-r-- 1 ubuntu ubuntu 25 22-12-2020 19:41:49 test.txt $ ls --time-style='+%d-%m-%Y %H:%M:%S' -l total 104 -rwxrwxr-x 1 ubuntu ubuntu 37576 22-12-2020 19:35:46 LinuxScratch -rw-rw-r-- 1 ubuntu ubuntu 25 22-12-2020 19:41:49 test.txt [1]+ Done ./LinuxScratch $
更新 2
我還發現關於負責刷新的執行緒,這個答案指出它是通用的
$$ kworker/#.## $$負責執行回寫的核心執行緒。 更新 3
在閱讀了答案中的 LWN.net 文章後,我做了更多的研究,發現通過試驗(如此處
/proc/sys/vm/dirty_expire_centisecs
所述)的值並執行on ,我可以看到臟頁在刷新時增加然後減少。watch``/proc/vmstat
$ sudo sysctl -w vm.dirty_expire_centisecs=250 $ watch -d -n 0.1 grep -e dirty /proc/vmstat
在另一個外殼中:
$ ./LinuxScratch
這表明臟頁
nr_dirty
(該頁面對於參數描述也很有用。
總而言之,接受的答案部分解釋了原始問題,我在這裡的更新展示瞭如何展示/控制這一點。我最終希望能夠以某種方式停止將核心緩衝區刷新到文件系統,只是為了查看(因此完全理解)功能,但我從公認的答案中猜測這可能是不可能的,因為核心總是獲取的方式並顯示其記憶體中的最新數據。
您的
tail
命令還從頁面記憶體中獲取其輸入。頁面記憶體的全部意義在於一個程序(任何程序,不僅是寫入文件的程序)可以從記憶體中快速找到想要的數據,而無需訪問磁碟。
pdflush
核心執行緒已被 per-backing-device 核心執行緒取代。這篇LWN.net 文章描述了變化及其背後的動機。