NFSクライアント側の属性キャッシングに問題があります。私はいくつかのサーバーを使用しています。1つはNFSサーバーで、他はNFSクライアントサーバーです。
すべてのサーバーはDebian(lenny、Linuxの2.6.26-2-AMD64)で、バージョンは次のとおりです。
% dpkg -l | grep nfs
ii libnfsidmap2 0.20-1 An nfs idmapping library
ii nfs-common 1:1.1.2-6lenny1 NFS support files common to client and server
ii nfs-kernel-server 1:1.1.2-6lenny1 support for NFS kernel server
NFSサーバーでは、/ etc/exportsは次のように記述されます。
/export-path 192.168.0.0/255.255.255.0(async,rw,no_subtree_check)
NFSクライアントでは、/ etc/fstabは次のように記述されます。
server:/export-path /mountpoint nfs rw,hard,intr,rsize=8192,async 0 0
ご覧のとおり、マルチクライアントアクセスのパフォーマンスには「非同期」オプションが使用されています。ただし、これにより誤ったキャッシュエラーが発生する場合があります。
私は多くのサーバーを保守しているため(マウントオプションを変更するためのそれほど強力な権限を持っていません)、/ etc/exportsや/ etc/fstabを変更したくありません。ユーザー権限でNFSクライアント側の属性キャッシュを「クリーンアップ」するコマンドラインツールがあれば十分だと思います。
そのようなコマンドがあるかどうか教えてください。
おかげで、
「偽キャッシュエラー」とは、
% ls -l /data/1/kabe/foo
ls: cannot access /data/1/kabe/foo: No such file or directory
% ssh another-server 'touch /data/1/kabe/foo'
% ls -l /data/1/kabe/foo
ls: cannot access /data/1/kabe/foo: No such file or directory
時々そのようなケースが起こります。 NFSはClose-to-Openの一貫性を保証していると言っているので、問題はファイルの内容ではなく、ファイルの属性(= dentries情報)です。
「誤ったキャッシュエラー」の意味によっては、sync
を実行すると必要な情報が得られる場合があります。これにより、すべてのファイルシステムバッファがフラッシュされます。
必要に応じて、/proc/sys/vm/drop_caches
を使用して、カーネルのVMキャッシュをクリアすることもできます。
# To free pagecache
echo 1 > /proc/sys/vm/drop_caches
# To free dentries and inodes
echo 2 > /proc/sys/vm/drop_caches
# To free pagecache, dentries and inodes
echo 3 > /proc/sys/vm/drop_caches
特定のプロセス内で、ファイルの親ディレクトリに対してopendirおよびclosedirを呼び出すと、NFSキャッシュが無効になります。ジョブスケジューラのプログラミング中にこれを使用しました。とても、とても役に立ちました。それを試してみてください!
AFAIK、sync
およびasync
オプションは、属性キャッシュのソースではありません。 Async
を使用すると、サーバーはサーバーファイルシステムへのデータの保存を遅延できます。 NFSサーバーに障害が発生した場合の書き込み耐久性に影響しますが、NFSサーバーが安定している場合、async
はNFSクライアントに影響しません。
lookupcache=positive
NFSマウントオプション。ネガティブルックアップキャッシュを防止するために使用される場合があります。ファイルが実際にサーバー上に存在する場合、NFSは「そのようなファイルまたはディレクトリはありません」を返します。見る Directory entry caching
in man nfs
。
NFSの属性キャッシュの効果が表示されています。見る man nfs
、チェックアウトDATA AND METADATA COHERENCE
。
デフォルトでは、NFSは属性を最小30秒(acregmin
およびacdirmin
)、最大60秒(acregmax
およびacdirmax
)キャッシュします。これらすべてをactimeo
でオーバーライドするか、noac
で属性キャッシュを完全に無効にすることができます。 noac
マウントオプションを使用すると、OPによって記述された動作はなくなりますが、パフォーマンスに影響します。
lookupcache=positive
は、新しいファイルの外観を探しているだけの場合に便利ですが、削除は引き続き属性キャッシュを通過します。
nfsサーバー上の/ var/lib/nfs/rmtabファイルをクリアします。
以下のコマンドは、メモリ関連の問題をクリアするために使用されます。そしてそれも非常に危険です。ボックスにホストされているurアプリケーションがクラッシュします
# sync
# To free pagecache
echo 1 > /proc/sys/vm/drop_caches
# To free dentries and inodes
echo 2 > /proc/sys/vm/drop_caches
# To free pagecache, dentries and inodes
echo 3 > /proc/sys/vm/drop_caches