web-dev-qa-db-ja.com

マウントポイントのファイルキャッシュを無効にする

私はこれに似たバグに遭遇しました:

RHEL NFSクライアントは、増大するファイルを読み取るときにNULLバイトを返します

したがって、私の解決策は、\ 0バイトをチェックして、ファイルを再読み込みすることでした。ここでの問題は、\ 0バイトを含む間違ったファイルが、Javaアプリケーションが実行されているシステムにキャッシュされているため、正しいファイルの内容を読み取るのにかなりの時間がかかることです。

sync && echo 2 > /proc/sys/vm/drop_cachesを実行すると、すぐに正しいコンテンツが読み取られます。

違いなくNFSマウントオプションにsyncを追加しようとしました。

特定のマウントポイントのファイルキャッシュを無効にすることは可能ですか?もしそうなら、それを行う方法は?

4
robin.koch

解決

この問題は、プライベートバグ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に存在しません。
1
alexus