一台机器,CPU100%,如何找到相关服务,如何定位问题代码,今天简单分享下思路。

简要步骤如下:

  1. 找到最耗CPU的进程;
  2. 找到最耗CPU的线程;
  3. 查看堆栈,定位线程在干嘛,定位对应代码;

步骤一、找到最耗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进制表示的。

jave 查看方式

接着,查看堆栈,找到线程在干嘛。 工具:jstack 方法:jstack 10765 | grep '0x2a34' -C5 --color 打印进程堆栈 通过线程id,过滤得到线程堆栈 图示:


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

go的查看方式

目前pstack对于go进程根本不管用 目前我了解的唯一办法就是给进程发送SIGQUIT信号:

kill -SIGQUIT <pid>

go进程在收到SIGQUIT信号后,会往标准错误(stderr)打印出所有goroutine的stack信息。

但是遗憾的是,此时go进程也就退出了。

package mainimport ( "runtime/debug" "time")func main() { go a() m1()}func m1() { m2()}func m2() { m3()}func m3() { debug.PrintStack() time.Sleep(time.Hour)}func a() { time.Sleep(time.Hour)}

打印出所有goroutine的 stacktrace

可以通过pprof.Lookup("goroutine").WriteTo将所有的goroutine的stack trace都打印出来,如下面的程序:

package mainimport ( "os" "runtime/pprof" "time")func main() { go a() m1()}func m1() { m2()}func m2() { m3()}func m3() { pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) time.Sleep(time.Hour)}func a() { time.Sleep(time.Hour)}

较完美的输出 stacktrace

你可以使用runtime.Stack得到所有的goroutine的stack trace信息,事实上前面debug.PrintStack()也是通过这个方法获得的。

为了更方便的随时的得到应用所有的goroutine的stack trace信息,我们可以监听SIGUSER1信号,当收到这个信号的时候就将stack trace打印出来。发送信号也很简单,通过kill -SIGUSER1 就可以,不必担心kill会将程序杀死,它只是发了一个信号而已。

package mainimport ( "fmt" "os" "os/signal" "runtime" "syscall" "time")func main() { setupSigusr1Trap() go a() m1()}func m1() { m2()}func m2() { m3()}func m3() { time.Sleep(time.Hour)}func a() { time.Sleep(time.Hour)}func setupSigusr1Trap() { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGUSR1) go func() {  for range c {   DumpStacks()  } }()}func DumpStacks() { buf := make([]byte, 16384) buf = buf[:runtime.Stack(buf, true)] fmt.Printf("=== BEGIN goroutine stack dump ===\n%s\n=== END goroutine stack dump ===", buf)}
  === BEGIN goroutine stack dump ===goroutine 36 [running]:main.DumpStacks() /Users/yuepan/go/src/github.com/smallnest/dump/d3.go:47 +0x77main.setupSigusr1Trap.func1(0xc420070060) /Users/yuepan/go/src/github.com/smallnest/dump/d3.go:40 +0x73created by main.setupSigusr1Trap /Users/yuepan/go/src/github.com/smallnest/dump/d3.go:42 +0xecgoroutine 1 [sleep]:time.Sleep(0x34630b8a000) /usr/local/Cellar/go/1.7.4/libexec/src/runtime/time.go:59 +0xe1main.m3() /Users/yuepan/go/src/github.com/smallnest/dump/d3.go:28 +0x30main.m2() /Users/yuepan/go/src/github.com/smallnest/dump/d3.go:24 +0x14main.m1() /Users/yuepan/go/src/github.com/smallnest/dump/d3.go:20 +0x14main.main() /Users/yuepan/go/src/github.com/smallnest/dump/d3.go:16 +0x3fgoroutine 34 [syscall]:os/signal.signal_recv(0xff280) /usr/local/Cellar/go/1.7.4/libexec/src/runtime/sigqueue.go:116 +0x157os/signal.loop() /usr/local/Cellar/go/1.7.4/libexec/src/os/signal/signal_unix.go:22 +0x22created by os/signal.init.1 /usr/local/Cellar/go/1.7.4/libexec/src/os/signal/signal_unix.go:28 +0x41goroutine 35 [select, locked to thread]:runtime.gopark(0xb5cc8, 0x0, 0xab3ef, 0x6, 0x18, 0x2) /usr/local/Cellar/go/1.7.4/libexec/src/runtime/proc.go:259 +0x13aruntime.selectgoImpl(0xc42008d730, 0x0, 0x18) /usr/local/Cellar/go/1.7.4/libexec/src/runtime/select.go:423 +0x11d9runtime.selectgo(0xc42008d730) /usr/local/Cellar/go/1.7.4/libexec/src/runtime/select.go:238 +0x1cruntime.ensureSigM.func1() /usr/local/Cellar/go/1.7.4/libexec/src/runtime/signal1_unix.go:304 +0x2d1runtime.goexit() /usr/local/Cellar/go/1.7.4/libexec/src/runtime/asm_amd64.s:2086 +0x1goroutine 37 [sleep]:time.Sleep(0x34630b8a000) /usr/local/Cellar/go/1.7.4/libexec/src/runtime/time.go:59 +0xe1main.a() /Users/yuepan/go/src/github.com/smallnest/dump/d3.go:32 +0x30created by main.main /Users/yuepan/go/src/github.com/smallnest/dump/d3.go:15 +0x3a=== END goroutine stack dump ===

本文由 mdnice 多平台发布

如何排查CPU 100%的应用相关推荐

  1. 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://h5ip.cn/uWWR 处理过线上问题的同学 ...

  2. 【系统缓慢、CPU 100%、频繁Full GC问题】的定位排查思路!

    作者:爱宝贝 https://my.oschina.net/zhangxufeng/blog/3017521 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次 ...

  3. gc的原因 频繁full_系统缓慢+CPU 100%+频繁Full GC问题的定位排查思路!

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题. 当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警. 本文主要针对系统运行缓 ...

  4. java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...

  5. CPU 100%排查及常见案例

    CPU 100%排查及常见案例 这篇文章主要分享一般线上项目遇到CPU%时排查的方式,并提供了几个典型案例来帮助大家熟悉排查过程,我会先以 "死循环" 为例子来为大家演示一遍整体的 ...

  6. 如何排查CPU占用100%

    线上后台报警CPU占用100%,CPU占用过高,本文介绍一下如何排查CPU占用过高原因. 步骤1. top 输入top命令,找到占用CPU最高的进程.按Shift+P键排序: 可以看到CPU占用最高的 ...

  7. 一文学会Java死锁和CPU 100% 问题的排查技巧

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说 ...

  8. java线程死锁 cpu 100%_Java死锁排查和Java CPU 100% 排查的步骤整理

    工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多:第二个是java cpu 100%排查,这个 ...

  9. Java死锁和Java进程Java CPU 100%排查

    三板斧:top -> top -Hp ->jstack 通过 top 命令找到 CPU 消耗最多的进程号: 通过 top -Hp 进程号 命令找到 CPU 消耗最多的线程号(列名仍然为 P ...

最新文章

  1. ETSI GS MEC 015,MEP 带宽管理 API
  2. EMNLP2018论文解读 | 三种提升多语言翻译模型的高效策略
  3. C++使用数组的链表实现(附完整源码)
  4. myBatis如何返回count(*)得到的int值
  5. TOMCAT常用优化
  6. html一个页面同时加载多个饼图,Html5饼图绘制实现统计图的方法
  7. 【转】mysql锁表解决方法
  8. python寻找完全平方数_少儿编程|Python小课堂 – 寻找aabb完全平方数
  9. java 两个数据合并_R:两个数据帧合并
  10. Eclipse字体调整
  11. GJB 8114-2013中不恰当的编码规则解析
  12. Gululu互动水杯进驻英国皇家玩具品牌Hamleys 践行全球布局战略
  13. 图片分享和加载失败的原因之一
  14. mps是什么意思 计算机网络,网络连接的半双工和全双工是啥意思 100MPS和10MPS又有啥区别...
  15. 远程服务器镜像,NAS服务器的远程镜像技术.pdf
  16. 文字不换行、显示省略号
  17. 记录ssl证书过期,更新证书的过程
  18. 华为mate50pro和小米12ultea对比
  19. 51nod题解 1006 最长公共子序列LCS
  20. 【下载Tomcat旧版本】

热门文章

  1. 【Bioinfo Blog 012】【R Code 010】——生存分析(Kaplan-Meier Cox)
  2. 可以作为艺术作品欣赏的CT三维重建技术。
  3. 对勾和叉怎么打_word文档中输入对号“√ ”和 叉号“×”的方法 word怎么打钩/打叉/半对半勾符号...
  4. 什么是Mixin?带你了解Vue中的Mixin混入
  5. Verticle in Vert.x
  6. 重定位——重定位的简介与操作(涉及位置无关码)
  7. 编程之美 1.2 中国象棋将帅问题
  8. java后端概述_项目概述
  9. 【FXCG】美元指数对人民币汇率的影响
  10. 最小化函数minimize