今天分享实际工作中,后台开发系统调优问题解决思路,下面主要讲CPU忙类型的定位与处理,可以掌握系统性能问题的定位技能。
CPU占用率高问题定位
下面我们通过命令top,来 确定那个cpu忙,那个线程导致cpu占用率过高。
- 先执行top
- 按1键:
查看cpu的id字段(即idle),值越小示cpu占用率越高,本处cpu1的id很低,us很大,说明cpu 占用率过高。
- 按F键
按F键调出top功能选择菜单,按J让top显示线程运行于那个cpu上如图,然后按ENTEN。
CPU占用率高问题定位
查看问题线程哪里导致cpu占用率高。一般有3种情况,是Bug即存在死循环,或cpu性能不足,或设计如此。bug则修复,cpu性能不足则看代码是否可以优化。
- perf工具查看线程
如果你的设备或者虚拟机没有安装perf命令,可以使用如下安装:
yum install perf
下面使用perf工具查看线程每个函数的执行频率
perf record -g -t tid
record 表示收集程序运行统计数据, -g 表示产生的报告带调试信息,可以查看代码 -t tid表示 待测试的线程。
本命令收集线程tid的运行数据,不会自动退出,保持几秒钟,按Ctrl+C使Perf命令退出, 然后查看结果:
perf report
- gdb判断是否有死循环
使用gdb判断是否有死循环,和代码热点用gdb跟踪问题线程:
gdb -p tid
执行bt看程序停在那,执行c运行一阵, CTRL+C暂停, 再执行bt看程序停在那,反复这个动作,如果 程序大多数时候都停在一个相近的地方,则该段代码是执行热点,也可能是死循环。
如图,循调用栈由内到外此次设断点,t_cpu.c:14,t_cpu.c:12,t_cpu.c:30,然后c运行,依次把会导致停止的断点dis 掉,再c运行,找出首个不会停止的断点,则该处代码就是导致死循环的地方。
CPU分配不均问题
如果有的cpu很忙,有的又很闲,会导致程序执行效率低,启动top,显示cpu状态, 各线程运行状态,线程驻留的cpu号等信息
步骤:
1、top
2、ENTER
3、按1
4、 按F
5、 按J
6、 ENTER
7、CTRL+H
本案例中cpu0的id仅有1.3%, 在cpu0上有test线程,cpu都被test占用了,在网络中,也会出现丢包等现象。
出现这种现象,我们如何解决呢?
解决办法是,把test从cpu0移开,不让它运行的cpu0上,可以通过taskset实现:
taskset -cp 3 31435
即把31435线程 固定到cpu3运行,也可以通过cgroup工具实现。
CPU负载过重问题的定位
负载过重是指top命令中的load average值,该值表示,最近一段时间内平均有多少个线程处于运行状态。如果该值长期大于系统的CPU数, 将会使一些线程得不到及时运行,此时即使各cpu不忙, 也会导致丢包等性能问题。
步骤:
1、启动top,查看负载:top
2、ENTER
3、键1
4、 CTRL+H
可见load_average为10.24,6.13,3.03即最近1分钟,5分钟,15分钟处于待运行状态的线程数平均值,均大于cpu核数2。
上面的例子,直接从top命令的输出就可以看出所有处于R状态的线程,实际上,不一定能看的出来,多个线程处于R状态的情况只是一瞬间出现是个暂态,此时可以通过不断执行如下命令去捕捉这中情况:
top -H -n 1 |grep ’ R ’
确定出问题的进程后,就得获取其调用栈查看究竟哪些代码流程导致问题,先执行如下命令查看调用栈:
这gstack $(pidof 进程名) > test.txt
gstack命令功能跟gdb 的apply all bt一样,但是可以把调用栈输出到文件,更便于分析。从调用栈中,可以查看当前时刻,各线程在干什么,所有当前执行函数不为sleep类函数的线程,均是运行态的线程。
总结
这篇文章主要介绍了CPU忙类型问题的定位与处理,主要使用top、perf、taskset、gstack命令。
如果有的cpu很忙,有的又很闲,会导致程序执行效率低,启动top命令。
如果想查看问题线程哪里导致cpu占用率高。启动perf命令。
如果想把 cpu0移开,不让它运行的cpu0上,可以通过taskset命令。
如果想显示每个进程的栈跟踪,使用pstack命令。
欢迎关注微信公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下: