如何排查CPU 100%的应用
一台机器,CPU100%,如何找到相关服务,如何定位问题代码,今天简单分享下思路。
简要步骤如下:
找到最耗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进制表示的。
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%的应用相关推荐
- 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://h5ip.cn/uWWR 处理过线上问题的同学 ...
- 【系统缓慢、CPU 100%、频繁Full GC问题】的定位排查思路!
作者:爱宝贝 https://my.oschina.net/zhangxufeng/blog/3017521 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次 ...
- gc的原因 频繁full_系统缓慢+CPU 100%+频繁Full GC问题的定位排查思路!
处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题. 当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警. 本文主要针对系统运行缓 ...
- java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...
- CPU 100%排查及常见案例
CPU 100%排查及常见案例 这篇文章主要分享一般线上项目遇到CPU%时排查的方式,并提供了几个典型案例来帮助大家熟悉排查过程,我会先以 "死循环" 为例子来为大家演示一遍整体的 ...
- 如何排查CPU占用100%
线上后台报警CPU占用100%,CPU占用过高,本文介绍一下如何排查CPU占用过高原因. 步骤1. top 输入top命令,找到占用CPU最高的进程.按Shift+P键排序: 可以看到CPU占用最高的 ...
- 一文学会Java死锁和CPU 100% 问题的排查技巧
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说 ...
- java线程死锁 cpu 100%_Java死锁排查和Java CPU 100% 排查的步骤整理
工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多:第二个是java cpu 100%排查,这个 ...
- Java死锁和Java进程Java CPU 100%排查
三板斧:top -> top -Hp ->jstack 通过 top 命令找到 CPU 消耗最多的进程号: 通过 top -Hp 进程号 命令找到 CPU 消耗最多的线程号(列名仍然为 P ...
最新文章
- ETSI GS MEC 015,MEP 带宽管理 API
- EMNLP2018论文解读 | 三种提升多语言翻译模型的高效策略
- C++使用数组的链表实现(附完整源码)
- myBatis如何返回count(*)得到的int值
- TOMCAT常用优化
- html一个页面同时加载多个饼图,Html5饼图绘制实现统计图的方法
- 【转】mysql锁表解决方法
- python寻找完全平方数_少儿编程|Python小课堂 – 寻找aabb完全平方数
- java 两个数据合并_R:两个数据帧合并
- Eclipse字体调整
- GJB 8114-2013中不恰当的编码规则解析
- Gululu互动水杯进驻英国皇家玩具品牌Hamleys 践行全球布局战略
- 图片分享和加载失败的原因之一
- mps是什么意思 计算机网络,网络连接的半双工和全双工是啥意思 100MPS和10MPS又有啥区别...
- 远程服务器镜像,NAS服务器的远程镜像技术.pdf
- 文字不换行、显示省略号
- 记录ssl证书过期,更新证书的过程
- 华为mate50pro和小米12ultea对比
- 51nod题解 1006 最长公共子序列LCS
- 【下载Tomcat旧版本】
热门文章
- 【Bioinfo Blog 012】【R Code 010】——生存分析(Kaplan-Meier Cox)
- 可以作为艺术作品欣赏的CT三维重建技术。
- 对勾和叉怎么打_word文档中输入对号“√ ”和 叉号“×”的方法 word怎么打钩/打叉/半对半勾符号...
- 什么是Mixin?带你了解Vue中的Mixin混入
- Verticle in Vert.x
- 重定位——重定位的简介与操作(涉及位置无关码)
- 编程之美 1.2 中国象棋将帅问题
- java后端概述_项目概述
- 【FXCG】美元指数对人民币汇率的影响
- 最小化函数minimize