現象
ECS-A時にファイルにデータを追加し、ECS-B時にtail -fコマンドを使用してファイルの内容を表示します。 コンテンツを表示する前に、10〜30秒待つ必要があります。 注: 2つのECS (Elastic Compute Service) インスタンスにNFS (Network File System) をマウントすると、2つのECSインスタンスがECS-Aされ、ECS-Bされます。 ただし、viなどのツールを使用してECS-Bでファイルを開くと、すぐに内容を表示できます。
発生源
遅延は、mountオプションとtail -fコマンドの実装によって発生します。
mount -t nfs4 /mnt/ コマンドを使用してECSインスタンスにNFSファイルシステムをマウントする場合、Linuxはデフォルトでファイルとディレクトリの属性をメタデータとしてキャッシュします。
これらの属性には、権限、サイズ、およびタイムスタンプが含まれます。 これにより、NFSPROC_GETATTR RPCリクエストの数が減ります。
tail -fコマンドは、sleep関数とfstat関数を呼び出して、ファイル属性の変更を監視し、ファイルを読み取り、結果を出力します。 ほとんどの場合、これらの変更はサイズに関連しています。 ファイルの内容を表示するには、tail -fコマンドを使用します。 表示されるこれらのファイルの内容は、最新または期限切れになる可能性があります。 結果は、fstat関数の出力に基づいて変化します。 属性キャッシュにより、fstat関数は古いファイル属性を取得することがあります。 NFSサーバ上でファイルを更新しても, tail -fコマンドでは最新のファイルを取得できません。 したがって、書き込み遅延の問題が発生します。
対応策
次のコマンドとnoacオプションを使用して、ファイルシステムをマウントします。 このオプションは属性キャッシュを無効にします。
mount -t nfs4 -o noac /mnt/