NFSマウントでファイルを開くアプリケーションを実行しています(O_DSYNC
オプション)。アプリケーションは、ループ内のファイルに6500
バイトのデータを1000回書き込みます。NFSクライアントは、アプリケーションがO_DSYNCでファイルをオープンしても書き込み要求を集約します
クライアントの動作を監視し、4096および8192バイトのバッチで基本ファイルシステムに書き込みを送信していることに気付きました。
man open
に従って、O_DSYNC
で開かれたファイルに対する書き込み操作は、同期I/Oデータの完全性完了の要件に従って完了します。さらに、私は、基礎となるファイルシステムが正常にデータを書き込んだまでO_DSYNC
で、write()
呼び出しは戻らないだろうと想定
O_DSYNC provides synchronized I/O data integrity completion, meaning write operations will flush data to the underlying hardware, but will only flush metadata updates that are required to allow a subsequent read operation to complete successfully.
、と述べています。それはここで起こっていることではありません。 NFSクライアントは書き込みをキャッシュし、それらを4kの倍数でフラッシュします。なぜこれはそうですか? 、私は唯一のストレージ・ブロック・サイズの倍数であることができ、4096
古いバージョンでどのような動作が見られますか? –
@AndrewHenle、同時に2つの異なるマシンでライターとリーダを実行すると、ループの500回以上の繰り返し後に4分間スリープします。アプリケーションは '6500xnumber_of_iterations'バイトを書き込んだログを出力しますが、読者は数バイト短くすると主張しています。これは4.9のみであり、4.1では見られない。 – user1071840
O_DSYNCは、プロセス内のファイルバッファのみを参照します。 NFSには、書き込みとキャッシュを即時に行うSYNCオプションがあります。また、NFSエクスポートで同期を設定する必要があります。 – stark