大家好!我是肖恩!
我相信许多C ++程序员都遇到了程序占用大量CPU的问题。如果您熟悉代码运行逻辑并且仅依靠大脑来估计位置,则这种问题并不困难,但是如果您调用了第三方SDK,或者由其他人开发的库导致的CPU使用率过高,团队很难找到。
今天,分享我的工作方式!
如何确定程序的CPU使用率?
这非常简单,只需执行一个命令,top -p process pid,因此您可以:
通过这种方式,您可以继续观察程序的CPU使用情况。如果仍然很高,可能有问题。从图中可以看出,%CPU为98.0,已经很高了。
如何在线程级别检查CPU使用率?方法1:
命令:
ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu | grep 进程号
这是比较长的,不难记住。在这里,我们可以看到用户,进程号,父进程号,线程号,cpu总占用时间,cpu占用率和程序名称。根据cpu值升序排列,最后一个是cpu最高的线程,这样就可以找到对应的线程号。
图中的第四列是线程号,第五列是cpu占用时间,第六列是cpu占用率。您可以看到54313线程占用的CPU最高。
方法2:
命令:
top -H -p 进程号
-H :Threads-mode operation
-p :Monitor-PIDs
这很容易记住,我推荐这个!一目了然,每个线程的CPU使用率都会动态显示,很容易找到最高的线程。
在图中的%CPU列清楚地列出了CPU占用状态。还可以看到54313线程占用的CPU最高。
专心的学生发现,为什么两种方法获得的数据不同?可能是错的吗?实际上,它们都是正确的,但是用于计算的数据是不同的。 Top获取瞬时cpu占用率。默认情况下,顶部数据每3秒刷新一次,因此计算是这3秒中线程占用的CPU时间的比例,而ps则计算这是从启动到现在的时间百分比。运行时间越长,它将越接近某个固定值。有兴趣的学生可以了解CPU占用的算法。
如何在代码行级别找到问题?
通过上述操作,我们找到了正在运行的线程,但是该线程看起来像是鬼。我们只能看到代表它的数字。这时,我们需要程号和特定代码之间建立映射。关联,那么您需要使用这些功能强大的工具来查看堆栈信息。
gstack / pstack(c / c ++程序)
命令:
gstack/pstack 进程号
这两个实际上是一个工具,而pstack只是gstack的软链接。
jstack(Java程序)
命令:
jstack 进程号
如果线程很多,请重定向到文本文件,gstack进程ID> gstack.txt,以便于查看。该文本文件存储线程号和调用堆栈之间的映射,以便我们可以轻松找到出现问题的特定代码。建议抓几次。如果每次调用堆栈都相同,则基本上可以,请确保这是这段代码的问题。
进行此类操作后,可以快速找到CPU使用率高的问题!
今天在这里分享!谢谢大家!如果您觉得它有用,请给我个赞〜
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-340467-1.html