Linux生产环境CPU使用率100%,教你定位到具体函数

时间:2022-07-22
本文章向大家介绍Linux生产环境CPU使用率100%,教你定位到具体函数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在我们项目部署上线的时候,我们是不是会经常去Linux服务器上查查服务器的CPU使用率,或者是运维经常会盯Linux的CPU使用率,发现监控报了60%的一般就会报警了,到了100%那就惨啦,做我开发的我们如果自己程序运行时CPU使用率一直是100%的话,那么,我们加班肯定逃不掉了,更打击我们自己的强大的自尊心。今天我就将我们线上之前有个100%的CPU给大家讲解下,然后教大家怎么去定位然后发现到具体的函数,然后去修改它就行了

01

什么是CPU使用率

CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比,

咱们大家平时是不是都是用top 或者 ps来分析CPU使用率的,需要我们注意的是,性能分析工具给出的都是间隔一段时间的平均 CPU 使用率,所以要注意间隔时间的设置,特别是用多个工具对比分析时,你一定要保证它们用的是相同的间隔时间。

例如,我们的 top 和 ps 分析工具报告的 CPU 使用率,两者的结果可能不太一样,因为 top 默认使用 3 秒时间的间隔,而 ps 工具使用的却是进程的整个生命周期。

02

怎么找出100%的问题

我们在上面先大致的了解了CPU使用率是什么,下面我就来教大家怎么定位到造成CPU100%的具体函数。

1

用ssh客户端登录到你的服务器

运行 top 命令,然后按一下键盘上 1 键,查看你Linux服务器上每个CPU的使用率情况,如下图

现在,我这个CPU是正常的,就没有给重新放出100%进程了,定位方法时一样的。我就假设我这个php-fpm 进程CPU到了100%看下面:

top - 13:59:19 up 168 days, 23:03, 1 user, load average: 0.04, 0.03, 0.00
Tasks: 216 total, 1 running, 215 sleeping, 0 stopped, 0 zombie
%Cpu0 : 99.0 us, 2.4 sy, 0.0 ni, 97.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 99.8 us, 1.2 sy, 0.0 ni, 97.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4028864 total, 973100 free, 711608 used, 2344156 buff/cache
KiB Swap: 1046524 total, 1032336 free, 14188 used. 2920808 avail Mem 

 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
 94804 dev 20 0 49004 3812 3084 R 2.3 0.1 0:00.20 top 
 94805 dev 20 0 47212 8796 2408 S 1.1 0.2 407:42.92 php-fpm 
94806 dev 20 0 47212 8796 2408 S 1.1 0.2 407:42.92 php-fpm
 94670 root 20 0 19620 2996 2764 S 1.1 0.1 0:00.03 mysql-systemd-s 
 94762 dev 20 0 97464 3556 2608 S 1.1 0.1 0:00.08 sshd 

从上面可看出,两个php-fpm进程的CPU使用率加起来99.8%了。和最上面的%CPU基本都快到100了,所以,现在我们就可以确定造成服务器CPU 使用率100%的进程是这php-fpmj进程

2

怎么知道是哪个函数

虽然现在我们知道是由于php-fpm进程造成的cpu飙升,但是里面代码那么多,我怎么知道是哪个函数哪块代码出的问题的呢?这个时候,我们就需要用另一个工具perf来分析下,也就是在ssh上输入pref命令来看下:

# -g开启调用关系分析,-p指定php-fpm的进程号94806
$ perf top -g -p 94806

我们通过按方向键,切换到php-fpm,然后按回车键就会展开php-fpm的调用关系,最后我们就会看到,调用关系最终到了 sqrt 和 add_function。所以我们现在就需要看这两个函数了。

3

查看函数

好,那我们来看看这个函数sqrt,add_function这个函数是php内置的,现在看看是出现了什么问题

$ cat app/index.php $x += sqrt($x);
}

echo "It works!"

现在,我们已经看到了,我在上面加了个大循环,这里导致cpu使用率骤增的。

总结,我们知道CPU的使用率其实在生产环境就是直接的反应我们系统性能的重要指标。当我们碰到 我们服务器CPU 使用率升高的时候,不要慌,我们要先借助 top、pidstat 等性能分析工具,先找到导致 CPU 性能问题的来源;然后再使用 perf 相关分析工具,进行查出引起性能问题的具体函数所在。如果大家喜欢或者对大家有帮助,就关注我,让我们一起共同学习共同进步。

下一篇预告,分库分表相关专题

关于架构师修炼

本号旨在分享一线互联网各种技术架构解决方案,分布式以及高并发等相关专题,同时会将作者的学习总结进行整理并分享。

更多技术专题,敬请期待