私のUbuntu Xenialシステムは次のとおりです。
# uname -r
4.4.0-179-generic
#
毎秒ファイルに5バイトを合計5回書き込む次の簡単なCコードがあります。
{
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
(説明されているように)価値を試みることによってその事実を発見しました。ここ)次にwatch
実行すると、/proc/vmstat
ダーティページが最初に増えて更新されたときに減少することがわかります。
$ sudo sysctl -w vm.dirty_expire_centisecs=250
$ watch -d -n 0.1 grep -e dirty /proc/vmstat
他のシェルから:
$ ./LinuxScratch
これはダーティページ(nr_dirty
)が1ずつ増加し、約2.5秒後に減少することを示しています(どちらの場合もデフォルトの3000(30秒)よりはるかに高速です)。
これページはパラメータの説明にも役立ちます。
だからすべて言った、許可された回答は元の質問を部分的に説明し、ここでの更新はこれを実証/制御する方法を示しています。私は最終的に機能を確認し、完全に理解するためにカーネルバッファをファイルシステムにフラッシュすることを何らかの方法で停止することを望んでいますが、許可された答えでカーネルは常に可能ではないと思います。モードを取得し、キャッシュに最新のデータを表示します。
答え1
コマンドはtail
ページキャッシュからも入力を受け取ります。ページキャッシュの要点は、プロセス(ファイルに書き込むプロセスだけでなくすべてのプロセス)がディスクにアクセスすることなく、キャッシュ内の必要なデータをすばやく見つけることができることです。
カーネルpdflush
スレッドがデバイス固有のカーネルスレッドに置き換えられました。これLWN.net 記事その変化の背景と動機が説明されています。