Nginx + PHP导致的性能问题

1|0一. 准备


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,如果能看到信息,说明已经启动成功了

 

2|0二. 编写脚本


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

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

3|0三. 定位


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,可以看到是由于该代码导致了性能问题

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


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

 


__EOF__

本文作者cnhkzyy
本文链接https://www.cnblogs.com/my_captain/p/12675853.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cnhkzyy  阅读(514)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示