如何定位php程序访问慢

公司的业务是用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文件,写入如下内容:
<?php????echo?"1";????sleep?(5);????echo?"2";
然后在浏览器里或者使用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”按钮,就会出现漂亮的调用图

原文地址:https://blog.51cto.com/14662442/2474029

时间: 2024-10-05 05:50:23

如何定位php程序访问慢的相关文章

android应用程序访问linux驱动第一步:实现并测试Linux驱动

一直都想亲自做一次使用android应用程序访问Linux内核驱动的尝试,但总是没能做到.最近抽出时间,下决心重新尝试一次.尝试的开始当然是先写一个Linux内核驱动了. 我希望写一个简单测驱动程序,实现写一个字符串进去,然后再把它读出来的功能.驱动中会创建dev/hello设备节点和/sys/class/hello/hello/val 设备节点,没有实现proc/下的对应的设备节点./sys/class/hello/hello/val 主要用于快速测试,而dev/hello则主要用于供上层应用

ADO.NET程序访问数据的组件

组成--数据集(内存中的数据库) --DataSet数据集 --DataTable数据表 --DataColumn数据列 --DataRow数据行 --DataView数据视图--NET数据提供程序 --Connection连接(程序和数据库之间的桥梁) --Open/Close --ConnectionString:连接字符串(目标数据库的信息) --服务器:server / data source --用户名:uid / user id --密码:pwd / password --数据库:d

如何在BPM中使用REST服务(1):通过程序访问网页内容

这篇文章主要描述如何通过程序来访问网页内容,这是访问REST服务的基础. 在Java中,我们可以使用HttpUrlConnection类来实现,代码如下. 1 package http.base; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.net.Ht

配置XenDesktop7.x &quot;本地应用程序访问&quot;功能

XenDesktop7.x版本新功能"本地应用"可以无缝的让本地应用运行在虚拟桌面环境中. 本地应用程序访问可将用户本地安装的应用程序无缝集成到托管的桌面环境中,而无需从一台计算机更改为另一台计算机. 利用本地应用程序访问,您可以: 直接从虚拟桌面访问在物理便携式计算机.PC 或其他设备上本地安装的应用程序. 提供灵活的应用程序交付解决方案. 如果用户具有您无法虚拟化或 IT 不予维护的本地应用程序,这些应用程序的行为就像安装在虚拟桌面上时一样. 实现本地应用,需要如下配置: 1.登录

32位程序访问64位系统上的Windows注册表

今天在工作的过程中遇到个奇怪的为问题,就是通过c#获取注册表键值的问题,一般都比较简单: string SQLPath = string.Empty; RegistryKey hkml = Registry.LocalMachine; RegistryKey MSSQLServerKey = hkml.OpenSubKey(@"SOFTWARE\MICROSOFT\MSSQLServer"); if (MSSQLServerKey != null) { string[] keys =

Android应用程序、应用程序访问硬件的流程

对于分层的系统,刚开始认识时,从宏观的框架层面了解应用的构建过程,有助于形成自己对新系统的清晰概念. 1.Android应用程序构建框架: 这里就涉及活动.布局.注册之间的关系.搞清了这三者,会对真个应用的实现流程了然于心. 2.应用程序访问底层硬件的程序构成: 这里就涉及应用.Android Frameworks.JNI.硬件抽象层HAL.驱动.硬件(OS)之间的关系,了解它们间的关系,对于整个安卓系统就有了整体的清晰认识. 版权声明:本文为博主原创文章,未经博主允许不得转载.

ios 性能优化之定位应用程序的内存问题

定位应用程序的内存问题 管理你的应用程序使用的内存是创建一个应用程序的最重要的一个方面.从最小的iOS设备最大的OS X的电脑,内存是一种有限的资源. 本章描述了如何识别常见的内存问题,从内存泄漏到僵尸. 检查内存使用量的活动监视器跟踪模板 活动监视器跟踪模板监控系统整体活动和统计数据,包括CPU.内存.磁盘和网络. 同时监测所有现有流程,可用于附加特定的进程的新仪器,监测父子流程层次结构和退出运行的流程. 它由活动的监测仪器. 稍后您将发现,活动监视器也用于监视网络活动在iOS设备上. 活动监

https://www.jqhtml.com/30047.html strace + 命令: 这条命令十分强大,可以定位你程序到底是哪个地方出了问题

https://www.jqhtml.com/30047.html 我的Linux手册 服务器 浏览数:72 2019-1-30 原文链接 基础安装 # CentOS sudo yum install epel-release 命令行Tips 进程及端口 # 查看端口占用情况 netstat -ap | grep 端口号   # 查看某一个端口 netstat -ntlp top -p 进程ID:查看进程的实时情况,包括内存大小,内存占用率.CPU占用率,运行时间 cat /proc/进程ID/

程序访问一个地址时候报400错误,浏览器访问正常怎么解决

? 最近凯哥在调凯哥优惠淘公众号(领取优惠券的公众号)的时候,发现以前好好的程序,突然不能用了.于是就本地断点,发现了如下错误: ? 程序通过httpClient访问一个地址的时候,提示:server returned HTTP Response code :400 fro URL:XXXX这个错误.不对啊,以前的没问题现在怎么就突然有问题了?而且将程序访问的url地址放到浏览器中就可以正常访问的.为什么在程序中就访问不了呢? 于是就把访问的URL 复制下来,一个一个对比,发现,原来,程序访问出