目前公司中使用到了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的现象,链接数过多。
[Sat Mar 12 17:44:31 2011] [error] server reached MaxClients setting, consider raising the MaxClients setting
4. 查了下系统的性能参数(nnd,机器上居然没装sysstat包,sar,iostat命令都用不了),使用vmstat -n 1看了下。 发现cpu 的iowait参数居然达到了60%,基本猜想估计是apache日志记录出了问题
5. 检查apache conf文件,使用的log配置。
CustomLog "|/usr/alibaba/cronolog/sbin/cronolog /home/ljh/output/logs/cookie_logs/%w/cookie_log" cookie_log
CustomLog "|/usr/bin/logger -p local1.info" cookie_log
使用了两个CustomLog.
-
cronolog 项目使用比较普遍,目前是按周进行cookie访问日志处理,是一个io处理的点。
- logger系统自带的syslog的接口api。syslog可以支持本地打印和网络打印等。具体的内容可以man logger / man syslog
6. 后来确认是syslog引起的问题。
测试环境的redhat版本和线上的测试环境不一致,local1.info在syslog配置中是记录到了/var/log/message本地文件,说白了syslog多走了一次IO。
通过sar命令简单的分析了cronolog和syslog的io tps性能数据.
cronlog:
cronlog |
10并发 |
20并发 |
50并发 |
100并发 |
Blk_wrtn/s |
3720
|
5077 |
6621 |
9394 |
cpu iowait |
1% |
1.2% |
1.4% |
2.2% |
request tps |
1310 |
1751 |
2563 |
3241 |
syslog(本地文件 同步输出):
syslog |
10并发 |
20并发 |
50并发 |
100并发 |
Blk_wrtn/s |
1808
|
1790 |
1845 |
1760 |
cpu iowait |
11.9% |
12.2% |
12.6% |
12.4% |
request tps |
58 |
50 |
51 |
48 |
syslog |
10并发 |
20并发 |
50并发 |
100并发 |
Blk_wrtn/s |
1235
|
1624 |
4112 |
7712 |
cpu iowait |
0.39% |
0.87% |
1% |
0.86% |
request tps |
576 |
1163. |
20882 |
3675 |
syslog(网络传输):
syslog |
10并发 |
20并发 |
50并发 |
100并发 |
request tps |
1561 |
2107 |
3153 |
3320 |
测试环境
1. Linux 内核 2.6.18-131.el5.customxen 64位机器,是个虚拟机, 5G内存。
2. apache 2.2.15
3. cronolog 1.6.2
4. 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进程。
分享到:
相关推荐
"dumpio2curl"是一个非常实用的工具,专门用于解析Apache 2.4的dumpio日志,并将其转换为可执行的curl命令。这对于测试、调试或者理解HTTP请求和响应的细节具有很大的价值。 Apache 2.4的dumpio日志模式是Apache...
WriterAppender是Log4j的一个组件,它允许我们将日志信息写入到任何实现了java.io.Writer接口的对象,如System.out、文件、数据库等。在项目中,我们使用UTF-8编码,这是国际化的标准,确保日志中的非ASCII字符能够...
总结来说,log4j-parser是一个强大的工具,它可以帮助开发者和运维人员高效地管理和分析Apache Log4j生成的日志数据,从而提升问题诊断、性能优化和运维自动化的能力。通过深入理解和应用这个解析器,我们可以更好地...
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.File=${WORKDIR}/logs/app.log log4j.appender.logfile.DatePattern='.'yyyy-MM-dd log4j.appender.logfile.layout=org....
Apache Commons是Apache项目的一部分,它提供了许多Java编程中的实用工具类,如IO、Lang、Collections等模块。这些库简化了常见的编程任务,提高了代码的可读性和可维护性。例如,Commons IO库可以帮助处理文件和流...
1. **清晰格式化展示**:ErrorLog能够将原始的日志条目格式化为易于阅读的形式,方便开发者迅速定位问题。 2. **多行条目合并**:对于多行的日志条目,ErrorLog能够自动合并,同时保留原始的空格格式,确保日志信息...
Log4j作为Apache组织下的一个开源项目,是一个非常强大的日志组件,能够为应用程序提供方便且灵活的日志记录服务。在软件开发过程中,良好的日志记录机制对于系统的调试、监控以及问题追踪等都具有重要意义。 #### ...
Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...
mod_logio mod_log_config mod_log_forensic mod_mem_cache mod_mime mod_mime_magic mod_negotiation mod_nw_ssl mod_proxy mod_proxy_ajp mod_proxy_balancer mod_proxy_connect mod_proxy_ftp mod_proxy_http mod...
11. **Apache Log4j**:这是一个流行的日志记录框架,提供了灵活的日志配置和多种输出格式,帮助开发者跟踪和调试应用。 12. **Apache Hadoop**:针对大数据处理的分布式计算框架,包括HDFS(分布式文件系统)和...
为了提高性能,Log4j 提供了异步日志记录器(AsyncAppender)和缓存日志事件(BufferedIO)。此外,合理地设置日志级别和 Appender 可以避免不必要的日志处理,降低系统负载。 ### 9. 日志滚动与归档 如配置中的 ...
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # 文件输出 log4j.appender.FILE=org.apache.log4j....
- `org.apache.log4j.WriterAppender`:将日志输出到任何实现了`java.io.Writer`接口的对象。 4. **常用的布局(Layout)**:Log4j同样提供了多种布局方式,以定制日志的输出格式: - `org.apache.log4j.HTMLLayout...
在 Apache Commons 项目中,每个特定的功能或模块都有一个单独的子项目,如 Commons Lang、Commons IO、Commons Collections 等。这些子项目分别关注不同的编程任务,例如字符串处理、I/O 操作、集合操作等。 标题...
6. **日志管理**: Apache可以记录详细的访问日志,这对于分析网站流量、监控异常访问和调试问题非常有用。默认的日志文件通常为`access_log`和`error_log`。 7. **虚拟主机**: Apache支持在同一台服务器上托管多个...
标题 "Hadoop-NativeIO.java" 指涉的核心知识点是 Hadoop 在本地环境下的调试,特别是涉及到 org.apache.hadoop.io.nativeio.NativeIO$Windows.access0 方法的问题。在Hadoop框架中,NativeIO 是一个用于执行低级...
Log4j是Apache的一个开源项目,它为应用程序提供了灵活的日志记录功能,包括输出格式、日志级别管理以及日志文件的滚动策略等。在某些场景下,为了节省存储空间和提高管理效率,我们会选择将日志文件进行压缩。 **...
log4net是一款由Apache软件基金会开发的开源日志框架,广泛应用于.NET平台。它的设计理念是提供一种灵活、可配置的日志解决方案,使得开发者可以方便地控制日志输出的级别、格式和目的地。log4net支持多种输出方式,...
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n # 定义滚动文件输出的Appender log4j.appender.R=org.apache.log4j....