你们好!我是Sean!

相信好多C++程序员都经历程序占用cpu过低的问题,这些问题,假如对代码运行逻辑足够熟悉,只靠头脑想恐怕定位上去也不难,而且假如是调用第三方sdk,或则团队其他人开发的库引起的cpu占用居高,就不这么容易定位了。

明天就分享一下我在工作中怎么操作的!‍

怎样确定程序cpu占用情况?

这个特别简单,一条命令搞定,top-p进程pid,这样就可以:

这样就可以持续的观察你的程序的cpu占用情况,若果仍然居高不下,就可能是有问题了。‍‍从图中可以见到%CPU为98.0,这早已十分特别高了。

怎么查看线程级别的cpu占用情况?方式一:

命令

ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu | grep 进程号

这个比较长,理解一下也不难记忆linux cpu占用率 命令,这儿我们可以看见用户、进程号、父进程号、线程号、cpu占用总时长、cpu占用率、程序名。根据cpu的值进行了倒序排列,最后一个即为占用cpu最高的线程,这样就可以找到对应线程号。

图中第4列就是线程号,第5列是cpu占用时长,第6列是cpu占用率,可以看见54313线程占用CPU最高。

方式二:

命令:

top -H -p 进程号
-H  :Threads-mode operation
-p  :Monitor-PIDs

这个就挺好记了,推荐用这个!一目了然,动态显示各个线程的cpu占用情况,很容易找出最高的那种。

‍‍图中%CPU列很清晰的列举了cpu的占用状况,也可以看出54313线程占用cpu最高。

悉心的朋友发觉了linux嵌入式开发,为何这两种方式得到的数据不一样?难道不对?虽然都是对的,只是估算用的数据不同,top得到的是瞬时的cpu占用率,top数据默认3秒刷新一次,所以估算的是这3秒内线程占用CPU时长占比linux命令大全,而ps估算的是从启动到现今的一个时长占比,运行时间越长,都会趋近于某个固定值,感兴趣的朋友可以了解一下cpu占用率的算法。

怎样将问题定位到代码行级别?

通过前面的操作我们早已找到了那种搞事情的线程,然而线程长得都一个鬼样子,我们只能见到一个代表它的数字,此时须要一个构建一个线程号与具体代码的映射关联,这么就须要用到这几个查看堆栈信息的强悍工具了。

gstack/pstack(c/c++程序)

命令:

gstack/pstack 进程号

这两个似乎一个工具linux cpu占用率 命令,pstack是gstack的软联接而已。

jstack(java程序)

命令:

jstack 进程号

假如线程比较多,重定向到一个文本文件吧,gstack进程号>gstack.txt,便捷查看。这个文本文件里储存的就是线程号和调用堆栈一对一的映射,这样我们就可以很容易找到具体出问题的代码,建议多抓取几次,假如每次都是一样的调用堆栈,基本可以确定就是那块代码出的问题了。‍‍

经过这样一番操作,定位cpu占用高的问题能够迅速定位啦!

明天就分享到这儿啦!谢谢你们!认为有用的话,帮忙点个赞呗~‍‍

扫码关注我的公众号,文章第一时间发布在公众号平台。

Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复