背景
在一次项目的性能调优中,发现出现竞争瓶颈,导致在资源未使用满的情况下,TPS已经无法提升。祭起JMC(JAVA MISSON CONTROL)飞行记录器大法后,发现线程集中等待在logback写日志的地方,如下图所示:
由于项目组多线程写如同一个文件日志,导致存在IO竞争,一般解决这种问题有三种选择方式
:
- 异步日志,但是会存在断电或者日志队列溢出丢失的可能
- 远程日志,日志放入外部消息队列,保证持久化,但需额外部署日志存储队列
- 多线程日志,按线程(或线程取模)记录日志,减少竞争,日志也能保证持久化
项目组权衡再三,决定采用第三种分线程日志的方式解决。
误入SiftingAppender大坑
项目组使用logback作为日志组件,loback是否有自动分线程写日志的功能呢?网上搜索logack multiThread 的第一篇文章就是教你如何使用SiftingAppender来分线程记录日志如下:
https://dzone.com/articles/si...
Sifti