通过rsyslogd(8)进行异步日志记录并增加写入缓冲区


10

在运行在虚拟容器(VMware)中且缺少本地存储的高流量网站上,我们已经从直接登录到日志文件(驻留在远程网络存储中)切换为日志文件,从而显着提高了吞吐量(每秒请求数)rsyslogd

本质上,我们已经从同步日志记录切换到异步日志记录。Web服务器工作人员使用syslog(3)写入一些内存缓冲区,而rsyslogd(8)则以其自身速度将数据并行发送到实际文件中,因此在记录时进程不会在IO上阻塞。

到现在为止还挺好。问题在于,有时rsyslogd会被阻止写入(例如,瞬时/长时间的网络中断),并且传入缓冲区会迅速填满。

我的问题是:

  • 使用syslog(3)写入rsyslogd时,客户端可以阻止吗?
  • 有没有办法查看rsyslogd的统计信息,例如缓冲区的大小?
  • 有没有办法增加rsyslogd输入缓冲区的大小?

2
你有解决过这个吗?如果是这样,我很想阅读您的答案。
djeikyb

1
@djeikyb:对不起,不。我看到了兴趣(对此问题进行投票),但尚未有人回答。看起来这需要对源代码进行深入研究。
arielf 2014年

1
您没有说您正在使用哪个Web服务器。也许您根本不应该使用syslog。例如,Apache是​​使用syslog记录日志,还是仅写入日志文件?登录数据库是另一种可能性。
blujay 2014年

Answers:


1

据我所知,rsyslog中主消息队列的默认模式是固定大小数组。最多可容纳10k个元素。尝试将其更改为链接列表队列,它应该可以更好地处理偶发的消息。

是的,有FixedArrayLinkedList队列。


“尝试改变” ...您能说得更清楚些吗?看/etc/rsyslog.conf:我没有看到与您提到的队列类型有关的任何东西。这是否需要更改代码?这些在哪里以及如何配置?谢谢!
arielf '16

1

第一个问题的答案是:

是的,任何对syslog()的调用都被阻止。可能时间很短,但它仍然是涉及文件描述符的同步调用。请参阅man 3 syslog以获取更多细节。

除非您的服务器使用异步体系结构和原语,否则总会有一些锁定。例如,通过使用单独的线程进行日志记录,可以缓解但不能消除这种情况。对于其他两个问题,我不是很清楚,但是检查rsyslogd源代码(以及对syslog()系列函数的源代码)是唯一了解的方法。

更一般而言,如果您通过UDP:514“网络系统日志协议”将日志记录移至外部服务器,则可以创建几乎为零的锁。随着一些记录可能丢失的缺点高负荷期间。

首先,在“原始”服务器中,您需要确保所有日志记录都是通过syslog进行的。例如,在Apache2中,您需要指定:

ErrorLog "syslog:daemon"

对于其他服务器,请参考正确的手册页。如果不能确保这一点,请记住登录文件系统可以创建

其次,在原始rsyslogd配置中,您要求将您选择的功能(此示例中为“守护程序”)的所有系统日志流量定向到一个或多个外部系统日志服务器。在rsyslog配置文件中,您可以指定:

daemon.* @192.168.128.1
daemon.* @192.168.254.1

将日志的两个副本同时发送到两个不同的服务器。

第三,在目标服务器中,启用通过UDP:514接收系统日志消息。它位于(目标)rsyslogd配置文件中,通常被defualt禁用(足以删除前导#:

$ModLoad imudp
$UDPServerRun 514

第四,可选但强烈建议,我还将启用高分辨率时间戳记:

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

同样,默认情况下通常也禁用此选项(为什么在地球上?)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.