Filesystems

核心緩衝區的後台刷新

  • December 23, 2020

我的 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 文章描述了變化及其背後的動機。

引用自:https://unix.stackexchange.com/questions/625730