おそらく、Unix のクライアント側のキャッシュが実行されています。詳細については、O'Reilly NFS bookを参照してください。
しかし、要するに:
バッファー キャッシュを使用し、非同期スレッドが複数のバッファーをクラスター化できるようにすると、複数のマシンが同じファイルを読み書きしているときに問題が発生します。同じファイルの複数のリーダーおよびライターによるファイルの不整合を防ぐために、NFS はフラッシュ オン クローズ ポリシーを設定します。ファイルが閉じられると、ファイルの部分的に満たされたすべての NFS データ バッファーが NFS サーバーに書き込まれます。
NFS バージョン 3 クライアントの場合、stable フラグをオフに設定して行われた書き込みは、コミット操作によってサーバーの安定したストレージに強制的に書き込まれます。
NFS キャッシュの一貫性は、close-to-open キャッシュの一貫性と呼ばれるアプローチを使用します。つまり、サーバー (および他のクライアント) がファイルの一貫した最新のビューを取得する前に、ファイルを閉じる必要があります。サーバーへのヒットを最小限に抑えることを目的としたこのアプローチの欠点が見えてきました。
キャッシュを回避することは、Java では困難です。open()
O_DIRECT
Linux を使用している場合は、ファイル フラグを設定する必要があります。https://stackoverflow.com/a/16259319/5851520の詳細については、この回答を参照してください。ただし、基本的には、サーバーではなく、そのファイルのクライアントの OS キャッシュを無効にします。
残念ながら、標準の JDK は公開していませんO_DIRECT
。ここで説明されているように:ページキャッシュなしですべてのIOを行うようにJVMに強制します(例:O_DIRECT) -基本的に、JNIを自分で使用するか、適切なサードパーティのライブラリを使用します。JNA について良いことを聞きました: https://github.com/java-native-access/jna ...
または、クライアントのマウント ポイントを制御できる場合は、NFS マニュアルsync
に従ってマウント オプションを使用できます。それは言います:
マウント ポイントで sync オプションが指定されている場合、そのマウント ポイント上のファイルにデータを書き込むシステム コールは、システム コールがユーザー空間に制御を返す前に、そのデータをサーバーにフラッシュします。これにより、クライアント間のデータ キャッシュの一貫性が向上しますが、パフォーマンスが大幅に低下します。
これはあなたが探しているものかもしれません。