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

什么是CPU使用率

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

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

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

怎么找出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.00Tasks: 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 stKiB Mem : 4028864 total, 973100 free, 711608 used, 2344156 buff/cacheKiB Swap: 1046524 total, 1032336 free, 14188 used. 2920808 avail MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND94804 dev 20 0 49004 3812 3084 R 2.3 0.1 0:00.20 top94805 dev 20 0 47212 8796 2408 S 1.1 0.2 407:42.92 php-fpm94806 dev 20 0 47212 8796 2408 S 1.1 0.2 407:42.92 php-fpm94670 root 20 0 19620 2996 2764 S 1.1 0.1 0:00.03 mysql-systemd-s94762 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 相关分析工具,进行查出引起性能问题的具体函数所在。如果大家喜欢或者对大家有帮助,就关注我,让我们一起共同学习共同进步。

往期精选

你的成神之路我已替你铺好,没铺你来捶我

Zookeeper实现分布式锁详细步骤,你一定要知道

数据库分库分表后,我们怎么保证ID全局唯一

java类加载机制,再也不怕面试官的刁难

不好意思,懂分布式事务的你真的很了不起,下篇

面试是不是经常被问到分布式系统核心问题,这一次没人难倒你

在公众号“架构师修炼”可获得专属java架构视频资料,更多java、python、人工智能、小程序、大前端等可看菜单,无私奉献
分类: 教程分享 标签: 暂无标签

评论

暂无评论数据

暂无评论数据

目录