开篇

近期由于业务需要进行业务迁移,期间因为误设置log4j的日志级别,导致系统性能整体下降,具体表现在QPS下降明显,系统RT上升。迁移期间由于各类系统环境较原来有较大差别,因为在排查过程中也走了一些弯路,总结起来避免他人再次踩坑。

问题背景

问题的背景其实很简单,线上系统的log4j的日志级别由warn调整为info,导致大量的调用log4j的日志接口,导致系统的rt上升伴随着qps下降,具体的影响效果可以看下图。

需要额外解释的就是log4j的这个问题需要在qps较大的情况下才会复现,按照我遇到的情况基本上需要在2k/s以上会比较明显(数据不一定非常准确),只是为了说明需要在大量请求的情况才会触发synchronized的问题。

当然问题的本质在于大量调用log4j的日志接口,导致竞争synchronized影响性能,影响的时间应该也是在ms级别,这其实在另外一个方面说明了只求非常极致追求性能问题才会细致的去分析这些问题。

优化效果

优化后qps的提升效果图,这边是以分钟进行统计的。

优化后系统的响应时间效果图。

现象分析

整个分析过程其实并不是那么具有条理性,只是现在总结起来看上去像那么回事。

对比两套系统的差异点,发现系统的log4j的日志级别不一致,尝试修改日志级别观察效果。

发现日志级别调高后系统性能明显提升,开始怀疑log4j的问题并网上查阅资料。

jstack打印对应的日志,发现在不同日志级别情况下下面的BLOCKED的日志数量不一样。

发现竞争锁的日志waiting to lock <0x00007f3a04020830>。

观察jstack日志并找到log4j的源码发现代码当中有同步锁关键字synchronized。

#514 daemon prio=5 os_prio=0 tid=0x00007f369002f800 nid=0x561a waiting for monitor entry [0x00007f348fb96000]

java.lang.Thread.State: BLOCKED (on object monitor)

at org.apache.log4j.Category.callAppenders(Category.java:204)

- waiting to lock <0x00007f3a04020830> (a org.apache.log4j.spi.RootLogger)

at org.apache.log4j.Category.forcedLog(Category.java:391)

at org.apache.log4j.Category.log(Category.java:856)

#521 daemon prio=5 os_prio=0 tid=0x00007f367c042800 nid=0x5617 waiting for monitor entry [0x00007f348fe99000]

java.lang.Thread.State: BLOCKED (on object monitor)

at org.apache.log4j.Category.callAppenders(Category.java:204)

- waiting to lock <0x00007f3a04020830> (a org.apache.log4j.spi.RootLogger)

at org.apache.log4j.Category.forcedLog(Category.java:391)

at org.apache.log4j.Category.log(Category.java:856)

原因分析

直接定位log4j的源码位置,发现synchronized的关键字,基本上这时候其实是验证之前的猜想而已。

关于synchronized的性能问题,可以网上去参考java几种锁的性能对比,只记得一个简单的结论synchronized在大量竞争的情况下劣势比较明显各种同步方法性能比较(synchronized,ReentrantLock,Atomic)。

void callAppenders(LoggingEvent event) {

int writes = 0;

for(Category c = this; c != null; c=c.parent) {

// Protected against simultaneous call to addAppender, removeAppender,...

synchronized(c) {

if(c.aai != null) {

writes += c.aai.appendLoopOnAppenders(event);

}

if(!c.additive) {

break;

}

}

}

if(writes == 0) {

repository.emitNoAppenderWarning(this);

}

}

心得

老大曾说过,凡事做个有心人,会发现更多的东西。

java高并发日志_高并发下log4j的性能瓶颈相关推荐

  1. 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现

    在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...

  2. 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...

    不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...

  3. oracle rac 高并发性能_高并发业务下 JVM 涉及的垃圾回收与性能问题分析与定位...

    最近好多 Java 的朋友问:"高并发业务场景下,JVM涉及的性能问题好难搞呀--".看来是大家的技术经验相对少了些,拿不准该从哪些地方上手,其实,每个技术人要该懂得怎样更好打造自 ...

  4. mysql 高并发 响应时间_高并发,你真的了解吗?

    摘要:本文介绍高并发系统的度量指标,讲述高并发系统的设计思路,再梳理高并发的关键技术,最后结合作者的经验做一些延伸探讨. 当前,数字化在给企业带来业务创新,推动企业高速发展的同时,也给企业的IT软件系 ...

  5. mysql高并发秒杀_高并发秒杀解决方案(转载)

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

  6. java抢红包并发设计_高并发开发之-使用redis抢红包设计

    假设一个需求,在某个预告活动中准备了10w个红包,100w人在某个时间点去开抢,每人只能抢1次,如何保证性能和准确性,下面我给出我的一个设计方案,抛砖引玉分析瓶颈查询用户是否已参与过活动 获取一个可抢 ...

  7. 高并发解决方案_高并发提交订单的解决方案

    商城系统,根据不同的业务需求,归类出几种购买活动.比如:常规商品的购买,稀缺商品的秒杀活动,特价商品的限时优惠活动,加价换购活动,拼团活动,众筹活动,将要发行销售的预售活动.这里,针对预售活动场景,来 ...

  8. 【java】 java 高并发解决方案和高负载优化方法

    [java] java 高并发解决方案和高负载优化方法 参考文章: (1)[java] java 高并发解决方案和高负载优化方法 (2)https://www.cnblogs.com/lonelywo ...

  9. JAVA中的高并发,解决高并发的方案

    java高并发,如何解决,什么方式解决 一.什么是高并发 二.高并发的解决方法有两种 三.追加 一.什么是高并发 1.1 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑 ...

最新文章

  1. APP重复点击,出现多次同样的响应
  2. CodeForces - 1110E-Magic Stones(差分+思维)
  3. SharePoint At Work----Hyperlinks in the Data View Web Part
  4. 机器学习经典算法笔记——PCA和梯度上升算法
  5. 【转】const_cast
  6. VS2010下配置OpenCV2.2
  7. 数据挖掘:模型状态评估
  8. HDU3571 N-dimensional Sphere(高斯消元 同模方程)
  9. 指南|七步搞定研控E总线驱动器与欧姆龙PLC主站连接
  10. 数学模型:传染病模型
  11. 23000字,讲清信息流广告数据分析。
  12. Postgresql管理系列-第三章Query Processing(下半部分-join operation介绍)
  13. 台式计算机usb口不识别鼠标,如何解决插入鼠标提示无法识别USB设备的问题
  14. 微信公众号开发 微信被动回复,图文回复,图片回复
  15. 基于FPGA的火焰识别系统开发——简化版
  16. java输出数组(java输出数组)
  17. mysql定时执行任务
  18. NTC热敏电阻计算温度之C代码
  19. fstab 与移动硬盘挂载方法
  20. Oracle 出现 ORA-00942 表或视图不存在问题的解决方法

热门文章

  1. matlab fopen wt,matlab的fopen和fprintf
  2. java数组 js数组的长度_js中split()方法得到的数组长度问题
  3. 华中科技大学计算机专业培养计划,2021年华中科技大学计算机科学与技术专业本科人才培养方案.doc...
  4. 载波聚合或双连接的方式进行_首发天玑1000+!iQOO Z1来了:5G+5G双卡双待、双WiFi 6...
  5. hadoop合并日志_【hadoop】24.MapReduce-shuffle之合并
  6. python怎么创建变量_Python中通过函数对象创建全局变量
  7. 使用linux实验总结及心得,实验心得
  8. 2 如何设置窗口title_如何正确的知晓生僻字发音?无需字典查询,2步手机设置轻松搞定...
  9. python中capital是什么意思_capital是什么意思_capital的翻译_音标_读音_用法_例句_爱词霸在线词典...
  10. android 判断app处于前后台