zoukankan      html  css  js  c++  java
  • 线上服务CPU100%问题快速定位实战--转

    来自微信公众号 架构师之路

    功能问题,通过日志,单步调试相对比较好定位。

    性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底。

    58到家架构部,运维部,58速运技术部联合进行了一次线上服务CPU问题排查实战演练,同学们反馈有收获,特将实战演练的试题和答案公布出来,希望对大家也有帮助。

    题目

    某服务器上部署了若干tomcat实例,即若干垂直切分的Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。

    问:如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载?

    步骤一、找到最耗CPU的进程

    工具:top

    方法

    • 执行top -c ,显示进程运行信息列表

    • 键入P (大写p),进程按照CPU使用率排序

    图示

    如上图,最耗CPU的进程PID为10765

    步骤二:找到最耗CPU的线程

    工具:top

    方法

    • top -Hp 10765 ,显示一个进程的线程运行信息列表

    • 键入P (大写p),线程按照CPU使用率排序

    图示

    如上图,进程10765内,最耗CPU的线程PID为10804

    步骤三:将线程PID转化为16进制

    工具:printf

    方法:printf “%x ” 10804

    图示

    如上图,10804对应的16进制是0x2a34,当然,这一步可以用计算器。

    之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。

    步骤四:查看堆栈,找到线程在干嘛

    工具:pstack/jstack/grep

    方法:jstack 10765 | grep ‘0x2a34’ -C5 --color

    • 打印进程堆栈

    • 通过线程id,过滤得到线程堆栈

    图示

    如上图,找到了耗CPU高的线程对应的线程名称“AsyncLogger-1”,以及看到了该线程正在执行代码的堆栈。

    希望对经常进行线上CPU问题排查的同学有帮助,如果有更好的实践,也欢迎分享。

    想要印象深刻,请大家务必线上实操练习哟。

  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/davidwang456/p/7406231.html
Copyright © 2011-2022 走看看