实战——Linux服务器CPU飙升原因排查

使用top + jstack

  • 使用命令行top,排查查是哪个进程占用cpu最高,获取到进程号,如:36032
  • 再通过命令查出该进程下哪个线程占用cpu最高,如得到线程pid:36044
top -Hp 高cpu占用率的进程号
  • 使用命令将36044转为十六位进制,得到:8ccc
printf %x 36044
  • 使用jstack命令dump文件
jstack 36032 > 1.txt
  • 最后使用命令,查询该线程异常的代码位置,分析上下文代码即可得出原因
# 找到文件中8ccc的位置,并显示后30行信息,即可找到具体代码位置
cat 1.txt | grep -A 30 8ccc

可能导致CPU占用率过高的场景与解决方案

正常情况:业务高峰
  • 优化、扩容
异常情况:
  • 无限循环
    • 尽量无循环
    • 让循环执行慢些,如sleep
  • 频繁GC
    • 降低GC频率
  • 频繁创建新对象
    • 合理使用单例
  • 序列化与反序列化
    • 选择合理的类库
  • 正则表达式
    • 减少字符串匹配期间执行的回溯
  • 频繁的线程上下文切换
    • 降低切换的频率(根据场景修改,一般复杂度较高)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当 docker 上的服务出现 CPU 飙升的情况时,可以按照以下步骤进行排查: 1. 查看容器的 CPU 使用情况 可以使用 `docker stats <container_name>` 命令查看容器的 CPU 使用情况,可以根据容器的 CPU 使用情况来判断是否是容器内部的问题导致的 CPU 飙升。 2. 查看容器内部的进程占用情况 进入容器内部,使用 `top` 命令查看进程占用情况,可以看到哪个进程占用了大量的 CPU 资源。如果是某个进程占用了大量的 CPU 资源,可以考虑优化这个进程的代码,或者增加资源限制。 3. 检查容器的资源限制 检查容器的资源限制,包括 CPU 和内存限制。如果容器没有设置 CPU 限制,可能会导致容器内部的进程占用了大量的 CPU 资源,导致 CPU 飙升。可以通过 `docker update --cpus <cpus>` 命令来设置容器的 CPU 限制。 4. 检查宿主机的资源使用情况 如果容器内部的 CPU 使用情况正常,可以考虑检查宿主机的资源使用情况。如果宿主机的 CPU 使用率已经很高,容器就有可能无法获取到足够的 CPU 资源,导致 CPU 飙升。可以使用 `top` 命令查看宿主机的 CPU 使用情况。 5. 检查容器的日志 如果以上方法都无法解决问题,可以考虑查看容器的日志,查找是否有异常信息。可以使用 `docker logs <container_name>` 命令查看容器的日志。 总之,排查 docker 上的服务 CPU 飙升问题需要综合考虑多种因素,包括容器内部进程占用情况、容器的资源限制、宿主机的资源使用情况和容器的日志等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿在京

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值