NFS 服务器并使用 tail -f 时有延迟?

NFS 服务器并使用 tail -f 时有延迟?

我们有两台 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

相关内容