测试目的
如果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