11

書き込み呼び出しが戻ると、カーネルが管理するページにデータがコピーされます。そのページには、複数のプロセスからの書き込みを含めることができます。そのため、アプリケーションの 1 つが fsync 呼び出しを発行すると、ページ全体がフラッシュされます。つまり、他のアプリケーション データもフラッシュされますが、fsync を呼び出すプロセスによってコストが発生します。これは正しいです?

4

2 に答える 2

9

fsync単一のファイルで動作します。そのファイルに加えられたすべての変更をフラッシュします。複数のプロセスが 1 つのファイルに書き込んでいる場合、fsync呼び出しを行ったプロセスは、すべての変更がディスクに書き込まれるまで一時停止されます。

一部のジャーナリング ファイルシステムが登場すると、これはさらに複雑になります。たとえば、ジャーナル内の fsync ファイルの前に、すべてのファイルへのすべての変更をフラッシュするには、「順序付き」モードの ext3 および ext4 (より少ない範囲で) が必要です。

つまり、プログラムが大規模なデータベース、大規模なログ ファイル、またはビデオ ファイルに書き込んでいて、次にfsync2 行の構成ファイルをfsync書き込んでいた場合、これらすべてのメガバイトのデータが書き込まれてから戻るまで待つ必要があります。

これが、ext4 を「ライトバック」モードで実行する理由です。これにより、クラッシュ後に正しいサイズのファイルがゼロで埋められるなど、不快な結果が生じる可能性があります。しかし、通常の操作では、「書き戻し」は非常に高速であるため、トレードオフの価値があると感じています。

于 2012-12-21T19:09:42.980 に答える
2

man ページ'flushes to disk any data written to this file' には、ファイルのメタデータが含まれていると記載されています。

sync これを、キャッシュ全体からすべてのダーティページをディスクに書き込むものと混同していると思います。ダーティ ページ == データが変更されました。そして、プロセスはそのすべてが完了するまで待たなければなりません。コストで待機することを意味する場合、はい、これにはコストがかかります。カーネル時間は、プロセス システム時間のリソース使用量に追加されます。

fsync にもコストがかかり、さらに sync よりもはるかに短いカーネル時間 (通常) がかかります。

于 2012-12-21T18:51:32.970 に答える