前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CRUDBoy成长计划(7)— 记一次CPU 100%案例

CRUDBoy成长计划(7)— 记一次CPU 100%案例

作者头像
鹿老师的Java笔记
发布2022-01-20 13:23:47
2830
发布2022-01-20 13:23:47
举报

CRUDBoy成长计划(7)— 记一次CPU 100%案例

注意:

  1. 本次计划针对有一定工作经验,想要提升技术和工作能力的程序员。
  2. 关于本计划的详情见:CRUD Boy 成长计划
  3. 宗旨 首先不做理论知识普及,这样的东西太多了,其次,不做自我感动的事情,看上去学了很久,实际上工作用不到,面试问不到。 最后功利的一点说就是为了提高薪资。为了能够在工作中有更好的表现,将代码写的更好,更易用,更好维护,更优雅。也为了,在下一次面试的时候,能够从一群八股文科举选手中脱颖而出。 归根结底,技术岗位最重要的还是解决问题的能力,而不是背书的能力。 由于每个人的经验都是不可复制的,因此,我们需要互相学习互相探索出一条程序员自我成长的路线。整体方向围绕两个核心 职业素养 和 技术能力开展。既为了现在能够把代码写好,把需求做好,也为了日后能够把牛逼吹好,把薪资谈好。

参考资料

解决CPU100%属于是比较有套路的事情,基本解决思路/方案为:

  1. top 命令找出有问题 Java 进程及线程 id:
    1. 开启线程显示模式
    2. 按 CPU 使用率排序
    3. 记下 Java 进程 id 及其 CPU 高的线程 id
  2. 用进程 id 作为参数,jstack 有问题的 Java 进程
  3. 手动转换线程 id 成十六进制(可以用 printf %x 1234)
  4. 查找十六进制的线程 id(可以用 grep)
  5. 查看对应的线程栈

具体内容见参考资料:

  1. CRUDBoy成长计划(6)— CPU100%优秀笔记汇总 文章内包含详细解决步骤,命令以及案例。
  2. Arthas 用户文档 Arthas是一个比较好的调试工具,相对于传统方法来说,命令更少,信息更全,功能更强。

除此之外,系统的进行问题排查也需要项目本身构建完整的监控体系。

案例

背景

有一次早上发现测试服务被容器kill了,查看日志发现是每天都会被容器 kill -9两次。

于是通过 Grafana skywalking等工具查询,相关数据如下:

通过以上图示可以得到结论如下:

  • Young gc非常多
  • 容器内存只有 1.5G
  • 通过Jvm启动参数可以看到JVM的内存占用情况 最大堆内存为1G
  • 容器内存 = JVM(堆内存+堆外内存) + 容器内其他进程内存
  • 被kill的原因是容器内存不足,由于JVM最大堆内存不超过1024,所以可以认为被kill的时候,JVM堆外内存 + 容器内其他进程内存 > 512MB

由于grafana缺少JVM监控,无法判断是堆外内存爆了,还是容器内其他进程的原因。

解决方案:

  • 提升容器内存到2G,提升容错,执行后未再出现kill -9问题
  • grafana增加JVM监控,分析JVM堆外内存使用情况

扩容之后就剩下另一个问题,服务的young gc次数非常的多,并且通过对服务器信息的查看,发现CPU占用非常高,接近100%

排查问题过程

由于采用的是 Arthas 且对项目比较熟悉,所以排查过程非常简单。如下。

  1. 通过dashboard命令用于整体展示进程所有线程、内存、GC等情况
  1. 进一步查看堆栈情况

堆栈中提到的这个包,我个人比较熟悉,是运维添加的一个插件,之前引起过dubbo序列化失败的问题,所以联系运维先去除了插件。

总结

问题排查实际上是比较综合的一件事情,除了合理的方法以外,还需要经验。但是很多东西都是教程模板式的操作,在没有很多经验的时候掌握一些套路也是非常有帮助的,最起码在遇到问题的时候知道一个大致的方向。

最后的建议:关于任何线上的问题,不要着急下结论,不能经验之谈,也不能太着急锁定问题范围,尽可能看到更多指标才能更好的发现问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鹿小洋的Java笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CRUDBoy成长计划(7)— 记一次CPU 100%案例
    • 参考资料
      • 案例
        • 背景
        • 排查问题过程
      • 总结
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档