apache log引发io问题
?
目前公司中使用到了apache+jetty/jboss的架构模式,apache承担了日志记录的一个职责。
?
同事在做性能测试时,发现一个奇怪的现象:15个并发直接压apache,load居然达到了100多,tps只有200多。直接压后端的jboss tps可以有1000多。
?
1. 刚开始以为是apache keepalive的搞怪,但后来确认apache配置文件的keepalive模式已经是Off。看了下tcp状态,近1000个close_wait状态(说明是客户端主动关闭,服务端是被动关闭),ESTABLISHED也就20多个.
?
2. 下一步确认apache和后端的jboss链接是否存在异常,通过观察mod_jk的日志文件,ajp协议的tcp链接状态,一切正常,而且链接数也就是80来个,说明到后端的压力并不高。
?
3. 进一步确认apache线程数,发现apache_error.log已经出现Max Client的现象,链接数过多。
?
?
使用了两个CustomLog.
?
cronolog?项目使用比较普遍,目前是按周进行cookie访问日志处理,是一个io处理的点。logger系统自带的syslog的接口api。syslog可以支持本地打印和网络打印等。具体的内容可以man logger / ?man syslog6. 后来确认是syslog引起的问题。测试环境的redhat版本和线上的测试环境不一致,local1.info在syslog配置中是记录到了/var/log/message本地文件,说白了syslog多走了一次IO。
通过sar命令简单的分析了cronolog和syslog的io tps性能数据. cronlog:?cronlog10并发20并发50并发100并发 Blk_wrtn/s3720
?
507766219394cpu iowait1%1.2%1.4%2.2%request tps1310175125633241
syslog(本地文件 同步输出):syslog10并发20并发50并发100并发 Blk_wrtn/s1808
179018451760cpu iowait11.9%12.2%12.6%12.4%request tps58505148
syslog(本地文件 异步输出): http://stackoverflow.com/questions/208098/can-syslog-performance-be-improvedsyslog10并发20并发50并发100并发 Blk_wrtn/s1235
162441127712cpu iowait0.39%0.87%1%0.86%request tps5761163.208823675
syslog(网络传输):syslog10并发20并发50并发100并发 request tps1561210731533320
测试环境1. Linux 内核 2.6.18-131.el5.customxen 64位机器,是个虚拟机, 5G内存。2. apache 2.2.153. cronolog ?1.6.24. syslog ?1.4.1
总结:syslog基于本地磁盘的日志记录,在性能上存在比较严重的性能瓶颈,在测试时需要留意。syslog基于异步文件记录,性能上接近于网络传输的性能syslog基于网络数据日志记录的,单从request tps上看要略优于cronolog,但具体数据的发送的准确性就没有验证了
补充说明:apache关于日志的使用说明文档:http://httpd.apache.org/docs/2.2/logs.html
针对这cronolog 和 syslog日志记录的使用优化,可以参考http://httpd.apache.org/docs/2.2/logs.html#piped
?
针对syslog使用,网上是建议是使用syslog-ng,据说性能更好。目前公司的线上服务器也使用的是syslog-ng替换默认的syslogd进程。
1 楼 ZavaKid 2011-03-15 syslog和syslong-ng是如何进行测试的呀? 2 楼 agapple 2011-03-17 ZavaKid 写道syslog和syslong-ng是如何进行测试的呀?
没在机器上测试过syslog-ng的性能,其实测试下来也就syslog的同步输出性能比较差。
这样一分析对比,cronolog也应该是采用异步输出进行处理,不然性能不会这么好