性能分析(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. 删除问题代码块,重新压测,每秒平均请求数有了质的飞升,成功解决问题
相关文章
|
SQL 数据管理 网络安全
数据管理DMS操作报错合集之DMS的CPU使用率达到100%,如何解决
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
消息中间件 Java 应用服务中间件
我是如何通过火焰图分析让应用CPU占用下降近20%的
分享作者在使用Arthas火焰图工具进行Java应用性能分析和优化的经验。
|
监控 并行计算 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
在Python编程的征途中,面对日益增长的性能需求,如何构建高效的应用成为了每位开发者必须面对的课题。并发与异步编程作为提升程序性能的两大法宝,在处理IO密集型与CPU密集型任务时展现出了巨大的潜力。今天,我们将深入探讨这些技术的最佳实践,助你打造高效Python应用。
359 0
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
279 0
|
缓存 C语言 计算机视觉
程序与技术分享:CPU0处理器的架构及应用
程序与技术分享:CPU0处理器的架构及应用
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
1495 8
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
传感器 算法 机器人
定点 CPU 在哪些领域有应用
定点CPU主要应用于对成本和功耗敏感的嵌入式系统中,如消费电子、汽车电子、工业控制和物联网设备等,因其结构简单、效率高而受到青睐。
|
运维 监控 Linux
解决CPU与带宽高使用率问题:深入分析与应对策略
引言:性能问题的诊断与优化 在运维工作中,操作系统性能问题如影随形,典型代表是CPU使用率高和带宽使用率高的问题,它们直接影响应用的性能和响应时间。这篇记录将逐个分析这两个问题的产生原因和解决方法。
解决CPU与带宽高使用率问题:深入分析与应对策略
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
868 1

热门文章

最新文章