本文主要是介绍线上环境机器cpu持续占用高排查步骤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前段时间遇到生产环境下机器cpu持续占用很高的问题,赶紧检查近期发布情况以及代码改动,看了后发现都是些平常改动,并不会引起这么大的“动静”。那么如何排查是怎么引起的呢?谷歌百度一下,发现解决步骤如下:
1. 登录线上机器,控制台输入top命令,查看各进程cpu使用情况,先定位是哪个进程出问题。比如此时发现PID为2633的Java进程占用CPU高达300%,出现故障。
2. 找到该进程后,下一步就是定位是哪个线程出问题。控制台输入:ps -mp 2633 -o THREAD,tid,time | sort -rn 命令,该命令可以显示当前进程的线程列表,并按照CPU占用高的线程排序。显示结果如下:
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
root 10.5 19 - - - - 3626 00:12:48
root 10.1 19 - - - - 3593 00:12:16
找到了耗时最高的线程3626,占用CPU时间有12分钟。
3. 将线程id,也就是tid转换为16进制格式,控制台输入: printf "%x\n" 3626,输出:e2a
4. 打印该线程的堆栈信息,控制台输入:jstack 2633 | grep e2a -A 30,注意该命令不仅需要线程id,还要用到前面的进程id,也就是pid=2633,tid=e2a。最后根据日志定位问题。
那么我遇到的这次线上cpu占用很高的问题是什么导致的呢,说出来可能大家不信,是正则表达式引起的,我们这个工程依赖运维那边的一个库,其中有一个方法是校验url地址,方法实现中有一个正则表达式编写的坑。随便搜搜,发现类似线上故障有很多。正则表达式威力很强大,如果用的不好,破坏力也是很强的。关于正则表达式引起cpu飙升的文章大家可以看看这篇:《藏在正则表达式里的陷阱,竟让CPU飙升到100%!》
参考资料:https://www.cnblogs.com/yanduanduan/p/7132207.html
这篇关于线上环境机器cpu持续占用高排查步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!