ローカルキャッシュが期限切れにならない高レイテンシ、低スループットリンクでNFS4 + CacheFilesd設定を構築する必要があります。唯一の無効化の意味は、何かが更新されたときにNFSサーバーコールバックでなければなりません(しかし、これはうまく機能し、サーバーファイルの変更はすぐにクライアントに渡されます)。このインストールは読み取り専用なので、ロックはありません。
質問:ローカルキャッシュから要求されたファイルを常に正しく読み取っても過去60秒間ファイルにアクセスしていない場合は、actimeo = 86400が設定されているかどうかにかかわらず、ファイルプロパティを引き続き取得します。これは、ファイルが開く頻度に関連しているようです。 50秒以下ごとにファイルを開いておく限り、うまく動作するからです。
概念の証拠:
(サーバーネットワークの遅延時間は人為的に2000ミリ秒に設定されており、いつ属性チェックが行われるかを明確に知ることができます。)
各要求が期待どおりに100%キャッシュヒットを生成してから50秒待ちます。これは無期限に続く。
root@client:~# while : ; do /usr/bin/time -f%e cat /nfs-mount/2bytes-file > /dev/null ; sleep 50 ; done
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
リクエスト間の遅延を70秒に設定し、結果がどれほど一貫していないかを確認します。
root@client:~# while : ; do /usr/bin/time -f%e cat /nfs-mount/2bytes-file > /dev/null ; sleep 70 ; done
0.00
0.00
0.00
0.00
0.00
0.00
6.00 # <- Attributes fetched. Debug log recorded "NFS: nfs_update_inode(0:69/68697599 fh_crc=0xb9b7a69e ct=2 info=0x26040)"
4.00 # <- Attributes fetched. Debug log recorded "NFS: nfs_update_inode(0:69/68697599 fh_crc=0xb9b7a69e ct=2 info=0x26040)"
0.00
0.00
0.00
6.00 # <- Attributes fetched. Debug log recorded "NFS: nfs_update_inode(0:69/68697599 fh_crc=0xb9b7a69e ct=2 info=0x26040)"
4.00 # <- Attributes fetched. Debug log recorded "NFS: nfs_update_inode(0:69/68697599 fh_crc=0xb9b7a69e ct=2 info=0x26040)"
0.00
0.00
0.00
また、nfsstats は、これらの遅延が発生したときに追加の「getattr」を追加します。
create delegpurge delegreturn getattr getfh link
2 0% 0 0% 82 0% 177063 10% 87644 5% 0 0%
最後に、遅延が110秒以上に設定されている場合は、何らかの理由ですべての要求がサーバーによって確認されます。
root@client:~# while : ; do /usr/bin/time -f%e cat /nfs-mount/2bytes-file > /dev/null ; sleep 110 ; done
6.00
6.00
6.00
6.00
6.00
6.00
6.00
「cat」の代わりにnginxを使用し、「ioping」を介してHTTP経由でこの2バイト長のファイルを提供することで、同じ動作を正常に再現しました。
Cachefiled はパーティションに十分なスペースがあるため、それ自体は何も消去しません。
/dev/vdb 20G 3,0G 16G 17% /disk2/fscache
2GBファイル(クライアントの物理メモリサイズより大きい)に対して同じテストを実行すると、2秒間(ネットワーク設定の遅延)中断され、その後はコンテンツ自体ではなくファイルのメタデータにのみアクセスすることがわかります。ディスクから読み取ると予想されるCachefilesdローカルキャッシュファイルをクリックし始めます。
クライアントが更新のためにサーバーを再確認するようにするこの1〜2分間、何が起こっているのかは本当にわかりません。これは私の設定の目的を崩します。
/etc/export:
/cache 192.168.122.234(ro,async,no_subtree_check)
クライアントマウント:
root@client:~# mount -t nfs4 -o lookupcache=all,actimeo=86400,nocto,ro,intr,soft,proto=tcp,async,fsc 192.168.122.1:/cache /nfs-mount
root@client:~# cat /proc/mounts | grep nfs
192.168.122.1:/cache /nfs-mount nfs4 ro,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=86400,acregmax=86400,acdirmin=86400,acdirmax=86400,soft,nocto,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.122.234,fsc,local_lock=none,addr=192.168.122.1 0 0
サーバーはCentos 7で、クライアントはUbuntu 16.04です。パッケージはディストリビューションリポジトリからインポートされます。
root@client:~# dpkg -l | grep nfs ii libnfsidmap2:amd64 0.25-5 amd64 NFS idmapping ライブラリ ii nfs-common 1:1.2.8-9ubuntu12 amd64 クライアントとサーバーに共通の NFS サポートファイル ii nfs4-acl-tools 0.3およびGUI ACLユーティリティ
また、Ubuntuをサーバーとして使用し、CentOS 7をクライアントとして使用しようとしましたが、成功しませんでした。