Nginx + PHP导致的性能问题

一. 准备

1. 在data目录下,使用rz上传项目zip包

2. 解压

3. 进入到解压后的目录nginx-php-cpu,查看Makefile操作步骤

4. 配置docker镜像加速

我们使用DaoCloud进行加速,具体DaoCloud怎么获取镜像源地址,请看这篇Docker从理论到实践(三)------配置你的DaoCloud的Docker镜像源加速器

接着修改docker.service,记得字母不要写错,否则docker会重启失败

[root@localhost nginx-php-cpu]# vim /usr/lib/systemd/system/docker.service 

ExecStart=/usr/bin/dockerd --registry-mirror=http://f1361db2.m.daocloud.io
ADD_REGISTRY='--registry-mirror=http://2e28129a.m.daocloud.io'

结束之后记得要重启下docker

systemctl daemon-reload
systemctl restart docker

5. 先查看Makefile文件,根据Makefile去build和run

cat Makefile

6. build操作

docker build -t pertest/nginx:cpu -f Dockerfile.nginx .    #去下载Nginx的镜像包
docker build -t pertest/php-fpm:cpu -f Dockerfile.php-fpm .    #下载PHP

7. 查看镜像包信息

docker images

8. 运行

运行nginx,命名为nginx,端口进行转发,Nginx默认的端口是80,可以把虚拟端口映射到一个实际的端口18080,可以用这个端口进行访问,

docker run --name nginx -p 18080:80 -id pertest/nginx:cpu    #启动Nginx,端口从镜像的80映射到本地的18080端口

运行PHP

docker run --name phpfpm -itd --network container:nginx pertest/php-fpm:cpu    #启动PHP

使用docker ps查看启动容器

9. 验证

在本机输入192.168.0.110:18080,如果能看到信息,说明已经启动成功了

二. 编写脚本

1. 在jmeter中新建阶梯型线程组,添加HTTP请求,启动20个线程,最后查看TPS和响应时间

运行后,可以看到平均响应时间过长,响应时间持续升高,TPS比较低

三. 定位

1. 使用top看一下CPU使用率,可以看到%user已经快跑满了,且都是PHP进程导致的

2. 使用perf top查看,如果看到的都是十六进制的数据,是因为perf的版本有点低

perf top

3. 使用perf record等待30s后停止,生成报告

perf record -g -p 38577   #-g 开启函数的调用跟踪,-p pid

================================centos7开始================================

4. 将报告拷贝到docker中的PHP的/tmp目录下

docker cp perf.data phpfpm:/tmp

5. 进入docker容器里面

docker exec -it phpfpm bash

6. 升级Linux-perf(centos8上是4.9以上不用升级)

apt-get update && apt-get install -y linux-perf linux-tools procps

7. 打开报告:通过方向键切换到php-fpm,再回车展开php-fpm的调用关系,调用关系最终找到了sqrt这个函数

perf_4.9 report

================================centos7结束================================

6. 查看PHP源码看是不是有这个函数

grep sqrt -r pertest/    #-r 对目录下的文件进程递归查找

然后通过vim pertest/index.php定位到代码中的sqrt,可以看到是由于该代码导致了性能问题

四. 使用修复后的代码fixe_index.php运行

可以看到,用户态的CPU使用率不是那么高了

原文地址:https://www.cnblogs.com/my_captain/p/12675853.html