log4j同步机制导致的cpu飙升排查与解决

2023-11-03

问题

组内某业务的几个相关接口均超时,上阿里云查日志一看是Dubbo调用超时,查看网络情况未发现异常,直接上Provider的机器查看占用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# top
  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 7020 root      20   0 2538892 164144  11856 S  90.3  8.7  61:23.54 java
11022 root      20   0 2560528 241340  11920 S  0.3 12.8 311:23.23 java
26805 root      20   0   32612   4036   2472 S  0.3  0.2  24:50.95 AliYunDunUpdate
26838 root      10 -10  134120  14524   5924 S  0.3  0.8 343:05.22 AliYunDun
    1 root      20   0   43280   3300   2108 S  0.0  0.2   2:16.82 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:01.78 kthreadd
    3 root      20   0       0      0      0 S  0.0  0.0   1:30.68 ksoftirqd/0
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
    8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh                 
    9 root      20   0       0      0      0 S  0.0  0.0  65:15.85 rcu_sched             
   10 root      rt   0       0      0      0 S  0.0  0.0   2:14.65 watchdog/0             
   12 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs             
   13 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns                 
   14 root      20   0       0      0      0 S  0.0  0.0   0:00.00 khungtaskd             
   15 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 writeback             
   16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd

查询到7020这个进程有异常,在继续查看具体异常线程

1
2
3
# top -Hp 7020
 PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 23328 root      20   0 2538892 164144  11856 S  90.0  8.7   0:00.00 java

找到了当前异常进程下的异常线程后使用jstack查看详细情况

1
# jsack -l 6377 > error.log
1
2
# printf "%x\n" 23328
5b20

然后从jstack里查询该线程信息

1
2
# grep '18e9' error.log --color
"http-bio-6379-exec-200" #8869954 daemon prio=5 os_prio=0 tid=0x00007f74a81f6800 nid=0x5b20 waiting for monitor entry [0x00007f742457f000]

最后从jstack文件定位到堆栈信息

1
2
3
4
5
6
7
"http-bio-7020-exec-200" #8869954 daemon prio=5 os_prio=0 tid=0x00007f74a81f6800 nid=0x5b20 waiting for monitor entry [0x00007f742457f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at org.apache.log4j.Category.callAppenders(Category.java:204)
	- waiting to lock <0x00000000800371d0> (a org.apache.log4j.spi.RootLogger)
	at org.apache.log4j.Category.forcedLog(Category.java:391)
	at org.apache.log4j.Category.log(Category.java:856)
	at org.slf4j.impl.Log4jLoggerAdapter.info(Log4jLoggerAdapter.java:368)

结论

在log4j 1.x版本中,logger.info等日志记录方法是同步的,大量的日志导致线程阻塞在callAppenders()这个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public 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);
    }
}

临时解决办法先把日志打印级别调高至error,后续在考虑优化方案。

优化方案

  1. 升级log4j 1.x至log4j 2.x版本,同时修改相应配置

    1
    2
    3
    4
    5
    6
    
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.11.2</version>
    </dependency>
    
  2. 使用log4j 桥接类

    1
    
    log4j-1.2-api-2.6.2
    
  3. 如果是使用Spring Boot开发的话,就不会出现此问题,Spring Boot默认使用的时logback是不会有同步问题

参考:log4j平稳升级到log4j2

https://www.cnblogs.com/hujunzheng/p/9937097.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

log4j同步机制导致的cpu飙升排查与解决 的相关文章

随机推荐

  • 【C++】入门 --- 缺省参数&函数重载

    文章目录 一 缺省参数 1 基本概念 2 缺省参数的分类 全缺省参数 半缺省参数 缺省参数实用案例 二 函数重载 1 函数重载概念 1 参数类型不同 2 参数个数不同 3 参数类型顺序不同 三 C 支持函数重载的底层原理 函数名修饰 一 缺
  • 本地服务器与云服务器哪个好?

    本地服务器和云服务器是企业可以使用的两种不同的服务器设置 主要区别在于本地服务器托管 第三方提供商托管云服务器 那么 本地服务器和云服务器哪个更好呢 接下来 将带大家讨论本地服务器和云服务器的优缺点 并帮助您确定哪些设置适合我们的数据保护和
  • Vue中启动提示polyfill缺少-webpack v5版本导致

    安装 npm i node polyfill webpack plugin 因为我们的项目使用webpack v5 其中polyfill Node核心模块被删除 所以 我们安装它是为了在项目中访问这些模块 vue config js文件 c
  • 树莓派4b安装Ubuntu 18.04系统及图形桌面

    文章目录 1 准备工作 1 1 硬件 1 2 下载树莓派镜像 1 3 下载树莓派镜像工具 2 安装系统 2 1 SD卡格式化 2 2 安装系统 3 连接热点 4 启动树莓派 5 更改软件源 6 安装桌面 7 参考文献 8 树莓派开机后wif
  • 面向对象与面向过程

    文章目录 概述 半天的活动 将此思想用于指导开发编程 以下内容纯属个人理解 和胡说八道 如有雷同 绝对是抄袭 2023 05 01 22 14 概述 一种对理解面向对象毫无帮助的 对指导编程毫无意义的 绝对正确的废话是 面向对象就是万事万物
  • 计算机中数值的表示[原码,反码,补码]

    计算机里都是以补码的形式存储数据 电脑只能识别二进制的0和1 0 表示正 1表示负 一个数的最高位定义为符合号位 一个字节 8位 为例 原码 最高位符号位 0代表正数 1代表负数 非符号位为该数字绝对值的二进制 X 原 1 原 000000
  • CSRF漏洞的利用及修复

    文章目录 1 简介 2 攻击 2 1 GET型 2 1 1 寻找CSRF点 2 1 2 抓包 2 1 3 伪造 2 2 POST型 2 2 1 抓包 2 2 2 伪造 3 防范 1 简介 CSRF Cross Site Request Fo
  • HTTP简介,http是一个属于应用层的面向对象的协议

    引言 HTTP是一个属于应用层的面向对象的协议 由于其简捷 快速的方式 适用于分布式超媒体信息系统 它于1990年提出 经过几年的使用与发展 得到不断地完善和扩展 目前在WWW中使用的是HTTP 1 0的第六版 HTTP 1 1的规范化工作
  • 程序员的五种实用工具

    1 生成 RegEx RegexGPT 是编写 RegEx 模式的绝佳工具 它真的令人难以置信 试一试 你就知道了 它的工作原理是 给它一个示例文本 输入预期结果 你也可以稍微解释一下 这取决于你 然后选择要生成 RegEx 的语言 点击生
  • Vue3 PC端自适应

    安装依赖包 npm i lib flexible save npm install px2rem loader 引入 在main js中引入 import lib flexible flexible 修改flexible js文件 在项目下
  • C#学习之Dispose

    什么是资源 首先要提出 什么是资源 在CLR出来之后 Windows系统资源开始分为 非托管资源 和 托管资源 非托管资源是指 所有的Window内核对象 句柄 都是非托管资源 如对于Stream 数据库连接 GDI 的相关对象 还有Com
  • Ubuntu下安装goLand

    Ubuntu下安装GoLand 官网下载golang包 Other Versions GoLand 下载的是goland 2018 1 6 tar版本 更高的版本不容易激活 将程序解压至 usr local tar zxvf goland
  • 知识体系之APUE/内核编程

    目录 一 APUE 内核编程 1 基本概念与实现 1 1 进程3态 1 1 1 进程调度的方式 1 1 2 调度原则 1 1 3 调度算法 1 2 僵尸进程 孤儿进程 1 2 1 僵尸进程 1 2 2 孤儿进程 1 3 pread pwri
  • 前端-html-01

    1 前端开发 自学html css学习笔记 1 1 绝对路径 链接一张图的图片 img src 网页链接 本地连接 1 2 文本格式化 字体被 strong 加粗 strong 了 br 字体 em 倾斜 em br 我是
  • AI教程 如何在 Illustrator 中转换图稿?

    欢迎观看Illustrator教程 小编带大家学习 Illustrator 2022的基本工具和使用技巧 了解如何在 Illustrator 中应用旋转 反射和剪切转换图稿 在本文中我们将使用左侧的部件组装这枚火箭 并探索反射 剪切 旋转和
  • 使用python爬取豆瓣

    https www runoob com python python json html 我的理解就是告诉网站那边的人我是通过浏览器访问的 防止它分辨出我不是正常用户访问网站 这里要注意爬数据和调接口不是一回事 调接口我们是直接请求后端的数
  • [管理与领导-78]:IT基层管理者 - 核心技能 - 高效执行力 - 3 - 执行力的核心是拿到结果(ougput),而不是任务(input),也不是执行(过程、加工)

    前言 执行力的核心是结果 但并非所有人都理解 结果 对执行力的意义和作用 本文就是探讨对 结果 的理解 一 执行中常见的困惑 1 1 员工的困惑 接收任务 员工在执行工作过程中可能会遇到各种困惑 以下是一些可能的困惑情况 任务不清晰 员工可
  • 当 App 有了系统权限,真的可以为所欲为?

    看到群里发了两篇文章 出于好奇 想看看这些个 App 在利用系统漏洞获取系统权限之后 都干了什么事 于是就有了这篇文章 由于准备仓促 有些 Code 没有仔细看 感兴趣的同学可以自己去研究研究 多多讨论 深蓝洞察 2022 年度最 不可赦
  • GC 日志

    VM 参数 XX PrintGCDetails Xms30M Xmx30M Xmn10M 代码 import java lang management ManagementFactory import java lang managemen
  • log4j同步机制导致的cpu飙升排查与解决

    问题 组内某业务的几个相关接口均超时 上阿里云查日志一看是Dubbo调用超时 查看网络情况未发现异常 直接上Provider的机器查看占用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 to