显示标签为“Logging”的博文。显示所有博文
显示标签为“Logging”的博文。显示所有博文

2008年10月8日星期三

性能敏感的环境下用日志要小心

昨天用Profiler跑CPU负载时发现某个函数占用的CPU特别的多……但是函数本身没有什么特别之处,只是调用十分频繁(但是不止这一个函数调用频繁),最后吧焦点锁定到了日志记录上(好像经常跟上面栽跟头啊)
本来是用String.format格式化了一个字符串,然后再传到logger里面的,但是这个logger已经被关掉了。所以问题出在String.format上,屏蔽掉这个东西以后果然CPU占用立刻减少。
但是日志怎么办呢,Log4j的logger提供了isXXXEnabled方法,外面加个if就搞定了

2008年7月22日星期二

多线程环境下的性能杀手:日志记录

今天晚上做了一个性能测试,发现在同等条件下,使用日志的处理速度比关闭所有日志慢了接近10被。
我的应用是一个基于Mian的多线程服务器程序,在打开日志时进行压力测试,发现Profiler的Thread图表基本上是万里河山一片红:
根据图例,红色代表线程正在等待某个监视器。但是我的事务代码基本上没有什么使用同步的东西啊……数据库连接也用ThreadLocal了,不应该出现这种情况啊。
经过检查,发现拖慢处理速度的就是平时经常使用的日志。因为Logger的方法都是同步的(或者从根本上说,System.out和System.err就是一个同步的输出流)所以造成线程在处理时不得不停下来等待其他线程完成日志输出。就算不用Logger,用System.out.println()也是一样的道理。
编辑日志属性,关闭所有日志以后,性能有了极大的提高,每秒能处理的请求数量提升了13倍左右。