1. top指令
top //找出占用 CPU 最高的进程的 pid。
2. 查看耗CPU的线程号
方法1:
top -Hp 进程号。然后按下大写P。//在该进程中找到,哪些线程占用的 CPU 最高的线程,记录下 tid。
注意下图一个是主线程,其余是子线程。
方法2:
ps -ef | grep 程序名 | grep -v grep //获取具体的进程信息,第二行和top的进程名不一样?一个是主线程一个是进程??但是都代表同一个东西啊
ps -mp 上面ef的进程id即第二列 -o THREAD,tid,time | sort -rn //注:-m:显示所有线程;-p:pid进程使用CPU的时间;-o:该参数后是用户自定义格式
实际上下面我们已经看到那个线程占用的CPU高了。但是仍需要执行下面的内容,因为它可以打印相关堆栈的信息,从而精确定位到某个线程的对应的函数,这样就可以找到CPU占用高的代码了。
3. 重定向输出到文本
如果你是java,那么就使用java这种,否则下面一般就是C/C++了,二者选其一。它们都是查看程序相关堆栈的内容。
jstack -l > threads.txt //java方法。导出进程的线程栈信息到文本,导出出现异常的话,加上 -F 参数。
//或者
pstack 进程号 > threads.txt //C或者C++,由于我写这篇文章时,pstack这个命令没安装,不知道为啥没了,之前还能测试的,这里不管了,再次强调:不执行3,4步骤,无法查看具体的函数堆栈,第2步只能确定哪个线程,没啥用。
4.将 tid 转换为十六进制,在 threads.txt 中搜索,查到对应的线程代码执行栈,然后在自己代码中查找占 CPU 比较高的原因。
其中 tid 转十六进制,可以借助 Linux 的 printf ("%x",tid) 指令。或者百度在线进制转换。
我用上述方法查到过,是因为在某个线程不断while(1)。
下图是我之前自己查看CPU过高的图,定位到了具体函数的某一行。
到此结束,关于生产环境CPU过高的问题查找已经定位完毕,剩下来就是看你如何去解决你的代码了。