为什么“head -1”一个 250MB 的日志文件需要 33 秒,而“tail -1”却是瞬间完成的?

为什么“head -1”一个 250MB 的日志文件需要 33 秒,而“tail -1”却是瞬间完成的?

我正在尝试理解我的服务器中的一种奇怪行为。我们通过 NFSv4 向应用程序服务器共享一个 btrfs 卷。其中一个应用程序将使用此导出卷下的日志文件。由于文件在应用程序中保持打开状态,因此 logrotate 将使用 copytruncate 对其进行轮换。

“head”和“tail”命令均在连接了磁盘的 NFS 服务器上运行(所有服务器都在 Google Cloud Platform 上,同一区域)。“du”指定文件大约有 250MB。

是否应避免在 btrfs 卷中使用截断?如何解释这种奇怪的行为?

答案1

我发现输出第一行实际上是个问题:

head -1 file.log | wc -c

43297796

由于某种原因,第一行是很长的二进制行。

time head -1 file.log > /dev/null

实际上在 0.035 秒内就返回了。我不知道是什么导致这一行变成了二进制行,但在弄清楚之后,谜团就解开了。

相关内容