性能分析(2)- 应用程序 CPU 使用率过高案例

简介: 性能分析(2)- 应用程序 CPU 使用率过高案例

性能分析小案例系列,可以通过下面链接查看哦

https://www.cnblogs.com/poloyy/category/1814570.html

 

系统架构背景


image.png

  • VM1:用作 Web 服务器,来模拟性能问题
  • VM2:用作 Web 服务器的客户端,来给 Web 服务增加压力请求
  • 使用两台虚拟机(均是 Ubuntu 18.04)是为了相互隔离,避免交叉感染

 

VM2 运行 ab 命令,初步观察 Nginx 性能


简单介绍 ab 命令

  • ab(apache bench)是一个常用的 HTTP 服务性能测试工具
  • 可以向目标服务器并发发送请求

 

运行 ab 命令

并发 10 个请求测试 VM1 的 Nginx 性能,总共测试 100个请求

ab -c 10 -n 10 http://172.20.72.58:10000/

image.png

从 ab 的输出结果可以看到,Nginx 能承受的每秒平均请求数只有 14.73(这也太辣鸡了吧)

 

那到底是哪里出了问题呢

接下来,我们将通过一系列的命令来观察哪里出问题了

 

深入分析


VM2 长时间运行 ab 命令

并发 10 个请求测试 VM1 的 Nginx 性能,总共测试 10000个请求

ab -c 10 -n 10000 http://172.20.72.58:10000/

 

VM1 终端运行 top 命令

输入后,按1,查看每个 CPU 的使用率

image.png

结果分析

  • 系统中有几个 php-fpm 进程的 CPU 使用率加起来接近 200%
  • 而每个 CPU 的用户使用率(us)也已经超过了 96%,接近饱和
  • 结论:正是用户空间的 php-fpm 进程,导致 CPU 使用率骤升

 

分析 php-fpm 进程到底是因为哪个函数导致了 CPU 使用率升高


在 VM1 终端运行 perf 命令

perf record -g -p 84408

  • record:录制的意思
  • -g:开启调用关系分析
  • -p:指定 php-fpm 的进程号84408

 

录制约 30s 后,ctrl+c 终止进程,然后可以在当前目录下看到 perf.data 文件

image.png

然后执行下面命令,分析报告(perf.data)

perf report

 

按方向键可上下切换,有+的按回车键可以展开

image.png

结果分析

最终是关系到 sqrtadd_function 这两个函数

 

查看 Nginx 应用的源码,找到问题根源


找到 sqrt 函数

grep sqrt -r app/

image.png

原来只有 sqrt 函数在 app/index.php 文件中调用了

 

找到 add_function 函数

grep add_function -r app/

会发现找不到,因为 add_function 是 PHP 内置函数

 

查看 index.php 源码

<?php
// test only.
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
  $x += sqrt($x);
}
echo "It works!"


可以看到,这里有一个循环很多次的代码段

 

解决方法

找到问题的根源,就可以快速解决了,删除循环代码块

<?php


echo "It works!"

 

perf 拓展

其实有一条命令更方便查看函数

perf top -g -p 84408

image.png

那为啥我要用 perf record 然后再用 perf report 呢

因为如果没有 perf 源码的话,是无法读取到 php 的函数,只会显示一堆十六进制码

 

修复问题后,验证 Nginx 性能是否有所变化

VM2 终端再次运行 ab 命令

ab -c 10 -n 10000 http://172.20.72.58:10000/

image.png

结果分析

每秒请求数突飞猛进的升到 2500,比之前的 14 好多了

 

分析整体思路


  1. 使用 ab 短时间压测,发现服务器性能低下,TPS 比较低
  2. 使用 ab 长时间压测,让服务器保持一个高负载的状态,方便排查问题
  3. 通过 top命令监控系统资源情况,发现用户态的 CPU 使用率(us)很高,且进程列表中发现几个进程的 CPU 使用率特别高,都是同一个 php 进程
  4. 通过 perfrecord 命令录制进程一段时间
  5. 通过 perf report查看录制进程的结果数据,可以分析 php-fpm 进程到底是哪个函数导致 CPU 使用率高
  6. 找到 add_function、sqrt 函数
  7. 通过 grep命令确认函数是在 index.php 代码文件中
  8. 查看 index.php 文件的源码,确认问题代码块
  9. 删除问题代码块,重新压测,每秒平均请求数有了质的飞升,成功解决问题
相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
12天前
|
SQL 数据管理 网络安全
数据管理DMS操作报错合集之DMS的CPU使用率达到100%,如何解决
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
2月前
|
Web App开发 Java 测试技术
ChaosBlade常见问题之演练场景页面乱码cpu使用率图片显示不出来如何解决
ChaosBlade 是一个开源的混沌工程实验工具,旨在通过模拟各种常见的硬件、软件、网络、应用等故障,帮助开发者在测试环境中验证系统的容错和自动恢复能力。以下是关于ChaosBlade的一些常见问题合集:
24 0
|
监控 算法 Linux
【C/C++ 实用工具】CPU使用率监控工具对比
【C/C++ 实用工具】CPU使用率监控工具对比
46 0
|
2月前
|
监控 Java 索引
cpu使用率过高和jvm old占用过高排查过程
cpu使用率过高和jvm old占用过高排查过程
44 2
|
6月前
|
Shell
我来教你如何将cpu使用率up起来(shell脚本[含注释])
我来教你如何将cpu使用率up起来(shell脚本[含注释])
265 0
|
7月前
|
Web App开发 缓存 JavaScript
Node.js 应用高 CPU 占用率的分析方法
Node.js 应用高 CPU 占用率的分析方法
127 0
|
7月前
|
Linux
模拟Linux服务器高cpu使用率
模拟Linux服务器高cpu使用率
|
2天前
|
缓存 监控 前端开发
如何在 Linux 命令行中检查 CPU 使用率
【5月更文挑战第8天】
11 0
|
4天前
|
监控 数据可视化 Java
Elasitcsearch CPU 使用率突然飙升,怎么办?
Elasitcsearch CPU 使用率突然飙升,怎么办?
16 1
|
29天前
|
Linux
如何在Linux系统上查看CPU使用率?
以上命令可以帮助你监视和分析Linux系统中的CPU使用率,可以根据需要选择合适的命令进行查看。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
17 0