hiveserver2服务cpu使用异常高_一次线上服务高 CPU 占用优化实践

本文记录了一次线上服务CPU占用异常的排查过程,涉及HiveServer2、Log4j2的KafkaAppender优化,包括linger.ms和batch.size参数调整,以及异步Appender潜在问题和解决方案。通过火焰图分析,发现了log4j行号计算的代价,并利用Trie前缀树优化Spring的URL匹配性能。最终,CPU占用率从100%降至35%。
摘要由CSDN通过智能技术生成

0ffdb345b3a66d77b29e4727292c4c7d.png

线上有一个非常繁忙的服务的 JVM 进程 CPU 经常跑到 100% 以上,下面写了一下排查的过程。通过阅读这篇文章你会了解到下面这些知识。

  • Java 程序 CPU 占用高的排查思路
  • 可能造成线上服务大量异常的 log4j 假异步
  • Kafka 异步发送的优化
  • On-CPU 火焰图的原理和解读
  • 使用 Trie 前缀树来优化 Spring 的路径匹配

开始尝试

JVM CPU 占用高,第一反应是找出 CPU 占用最高的线程,看这个线程在执行什么,使用 top 命令可以查看进程中所有线程占用的 CPU 情况,命令如下所示。

top -Hp you_pid

输出如下:

PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
   48 root      20   0 30.367g 2.636g  12940 S  12.7  2.9  36:15.18 java
 2365 root      20   0 30.367g 2.636g  12940 R  1.3  2.9   2:33.64 java
 2380 root      20   0 30.367g 2.636g  12940 S  1.3  2.9   2:33.10 java
 2381 root      20   0 30.367g 2.636g  12940 S  1.3  2.9   2:33.41 java
10079 root      20   0 30.367g 2.636g  12940 S  1.3  2.9   0:30.73 java
   10 root      20   0 30.367g 2.636g  12940 S  1.0  2.9   4:08.54 java
   11 root      20   0 30.367g 2.636g  12940 S  1.0  2.9   4:08.55 java
   92 root      20   0 30.367g 2.636g  12940 S  1.0  2.9   2:53.71 java
  681 root      20   0 30.367g 2.636g  12940 S  1.0  2.9   2:52.56 java
  683 root      20   0 30.367g 2.636g  12940 S  1.0  2.9   2:56.81 java
  690 root      20   0 30.367g 2.636g  12940 S  1.0  2.9   3:34.24 java

可以看到占用 CPU 最高的线程 PID 为 48(0x30),使用 jstack 输出当前线程堆栈,然后 grep 一下 0x30,如下所示。

jstack 1 | grep -A 10 "0x30 "

输出结果如下。

"kafka-producer-network-thread | producer-1" #35 daemon prio=5 os_prio=0 tid=0x00007f9ac4fc7000 nid=0x30 runnable [0x00007f9ac9b88000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
        at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
        at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
        - locked <0x0000000094ef70c8> (a sun.nio.ch.Util$3)
        - locked <0x0000000094ef70e0> (a java.util.Collections$UnmodifiableSet)
        - locked <0x000000009642bbb8> (a sun.nio.ch.EPollSelectorImpl)
        at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
        at org.apache.kafka.common.network.Selector.select(Selector.java:686)

可以看到这是一个 kafka 的发送线程。我们的日志打印是使用 log4j2 的 kafka 插件将日志文件写入到 kafka,日志写入量非常大。接下来先来优化这个 kafka 发送线程的 CPU 占用。

Log4j2 下 KafkaAppender 优化

KafkaAppender

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HiveServer2是Apache Hive的一个组件,它提供了与Hive进行交互的方式,通常是通过ODBC、JDBC或Thrift接口。如果你的HiveServer2服务运行异常,可能有几种可能的原因和解决方法: 1. 检查HiveServer2服务是否已经启动。你可以通过以下命令来检查服务的状态: ``` systemctl status hive-server2 ``` 如果服务未运行,可以使用以下命令启动它: ``` systemctl start hive-server2 ``` 2. 检查HiveServer2的日志文件以获取更多信息。HiveServer2的日志文件通常位于`/var/log/hive`目录下。查看日志文件可以帮助你确定具体的错误原因。 3. 确保HiveServer2的配置文件正确。你可以检查HiveServer2的配置文件(通常是`hive-site.xml`),确保其中的配置项正确设置。特别是要确保与数据库连接相关的配置项(如数据库URL、用户名和密码)正确配置。 4. 检查与HiveServer2相关的依赖项是否正确安装。如果缺少必要的依赖项,HiveServer2可能无法正常启动。你可以查看HiveServer2的文档或官方网站上的要求,并确保满足所有依赖项。 5. 如果你使用了安全模式(例如Kerberos认证),确保相关的安全配置正确。安全模式可能涉及到更复杂的配置和设置,你可能需要参考HiveServer2的文档或官方网站上的安全配置指南。 如果以上方法仍然无法解决问题,可能存在其他配置或环境问题。更详细的错误信息和日志可能有助于进一步诊断问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值