关于rsyslog的几个测试

测试目的

如果syslog函数的调用并发很大的话,可能会因为syslogd消费太慢而阻塞;本实验观察其阻塞的几个决定因素:

1. 未消费报文数超过多少个会阻塞

2. 报文的长度允许最大多大

3. 如果报文数为超过最大值,则数据超过多少会阻塞

测试平台

ubuntu12

测试1:

1. kill -19 syslogd-pid

2. i=1; while :; do ((i++)); logger a; done

结论: 默认值为10, 可以通过修改net.unix.max_dgram_qlen来调的更大一些;

注意: 修改net.unix.max_dgram_qlen 后需要重启进程才能生效,或者kill rsyslogd (rsyslogd会自己重启的)

 

测试2:

1. while [ i < 65536 ]; do ((i++)); echo -n a>>a.txt; done

2. while :; do logger <a.txt; done

发现一条日志重复了64次,说明,单个数据包的最大数据量为1k; 但是,很有可能是logger程序故意做了这种1k的切割(通过logger的源代码确认了一下,是这样的); 使用PHP的syslog函数来写日志,只截取了其中2k的数据记录进去了,其它的就给丢弃了,不过,这个也可能是PHP给做了2k的限制; 看了下PHP的源码,没有做这样的限制,或许unix数据报的报文大小就是2k的限制了,不过,这个也太小了,难道unixsocket可以显式定义数据报的大小?

 

测试3:

创建了一个200字节的文件,并且把net.unix.max_dgram_qlen 修改为1000,kill -19 syslogd_pid 后,使用logger写了1000次文件后才阻塞,说明还是受到了net.unix.max_dgram_qlen的限制,而没有收到一个buffer的限制。猜测,难道没有这么一个buffer?

 (后测试发现写入84k的数据就开始阻塞了)

=======================

关于丢数据的问题

rsyslog的日志中发现如下日志:

Jan 1 21:19:44 phpor-VirtualBox rsyslogd-2177: imuxsock begins to drop messages from pid 2297 due to rate-limiting

 

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据