一次logback多线程调优的经历

在项目性能调优中,发现线程竞争集中在logback写日志处。通过分析,发现SiftingAppender的doAppender方法同步导致性能下降。为解决此问题,自定义了无需同步的ParrelSiftingAppender,使用UnsynchronizedAppenderBase,性能提升约5倍。接着将SiftingAppender内部的LinkedHashMap替换为ConcurrentHashMap,进一步消除同步竞争,性能再提升一倍,总共提高了10倍。
摘要由CSDN通过智能技术生成

背景

  在一次项目的性能调优中,发现出现竞争瓶颈,导致在资源未使用满的情况下,TPS已经无法提升。祭起JMC(JAVA MISSON CONTROL)飞行记录器大法后,发现线程集中等待在logback写日志的地方,如下图所示:
图片描述

  由于项目组多线程写如同一个文件日志,导致存在IO竞争,一般解决这种问题有三种选择方式

  • 异步日志,但是会存在断电或者日志队列溢出丢失的可能
  • 远程日志,日志放入外部消息队列,保证持久化,但需额外部署日志存储队列
  • 多线程日志,按线程(或线程取模)记录日志,减少竞争,日志也能保证持久化

  项目组权衡再三,决定采用第三种分线程日志的方式解决。

误入SiftingAppender大坑

  项目组使用logback作为日志组件,loback是否有自动分线程写日志的功能呢?网上搜索logack multiThread 的第一篇文章就是教你如何使用SiftingAppender来分线程记录日志如下:
https://dzone.com/articles/si...
  Sifti

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值