tail 可以减慢 Linux(ext3)上的日志写入速度吗?

tail 可以减慢 Linux(ext3)上的日志写入速度吗?

我想知道 tailf 是否会生成阻塞 I/O,从而因日志记录而降低服务器响应速度。

例如假设以下设置:

Debian 5.1 Linux 服务器(foo)通过终端管理(foo 托管在 EC2 上)。

Foo 运行多个应用程序,每个应用程序都写入自己的日志文件。为了举例说明,Apache httpd 写入 /var/log/apache/access.log,Tomcat 5.5 写入 /var/log/tomcat5.5/myApp.log。

如果我打开与 foo 的 ssh 连接(注意:互联网链接,高延迟,上传相对较慢)并运行,tail -F /var/log/apache/access.log我是否会出现这样的情况:内核阻止 httpd 对此日志文件的写入,从而由于每个线程强制等待而降低 httpd 的性能?

为了给出一些数字,我们假设 foo 每秒记录约 200kb 的日志数据,这些数据需要通过网络推送到 ssh 客户端。

另一个理论方面:如果 /var/log 文件系统设置在无限大小的 RAM 上(记住:理论上讲),从而消除硬盘寻道时间,会发生什么?

第三个方面,如果我从一个非常慢的链接打开 ssh 连接,会发生什么(假设 foo 的流量整形为仅推送 5kb/s 的上传速度)?

很想听听大家的想法。

谢谢阅读,马克西姆。

答案1

我认为这里不会出现 I/O 阻塞。当您执行“tail -f”时,发生的事情是

  1. 你的 shell 进程,比如说 bash,将产生一个新的进程“tail”。
  2. tail 将打开文件,将文件指针移动到末尾,等待 3 秒并检查是否有新数据。
  3. 如果有新数据,tail 将使用 unix 管道将其推送回 bash。
  4. 这些数据通过 bash + ssh 从服务器传输到您的机器。

所以正如您所看到的,慢速的互联网连接不会影响步骤#2,无论如何这都是 I/O 性能的关键。

此外,tail 以“只读”模式打开文件,并且根据经验猜测,日志以“仅追加”模式打开,因此这里应该不需要担心太多锁定。如果您仍然对此有点担心,那么您可能想尝试一下伊诺泰尔它基于最新的 linux inotify api 以避免轮询文件。

希望这对你有帮助,亚历克斯

答案2

我认为不太可能。我相信写入将被缓存在 RAM 中,而且由于它们刚刚写入,我猜想 tail 也会从 RAM 中读取这些页面。这些页面将定期同步到磁盘。如果 Apache 阻塞等待日志写入磁盘,我会感到惊讶。

答案3

正确的答案是,读取日志的进程和写入日志的进程没有任何关联。它们是独立的进程,而不是线程。它们不共享内存,并且它们有自己的文件句柄和文件句柄指针。两者不会以任何方式影响对方。内核不会因为其他程序正在读取文件而停止写入。它会做一些事情来加快速度(当磁盘繁忙时将缓存写入 RAM,与使用该文件的所有文件描述符共享缓存等),但不会减慢速度!

关于 tail 如何工作的另一个答案只对了一半。它不使用管道与 bash 通信。Bash 暂停等待 tail 完成(除非使用 & 运行)。Tail 从 bash 继承了“stdout”文件描述符(默认情况下连接到您的终端)并直接写入它。将它管道化回 bash,执行任务切换到 bash 以读取数据,然后让 bash 写入输出,这样效率很低。Unix 的设计简单而有效,大多数情况下都是将 stdin 转换为 stdout。

当前版本的 GNU tail 完全支持 inotify API 以避免轮询。这通常不会对 tail 产生太大影响。它主要是为了让文件管理器可以更新目录,让服务器知道何时重新读取配置文件(无需重新启动服务器)。您还可以让 tail 跟踪日志轮换(通常它会保留其文件描述符)。另一个有用的功能是“tac”,它将反转其输入行。这允许您在处理日志文件以进行 Web 显示时将最新信息放在顶部。最后,ccze 将为您的日志文件着色,以便于查看(ANSI 或 HTML)。

相关内容