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

我想知道如果tailf可以生成阻塞I / O,这将减慢由于日志logging的服务器响应。

例如。 假设以下设置:

Debian 5.1 linux服务器(foo)通过terminal(foo托pipe在EC2上)进行pipe理。

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的性能,因为在每个线程强制执行?

为了给出一些数字,让我们假设foologging每秒约200kb的日志数据,这些数据需要通过线路传送到ssh客户端。

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

第三方面,如果我从一个非常慢的链接打开ssh连接会发生什么情况(让我们假设foo是stream量整形,只推送5kb / s的上传)?

很想听听你的想法。

感谢您阅读,Maxim。

我不认为这里会有一些阻止I / O。 当你做“尾巴-f”时,发生了什么事情

  1. 你的shell进程,比方说bash,会产生一个新的进程“尾巴”。
  2. 尾部会打开文件,将文件指针移到最后,等待3秒钟,检查是否有新的数据。
  3. 如果有新的数据,尾巴将使用unixpipe道将其推回到bash。
  4. 这个数据通过bash + ssh从服务器传输到你的机器。

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

此外,尾巴以“只读”模式打开文件,并且,一个有教养的猜测,日志打开在“仅附加”模式,所以不应该有太多的锁在这里担心。 如果这还有点让你担心的话,那么你可能要试试基于最新的linux inotify api的inotail来避免轮询文件。

希望这有助于,亚历克斯

我不认为这是可能的。 我相信写入内容将被caching,因为他们只是写了,我想这个尾巴也会从内存中读取这些页面。 页面将定期同步到磁盘。 如果Apache阻止等待日志自己写到磁盘,我会感到惊讶。

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

关于尾巴工作的另一个答案是半正确的。 它不使用pipe道与bash交谈。 Bash被暂停等待尾部完成(除非与&运行)。 尾从bashinheritance“stdout”文件描述符(默认连接到您的terminal),并直接写入它。 把它重新打到bash,做一个任务切换到bash来读取数据,并且有bash写输出是没有效率的。 Unix的devise是简单而有效的,stdin的标准输出大部分的一切。

当前版本的GNU tail完全支持inotify API以避免轮询。 这通常不会对尾部造成太大的影响。 它的主要目的是使文件pipe理器可以更新目录和服务器,知道何时重新读取configuration文件(无需重新启动服务器)。 你也可以跟踪日志旋转(通常它保持其文件描述符)。 另一个有用的是“tac”,它将会改变它的input行。 这允许您在处理Web显示的日志文件时在顶部显示最新的信息。 最后,ccze会着色日志文件,以便查看(ANSI或HTML)。