功能问题,单步调试通过日志比较容易定位。性能问题,比如在线服务器CPU100%,如何查找相关服务,如何定位问题代码,考验技术人员的技能。58到家架构部、运维部、58速递技术部联合进行了线上业务CPU问题排查实践。题目:一台服务器上部署了几个tomcat实例,也就是几个垂直拆分的Java站点服务,几个Java微服务,突然收到运维的CPU异常告警。问题:如何定位哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪个代码导致CPU过载?Step1.找到占用CPU最多的进程工具:top方法:执行top-c显示进程运行信息列表,输入P(大写p),进程按照CPU占用率排序图:如上图,最耗CPU进程的PID为10765第二步:找到最耗CPU的线程工具:top方法:top-Hp10765,显示某个进程的线程在运行信息列表中输入P(大写p),然后线程根据CPU使用率排序。图解:如上图所示,在进程10765中,最耗CPU的线程PID为10804。第三步:线程PID转16进制工具:printf方法:Printf"%x\n"10804图解:如上图所示,10804对应的十六进制值为0x2a34。当然,这一步你可以使用计算器。之所以转为十六进制,是因为在栈中,线程id是用十六进制表示的。第4步:检查堆栈以找出线程正在做什么。工具:pstack/jstack/grep方法:jstack10765|grep'0x2a34'-C5--color打印进程栈传递线程id和filter获取线程栈图标:如上图,找到线程名称“AsyncLogger-1”对应CPU消耗高的线程,以及该线程正在执行代码的栈。希望对经常在线排查CPU问题的同学有所帮助。如果你有更好的做法,欢迎分享。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文
