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飙升排查与解决 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • 【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