我想知道如果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”时,发生了什么事情
正如你所看到的,一个缓慢的互联网连接不会影响到步骤#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)。