log4j2异步打印性能提升

压测结果发现,log4j升级成log4j2之后对系统性能影响并不大,更改打印日志方式(同步修改成异步打印)
log4j2异步打印性能提升_第1张图片
压测结果发现TPS在开始阶段提升较快,当压力上来之后,TPS下降迅速,不如同步的数据(log4j2用的版本是2.3)

分析原因:
获取压测是堆栈日志如下:
这里写图片描述

log4j2异步打印性能提升_第2张图片
发现线程都在跑LockSupport.parkNanos也就是unsafe.park(false, 1);(private static final Unsafe unsafe = Unsafe.getUnsafe();)这行代码。
具体功能是:调用 park后,线程将一直阻塞直到超时或者中断等条件出现。unpark可以终止一个挂起的线程,使其恢复正常。
经过分析压测,发现当并发量打的时候该方法造成了大量的线程切换,也就是说明消费速度跟不上生产速度。线程被频繁的休眠/唤醒导致 cpu使用率高,且性能较低。

解决方案:
上边原因分析到了,查询下解决方案,发现了log4j的bug,已经在2.7版本修复,所以替换log4j2的版本为2.7(JDK版本需要1.7以上,否则回报(unsupported major.minor version 51.0))
个人推荐JDK版本使用1.8。

具体代码变动如下:
log4j2异步打印性能提升_第3张图片

没有了unsafe.park(false, 1); 被block的线程没有一直被调度

你可能感兴趣的:(压测遇到问题整理)