如何定位php程序访问慢
admin
2023-02-03 09:20:46
0

公司的业务是用PHP语言开发的,那么使用的环境十有八九就是LNMP。在日常的运维工作中,占到9成以上的故障是遇到性能问题。
你可能会想,我们的业务运行的好好的,为啥平白无故就出现性能问题?
原因有太多可能,比如代码改动、异常访问、网络波动、服务器硬件故障等等。
引起性能问题的原因有这么多,那如何定位呢?
给大家介绍一个性能追踪的方法,这个方法在我运维职业生涯里屡试不爽,帮了我不少大忙。
— slow log追踪 —
我们可以通过slow log很方便地追踪到问题点。先来看配置方法吧。

 1)编辑配置文件
假设php安装路径为/usr/local/php,配置文件路径/usr/local/php/etc/php-fpm.conf)
# vim /usr/local/php/etc/php-fpm.conf #更改或增加两行内容slowlog = /data/logs/php-slow.logrequest_slowlog_timeout = 2
说明:slowlog定义日志路径和名字,request_slowlog_timeout定义超时时间,单位秒,即一个php脚本执行时间超过了该时间,则会记录日志。

2)重启php-fpm服务
具体重启命令,根据你自己的环境来决定。配置文件修改后,不重启或者不重载服务是不生效的。

3)测试
在测试站点里新建一个test.php文件,写入如下内容:
然后在浏览器里或者使用curl命令去访问
# curl http://ip/test.php

4)结果分析
访问test.php时,我们能感觉到它短暂卡死,大概5秒后出现结果。此时到/data/logs/php-slow.log里查看,有如下内容:
[pool www] pid 6368script_filename = /data/wwwroot/aminglinux.cc/test.php[0x00007ff8c821f090] sleep() /data/wwwroot/aminglinux.cc/test.php:3
这个slow log,不仅可以记录哪一个文件慢,而且也可以记录具体哪一行的什么函数。
有了它,一旦网站访问卡顿,我们就非常方便地找到问题点了。

— 线上生产环境演示案例 —

问题描述:
网站访问变卡顿了,不是不能访问,而是变慢了。
解决过程:
1)登录服务器查看负载,结果不到1,并不高
2)vmstat 1查看发现r列时不时出现不高于5的数字,说明有些进程比较忙
3)用top命令查看,php-fpm进程排在前面
4)查看slow log,结果如下:   
   [29-1月-2019 16:54:59]  [pool www] pid 20287    script_filename = /data/wwwroot/www.example.com/redirect.php    [0x00000000031d83c0] mysql_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84    [0x00000000031d6bb0] query() /data/wwwroot/www.example.com/redirect.php:105
   [29-1月-2019 16:54:59]  [pool www] pid 23066    script_filename = /data/wwwroot/www.example.com/redirect.php    [0x000000000319b5a0] mysql_query() /data/wwwroot/www.example.com/include/db_mysql.class.php:84    [0x0000000003199d90] query() /data/wwwroot/www.example.com/redirect.php:122

通过slow log发现是redirect.php里面有查询数据库的操作慢导致网站访问卡顿。
所以,还需要登录数据库服务器近一步分析为什么MySQL查询慢,这个就涉及到了MySQL的慢查询日志,具体详细的操作我不再阐述。
— 使用Xdebug+Webgrind —
如果网站跑在了LAMP环境中,就无法使用php-fpm的slow log了,那如何分析瓶颈点?
没关系你还可以使用这个Xdebug+Webgrind,其中Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。
Webgrind是一个网页版的性能分析工具,它的主要作用就是分析Xdebug生成的cachegrind文件,以一种界面友好详尽的方式来展示性能数据。
Xdebug安装:
    
Xdebug官方网站:http://xdebug.org/.
1)下载源码
如果你用的PHP版本较高,建议下载最新版本
# wget https://xdebug.org/files/xdebug-2.7.0beta1.tgz
2)编译安装
# tar zxf xdebug-2.7.0beta1.tgz# cd xdebug-2.7.0beta1# /usr/local/php-fpm/bin/phpize# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config# make && make install
3)配置
# vi /usr/local/php-fpm/etc/php.ini  #在最后面增加[xdebug]zend_extension=xdebug.soxdebug.trace_output_dir=/tmp/xdebugxdebug.profiler_output_dir = /tmp/xdebugxdebug.profiler_enable = 1xdebug.profiler_enable_trigger = 1
4)检查
# /usr/local/php-fpm/bin/php -m |grep -C 1 Xdebug[Zend Modules]Xdebug
5)创建Xdebug目录
# mkdir /tmp/xdebug# chmod 777 !$
6)重启php-fpm或者apache服务
因为修改了php.ini配置文件,需要重启对应的服务,才可以生效,我这里用的是php-fpm
# /etc/init.d/php-fpm restart
Webgrind安装:
    
1)下载
Webgrind官方github地址https://github.com/jokkedk/webgrind
# wget https://codeload.github.com/jokkedk/webgrind/zip/v1.5.0# mv v1.5.0  webgrind-1.5.0.zip# unzip webgrind-1.5.0.zip

2)为Webgrind配置站点
Webgrind其实是一个PHP网站程序,需要为其设置一个虚拟主机,我用的是LNMP环境,所以需要配置Nginx, 当然你也可以直接把webgrind程序目录丢到一个站点内,通过二级目录去访问。下面是我的Nginx虚拟主机配置文件内容:
    server {
     listen       80;
       server_name webgrind.aminglinux.cc;
       root   /data/wwwroot/webgrind;        index  index.html index.htm index.php;
       location ~ .php$ {            fastcgi_pass   127.0.0.1:9001;            fastcgi_index  index.php;            fastcgi_param  SCRIPT_FILENAME  /data/wwwroot/webgrind$fastcgi_script_name;            include        fastcgi_params;        }

3)配置webgrind
假如新配置的虚拟主机目录为/data/wwwroot/webgrind
# mv webgrind-1.5.0/* /data/wwwroot/webgrind/# 
vim config.php  #修改$storeageDir和$profileDir
static $storageDir = '/tmp/xdebug';
static $profilerDir = '/tmp/xdebug';

4)性能追踪
首先访问要追踪性能的PHP网站,然后查看/tmp/xdebug目录下是否生成文件
  # ls /tmp/xdebug/
  cachegrind.out.11442  cachegrind.out.11443  cachegrind.out.11443.091dcb
我的已经生成3个文件,然后在浏览器访问即可,不过需要你先选择脚本文件(右上角),点击update之后才会出现分析内容。
   
5)图形显示
我们还可以把PHP代码中的各个函数调用关系以图形的形式展现出来,这样更加直观。前提是需要python和dot两个工具的支持,python默认机器上自带,但是dot需要安装
    # yum install -y graphviz
点击右上角的“show call graph”按钮,就会出现漂亮的调用图

上一篇:linux-4week

下一篇:Linux系统的发展历史

相关内容

热门资讯

阿联酋航空发文致歉 7月23日,阿联酋航空发布致歉信:原计划于7月22日从迪拜飞往上海的阿联酋航空EK302航班,因恶劣...
给“南海仲裁案”递刀子的美国人... 执笔/李小飞刀7月12日晚,菲律宾内格罗斯东方省锡布兰镇的一处公寓内,突然响起一阵枪声,美国海洋生物...
特朗普称沙特加入《亚伯拉罕协议... △美国总统特朗普(资料图)当地时间7月23日,美国总统特朗普在社交媒体“真实社交”上发文表示,美国能...
硬核首发+增购订单!成都企业上... 7月22日,2026国际低空经济博览会在上海开幕,来自成都的沃飞长空集中发布三大重磅成果:全新AE2...
国际观察:中拉人工智能合作持续... 张冰倩 为进一步支持全球人工智能发展、推进全球人工智能能力建设,未来5年,中国将面向发展中国家提供5...
共商汽车产业全球合作新路径 G... 当前,汽车产业正加速向绿色化、智能化、国际化、融合化发展,汽车供应链受到大国竞争与地缘政治冲突扰动。...
内蒙古耕种收综合机械化率达91... 7月22日,记者从2026年中国农机推广田间日活动上获悉,内蒙古农作物耕种收综合机械化率达到91%,...
华为黄健:在算力、存力和运力三... 7月17日至20日,以“智能伙伴,共创未来”为主题的2026世界人工智能大会(WAIC)暨人工智能全...
苹果、谷歌都没留住月之暗面创始... 英国《金融时报》7月23日刊发评论《为什么美国正在失去中国人工智能明星?》,文章谈到,月之暗面(Mo...
陪伴大家十几年的充电宝,大概要... 要说这两年最尴尬的数码配件,托尼觉得充电宝绝对算一个。 以前它的对手还都是同行 —— 大家一起卷容量...