压测结果发现,log4j升级成log4j2之后对系统性能影响并不大,更改打印日志方式(同步修改成异步打印)
压测结果发现tps在开始阶段提升较快,当压力上来之后,tps下降迅速,不如同步的数据(log4j2用的版本是2.3)
获取压测是堆栈日志如下:
发现线程都在跑locksupport.parknanos也就是unsafe.park(fal, 1);(private static f有理数减法inal 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。
具体代码变动如下:
没有推动社会发展的根本动力了unsafe.park(fal, 1); 被block的线程没有一直被调度
1、log4j1写日志多线程情况是阻塞的,log4j2不会阻塞,生产者只负责生产,通过无锁队列ringbuffer的无阻塞内存队列作为缓冲(即使用disruptor),多生产者多线程的竞争是通过cas实现,性能较高,至于最后落地,虽然两者都会调用synchronized方法写入日志,log4j2的asynclogger支持多个消费者,每个消费者取一批待处理的日志,类似于分段,用于提高性能
2、disruptor简介
log4j2之所以能在异步写日志时性能提高这么多,离不开优秀的mq组件disruptor。
disruptor的主要设计思想是无锁的高并发,在设计上采用内存屏障的机制和cas操作实现此思想。主流的并发程序
都离不开锁对资源的管控,或者尽量避开锁的使用。
1、有一个基于数组的循环数据结构(环装缓冲区)。这个循环数据结构,它是个拥有多个可用元素引用的数组。预先分配了对象内存空间。生产者与消费者通过这个循环数据结构进行读写操作,并不会有锁或资源竞争。
2、在disruptor中,采用消费者-生产者模型进行读写的分离,所有事件(events)以组播的方式被发布给所有消费者,以便下游队列通过并行的方式进行消费。因为消费者的并行消费,需要协调消费者间的依赖关系。
3、生产者和消费者中有个序列计数器,指示缓冲区中当前正在被它所处理的元素。所有生产者或消费者都只可以修改它自己的序列计数器,但同时可以读取其他的序列计数器,内存屏障加序列号的方式实现了无锁的并发机制。
以上为个人经验秦始皇统一货币,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 04:47:21,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/0fcd4dde450717621cad64fd0d6b0164.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:log4j2异步打印性能提升方式.doc
本文 PDF 下载地址:log4j2异步打印性能提升方式.pdf
留言与评论(共有 0 条评论) |