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

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

系统架构背景

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

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

简单介绍 ab 命令

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

运行 ab 命令

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

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

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

那到底是哪里出了问题呢

接下来,我们将通过 top、perf 来再次观察一波啥问题

深入分析

长时间运行 ab 命令

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

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

VM1 终端运行 top 命令

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

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

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

在 VM1 终端运行 perf 命令

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

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

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

perf report

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

可以看到,最终是关系到 sqrtadd_function 这两个函数

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

找到 sqrt 函数

grep sqrt -r app/

原来只有 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

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

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

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

VM2 终端再次运行 ab 命令

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

可以看到每秒请求数突飞猛进的升到 2500

性能分析(2)- 应用程序 CPU 使用率过高案例的更多相关文章

  1. 性能分析(4)- iowait 使用率过高案例

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前言 前面两个案例讲的都是上下文切换导致的 CPU ...

  2. Java程序CPU使用率过高

    Java程序CPU使用率过高 通过top命令找到使用率过高的java进程PID 根据进程号查找线程TID:ps -mp PID -o THREAD,tid,time 将TID转换成16进制:print ...

  3. 性能分析(3)- 短时进程导致用户 CPU 使用率过高案例

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 系统架构背景 VM1:用作 Web 服务器,来模拟 ...

  4. 性能分析(5)- 软中断导致 CPU 使用率过高的案例

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前言 软中断基本原理,可参考这篇博客:https: ...

  5. 性能测试分析过程(二)cpu 使用率过高的分析方法

    Linux 系统下 cpu 使用率过高的分析方法 1.通过 top 命令可以很明显查看出哪个进程耗cpu比较高 2. ps -mp 25147-o THREAD,tid,time\top -Hp pi ...

  6. 找出程序cpu使用率高的原因

    确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |g ...

  7. CPU使用率过高分析方法

    项目过程中发现,应用服务器经常会出现CPU使用率较高的情况,需要定位出具体代码问题. 1.用top命令,根据CPU使用率排序,找出消耗cpu最高的进程 2.找出该进程下消耗CPU最高的线程(命令:to ...

  8. 06 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?

    上一节我讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过 ...

  9. 4 系统的 CPU 使用率很高,但为啥却找不到高 CPU的应用?

    上一节讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过就 ...

随机推荐

  1. 【Oracle】arraysize的研究(存在疑问)

    arraysize的研究(存在疑问) SYS@proc> create table aaa (id1 int,id2 int,id3 int,id4 int); Table created. S ...

  2. Mariadb之复制过滤器

    mariadb的主从复制集群,默认情况下是把主库上的所有库进行复制,只要在主库上产生写操作,从库基于主库的二进制日志做重放,从而实现把主库的上的库表复制到从库:复制过滤器指的是我们仅复制一个或几个数据 ...

  3. UVA11300 Spreading the Wealth 题解

    题目 A Communist regime is trying to redistribute wealth in a village. They have have decided to sit e ...

  4. 链表中倒数第k个节点(剑指offer-14)

    /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ ...

  5. Tomcat 架构原理解析到架构设计借鉴

    Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说如今就没有必要深入学习它了么?学习它我们又 ...

  6. Linux多任务编程之五:exit()和_exit()函数(转)

    来源:CSDN  作者:王文松   转自:Linux公社 ----------------------------------------------------------------------- ...

  7. 读《大话设计模式》——应用工厂模式的"商场收银系统"(WinForm)

    要做的是一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费.两个文本框,输入单价和数量,再用个列表框来记录商品的合计,最终用一个按钮来算出总额就可以了,还需要一个重置按钮来重新开始. 核心 ...

  8. Mysql基础(四):库、表、记录的详细操作、单表查询

    目录 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细操作 3. 表的详细操作 4. 行(记录)的详细操作 5. 单表查询 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细 ...

  9. java 数据结构(九):Collection子接口:List接口

    1. 存储的数据特点:存储序的.可重复的数据. 2. 常用方法:(记住)增:add(Object obj)删:remove(int index) / remove(Object obj)改:set(i ...

  10. java 面向对象(十四):面向对象的特征二:继承性 (三) 关键字:super以及子类对象实例化全过程

    关键字:super 1.super 关键字可以理解为:父类的2.可以用来调用的结构:属性.方法.构造器3.super调用属性.方法:3.1 我们可以在子类的方法或构造器中.通过使用"supe ...