Solaris

NFS 伺服器和使用 tail -f 的延遲?

  • March 16, 2011

我們有兩台 Solaris 伺服器,我們稱它們為 Alice 和 Bob。

我們還有他們倆都使用的 Solaris NFS 伺服器,稱為 Charlie。

Alice 寫入 NFS 伺服器上的文本日誌文件,然後由 Bob 讀取,Bob 對該日誌文件中的事件採取行動。

我們遇到的問題是 Bob 看到 Alice 對文件的更新似乎有些延遲。

為了測試,我在 Alice 上執行:

while [ 0 ]; do echo `date` | tee -a dummy_logfile; sleep 1; done

date這只是將每秒的輸出寫入一個文本文件,該文件儲存在 NFS 伺服器上。

在鮑勃上,我這樣做:

tail -f dummy_logfile

我注意到 Bob 看到事件似乎有大約 3 秒的延遲。tail -f 將回顯一個日誌行,然後暫停大約 3 秒,然後吐出 3 秒的日誌行,然後再輸出 3 秒的空行,然後輸出另一組,等等。

但是,如果在 Bob 我這樣做:

while [ 0 ]; do cat dummy_logfile ; sleep 1; done

它會立即重複 dummy_logfile 中的每一行。

所以看起來tail -f讀取 NFS 共享被延遲了,但是 cat 讀取 NFS 共享卻沒有。我的印像是tail -f近乎即時的。

NFS、緩衝區、記憶體等的互動中是否有任何東西可以解釋這種行為?每隻貓都會以某種方式強制更新嗎?

此外,tail -f在 Alice(生成 dummy_logfile 的伺服器)上執行操作似乎幾乎是即時的,因此它本身似乎沒有問題tail -f

乾杯,維克多

我相信 tail -f 查看文件的屬性以確定 EOF 點,但屬性通常會在 NFS 中記憶體一段時間。cat 只是流式傳輸所有字節。

使用“noac”選項掛載 NFS。這將禁用所有屬性記憶體。預設情況下,屬性至少記憶體 3 秒,巧合的是,這正是您的延遲時間。您可以修改選項“acregmin=x”以將其設置得更低,但您似乎希望完全禁用記憶體。

注意:如果您將 NFS 共享用於其他用途,這可能會導致性能下降。

此處手冊頁上的更多 NFS 資訊:http: //linux.die.net/man/5/nfs

引用自:https://serverfault.com/questions/247929