【bugfix】记一次CPU飙高的排查经历

目录

1.定位进程

2.定位线程

3.线程虚拟机栈分析

4.解决方案

4.1 升级JDK

4.2 使用ConcurrentHashMap


1.定位进程

top拿到cpu占用最高进程的进程号pid=14398

2.定位线程

top -H -p pid 特定进程中的线程

top -H -p 14398

找到最高的线程id:29230、29156、29151、29197、29240、29284、29291

转换成hex十六进制722e、71e4、71df、720d、7238、7264、726b

3.线程虚拟机栈分析

jstack pid | grep threadId

jstack生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。pid是进程id,threadId是上个步骤拿到的线程id

jstack 14398 |grep 722e -A 20 --col

上图就是找到的14398进程的0x722e 线程的栈信息,前几名的线程栈几乎都差不多,都是HashMap的get操作。由于我们的服务运行在JDK1.6下,很自然的联想到HashMap线程不安全,在扩容时并发有可能形成链表回路,导致后续操作遍历链表时有死循环!具体请戳

由此几乎验尸完成,就是由于用了线程不安全的HashMap,并发扩容形成链表环路,导致get操作遍历链表时形成死循环,导致线程一直不能执行结束,一直在抢占CPU时间片,导致CPU资源的消耗过大。

4.解决方案

4.1 升级JDK

我们都知道HashMap在1.8fix了扩容时插入链表的顺序,不会造成回路了,所以可以通过升级JDK

4.2 使用ConcurrentHashMap

并发容器有锁控制,不会有多个线程并发修改链表,不会形成回路。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排查和解决TiDB中TiKV CPU使用率过高的问题时,可以按照以下步骤进行: 1. 查看TiKV的监控指标:首先,通过监控系统查看TiKV的CPU使用率和其他相关指标,如内存使用率、磁盘IO等。确定CPU使用率是否真的过高以及其他指标是否异常。 2. 检查TiKV配置:检查TiKV的配置文件,包括CPU相关的配置项,比如线程数、并发度等。确保配置项与硬件环境相匹配,且没有设置过高的值导致CPU占用过高。 3. 检查TiDB版本:确保使用的TiDB版本是最新的稳定版本,因为一些旧版本可能存在CPU占用的bug或性能问题。如果是旧版本,可以尝试升级到最新版本以修复问题。 4. 检查TiKV日志:查看TiKV的日志,特别是错误日志或警告信息,以了解是否有异常发生。错误日志可能提供有关CPU占用过高的更多线索。 5. 检查TiDB查询语句:排查是否有复杂或低效的查询语句导致TiKV的CPU占用过高。可以通过优化查询语句、增加索引或调整TiDB的配置来改善查询性能。 6. 调整TiKV参数:根据实际情况,可以尝试调整TiKV的一些参数,如region和raft的配置参数,以优化性能并减少CPU的使用率。 7. 分析性能剖面数据:如果以上步骤无法解决问题,可以使用TiDB提供的性能剖面功能,对TiKV进行深入分析。这将帮助您确定具体的热点和性能瓶颈,并采取相应的措施进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值