当前位置: 首页 > Linux

教你一招!Linux下进程CPU占用率高问题排查

时间:2023-04-06 23:35:39 Linux

大家好!我是肖恩!程序占用CPU过多的问题相信很多C++程序员都遇到过。如果熟悉代码运行逻辑,不难估计定位到这个问题。开发库导致的CPU占用率高,所以不太好定位。今天我就分享一下我在工作中是如何做到的!?如何判断程序的cpu占用率?这个很简单,一条命令搞定,top-pprocesspid,就这样:这样你就可以持续观察你程序的cpu使用情况。如果它仍然很高,则可能有问题。??从图中可以看出%CPU为98.0,已经非常非常高了。如何查看线程级别的CPU使用率?方法一:命令:psH-eouser,pid,ppid,tid,time,%cpu,cmd--sort=%cpu|grep进程号比较长,不难记。这里我们可以看到用户、进程号、父进程号、线程号、cpu总使用时间、cpu使用率、程序名。按照cpu的值升序排列,排在最后的就是CPU占用率最高的线程,这样就可以找到对应的线程号了。图中第四列是线程数,第五列是CPU使用时间,第六列是CPU使用率。可以看到54313个线程占用了最高的CPU。方法二:命令:top-H-p进程号-H:Threads-modeoperation-p:Monitor-PIDs这个比较好记,推荐使用这个!一目了然,动态显示每个线程的cpu使用率,很容易找到最高的。??图中的%CPU一栏很清楚的列出了CPU的占用情况,也可以看出54313个线程占用了最高的CPU。细心的同学发现为什么这两种方法得到的数据不一样呢?会不会错了?其实都是对的,只是用来计算的数据不同罢了。Top获取瞬时cpu使用率。top数据默认每3秒刷新一次,所以计算的是这3秒内线程占用CPU时间的比例,而ps计算的是从启动到现在的时间比例。运行时间越长,就会接近某个固定值。有兴趣的同学可以了解一下CPU占用率的算法。如何将问题定位到代码行级别?通过上面的操作,我们已经找到了正在做事的线程,但是这个线程看起来像个鬼,我们只能看到一个代表它的数字。这时候我们就需要建立一个线程号和具体代码之间的映射关联,那么就需要借助这些强大的查看堆栈信息的工具了。gstack/pstack(c/c++程序)命令:gstack/pstack进程号其实是一个工具,pstack只是gstack的一个软连接。jstack(java程序)命令:jstack进程号如果线程多,重定向到一个文本文件,gstack进程号>gstack.txt,方便查看。这个文本文件存储了线程号和调用栈的一对一映射关系,这样我们就可以很容易地找到出现问题的具体代码。建议多抓几次。如果每次的调用栈都一样,基本就OK了。这绝对是那段代码的问题。??经过这样的操作,很快就可以定位到CPU占用率高的问题了!今天分享到这里!谢谢大家!如果觉得有用,请给我一个赞~??扫描二维码关注公众号,文章会第一时间发布在公众号平台。