Linux下CPU忙类型问题的定位与处理 - 系统调优

今天分享实际工作中,后台开发系统调优问题解决思路,下面主要讲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),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值