PHP网站打开太慢,用slow log追踪具体文件和函数

原因有太多可能,比如代码改动、异常访问、网络波动、服务器硬件故障等等。

引起性能问题的原因有这么多,那如何定位呢?

给大家介绍一个性能追踪的方法,这个方法在我运维职业生涯里屡试不爽,帮了我不少大忙。

                                       — 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.log
request_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 6368
script_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
https://blog.51cto.com/14199566/2382732

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章