問題現象
當您用台 ECS 掛載同一個 NFS 文件系統,在 ECS-A 上 append 寫文件,在 ECS-B 用 tail -f 觀察文件內容的變化。在 ECS-A 寫完之后,在 ECS-B 看到文件內容變化會有 10-30 秒的延時。然而相同的場景下,如果直接在 ECS-B 上打開文件(比如 vi )卻是立即可以看到更新的內容的。
原因
該現象與 mount
的選項以及 tail -f
實現相關。
用戶使用的mount命令為:mount -t nfs4 /mnt/
對於在 ECS-B 上以這一方式 NFS mount 的文件系統,默認情況下 kernel 對文件和目錄的屬性維護了一份metadata 緩存,文件和目錄屬性(包括許可權、大小、和時間戳記)緩存的目的是減少 NFSPROC_GETATTR 遠程過程調用(RPC)的需求。
tail -f 的實現是 sleep + fstat 來觀察文件屬性(主要是文件大小)的變化,然后讀入文件並輸出。可見,tail -f 是否能實時輸出文件內容主要取決於 fstat 的結果,由於 metadata cache 的存在,fstat 輪詢到的並不是實時的文件屬性。因此,即使在 NFS 服務器端文件已經更新了,但 tail -f 卻沒法知道文件已經改動了,於是輸出就會出現延時。
解決方法
使用 mount 的 noac 選項可以 disable 文件和目錄屬性的緩存。
mount -t nfs4 -o noac /mnt/