我们有两台 Solaris 服务器,我们称之为 Alice 和 Bob。
我们还有一个他们俩使用的 Solaris NFS 服务器,称之为 Charlie。
Alice 将内容写入 NFS 服务器上的文本日志文件,然后 Bob 读取该日志文件并根据日志文件中的事件采取行动。
我们遇到的问题是 Bob 看到 Alice 的文件更新似乎有些延迟。
为了进行测试,我在 Alice 上运行了:
while [ 0 ]; do echo `date` | tee -a dummy_logfile; sleep 1; done
这只是将每秒的输出写入date
文本文件,该文件存储在 NFS 服务器上。
关于 Bob,我这样做:
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、缓冲区、缓存等交互中是否有任何可以解释此行为的内容?每只猫是否以某种方式强制更新或类似操作?
此外,在 Alice(生成 dummy_logfile 的服务器)上执行操作tail -f
似乎几乎是即时的,因此它似乎不存在tail -f
自身的问题。
欢呼吧,维克多
答案1
我相信 tail -f 会查看文件的属性来确定 EOF 点,但属性通常会在 NFS 中缓存一段时间。cat 只是流式传输所有字节。
使用选项“noac”挂载 NFS。这将禁用所有属性缓存。默认情况下,属性缓存至少 3 秒,巧合的是,这正好是您的延迟时间。您可以修改选项“acregmin=x”以将其设置为更低,但您似乎希望完全禁用缓存。
警告:如果您将 NFS 共享用于其他用途,这可能会对性能造成影响。
更多 NFS 信息请参见此处的手册页:http://linux.die.net/man/5/nfs