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

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

性能问题,例如线上服务器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\n” 10804

图示

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

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

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

工具:pstack/jstack/grep

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

  • 打印进程堆栈

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

图示

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

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

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

最新文章

  1. 设置button键隐藏文字text
  2. Docker Dockerfile详解
  3. S1:函数上下文
  4. python报错
  5. Objective-C:自定义Block函数
  6. java transient简介
  7. 通过js检测到iframe,使父窗口重定向到index -----------???----------------------
  8. Armitage初始化
  9. C 和 OC 字符串转换 NSString 和 char * 转换 const char* 与 char *
  10. Java中的流程控制(三)
  11. 读书笔记—CLR via C#同步构造28-29章节
  12. App热补丁动态修复技术介绍
  13. Skeleton Screen -- 骨架屏--应用
  14. Cisco 12系列 AP 初始化配置-2-初始化配置
  15. ConcurrentModificationException并发修改异常
  16. Python模块学习 - jinja2
  17. Orchard模块开发全接触4:深度改造前台
  18. JAVA中INSTANCEOF关键字的用法总结
  19. Mysql进阶-day2
  20. vue ui components

热门文章

  1. 杂项-电信:TL9000
  2. 杂项:MSP(管理服务提供商)
  3. 19.QT对话框(文件对话框,颜色对话框,字体框,自定义对话框)
  4. 如何安装windows系统
  5. ros中文术语表及消息类型表
  6. Spring《三》ref 引用其他bean
  7. Python 递归和二分查找
  8. 如何打开DOS控制台及常见DOS命令作用
  9. 作用域与this
  10. BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)