私はこれに似たバグに遭遇しました:
RHEL NFSクライアントは、増大するファイルを読み取るときにNULLバイトを返します
したがって、私の解決策は、\ 0バイトをチェックして、ファイルを再読み込みすることでした。ここでの問題は、\ 0バイトを含む間違ったファイルが、Javaアプリケーションが実行されているシステムにキャッシュされているため、正しいファイルの内容を読み取るのにかなりの時間がかかることです。
sync && echo 2 > /proc/sys/vm/drop_caches
を実行すると、すぐに正しいコンテンツが読み取られます。
違いなくNFSマウントオプションにsync
を追加しようとしました。
特定のマウントポイントのファイルキャッシュを無効にすることは可能ですか?もしそうなら、それを行う方法は?
解決
この問題は、プライベートバグ702085でRed Hat Engineeringと話し合われましたが、RHEL5製品ライフサイクル内で修復できませんでした。
Red Hat Product Managementは、以下の理由により、RHEL6内でこの問題を修復しないことを選択しました。
- この問題に対する顧客の露出は重要ではありません。
- この動作は、回避策とともにカスタマーポータルに文書化されています。
- この動作は、RHEL5と比較してRHEL6で再現するのがはるかに困難です(時間がかかります)。
- NFSプロトコルは、キャッシュの一貫性を保証しません。
回避策:
- シェルスクリプトのflockやCの
fcntl()
などのファイルロックを使用して、あるクライアントがファイルにアクセスしている間はファイルを読み取れないようにします。- _
O_DIRECT
_でファイルを開き、ページキャッシュが回避されるようにします。- [〜#〜] eof [〜#〜]を超えて読み取らないでください。
- たとえば、Pythonでは、
os.stat()
を使用してファイルサイズを取得し、os.open()
を使用してファイルを開き、os.read()
を使用して読み取り専用にします。ファイルサイズまで。- NFSマウントにあるファイルで_
tail -f
_を実行することは避けてください。- RHEL 5を使用している場合、
sync
マウントオプションもこの問題を回避します。nfs_readpage_sync()
関数がRHEL5とRHEL6の間のアップストリームで削除されたため、これはRHEL6では機能しません。そのため、関数はRHEL6に存在しません。