書き込み呼び出しが戻ると、カーネルが管理するページにデータがコピーされます。そのページには、複数のプロセスからの書き込みを含めることができます。そのため、アプリケーションの 1 つが fsync 呼び出しを発行すると、ページ全体がフラッシュされます。つまり、他のアプリケーション データもフラッシュされますが、fsync を呼び出すプロセスによってコストが発生します。これは正しいです?
2 に答える
fsync
単一のファイルで動作します。そのファイルに加えられたすべての変更をフラッシュします。複数のプロセスが 1 つのファイルに書き込んでいる場合、fsync
呼び出しを行ったプロセスは、すべての変更がディスクに書き込まれるまで一時停止されます。
一部のジャーナリング ファイルシステムが登場すると、これはさらに複雑になります。たとえば、ジャーナル内の fsync ファイルの前に、すべてのファイルへのすべての変更をフラッシュするには、「順序付き」モードの ext3 および ext4 (より少ない範囲で) が必要です。
つまり、プログラムが大規模なデータベース、大規模なログ ファイル、またはビデオ ファイルに書き込んでいて、次にfsync
2 行の構成ファイルをfsync
書き込んでいた場合、これらすべてのメガバイトのデータが書き込まれてから戻るまで待つ必要があります。
これが、ext4 を「ライトバック」モードで実行する理由です。これにより、クラッシュ後に正しいサイズのファイルがゼロで埋められるなど、不快な結果が生じる可能性があります。しかし、通常の操作では、「書き戻し」は非常に高速であるため、トレードオフの価値があると感じています。
man ページ'flushes to disk any data written to this file'
には、ファイルのメタデータが含まれていると記載されています。
sync
これを、キャッシュ全体からすべてのダーティページをディスクに書き込むものと混同していると思います。ダーティ ページ == データが変更されました。そして、プロセスはそのすべてが完了するまで待たなければなりません。コストで待機することを意味する場合、はい、これにはコストがかかります。カーネル時間は、プロセス システム時間のリソース使用量に追加されます。
fsync にもコストがかかり、さらに sync よりもはるかに短いカーネル時間 (通常) がかかります。