php-fpm慢日志slowl_og
设置可以让开发者很好的查找哪些php进程速度过慢而导致的网站问题,让开发者方便的找到问题的所在。该方法同样适用于排查nginx的500、502问题根源,当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时等。
参数设置
php-fpm.conf的配置文件中有一个参数request_slowlog_timeout
是这样描述的:
; The timeout for serving a single request after which a PHP backtrace will be dumped to the ‘slowlog’ file. A value of ‘0s’ means ‘off’.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
; request_slowlog_timeout = 0
1 | 1. 当request_slowlog_timeout设为一个具体秒时,比如request_slowlog_timeout =5,表示如果哪个脚本执行时间大于5秒,会记录这个脚本到慢日志文件中。 |
日志位置设置
慢日志文件位置默认在php的安装目录下的log文件夹中,可以通过修改slowlog = log/$pool.log.slow
参数来指定,如下,慢日志会记录下进程号,脚本名称,具体哪个文件哪行代码的哪个函数执行时间过长:
1 | [21-Nov-2013 14:30:38] [pool www] pid 11877 |
- request_slowlog_timeout 和 slowlog 需要同时设置
- 需要手动创建slowlog文件夹
日志说明
开启后,如果有脚本执行超过指定的时间,就会在指定的日志文件中写入类似如下的信息:
1 | [19-Dec-2013 16:54:49] [pool www] pid 18575 |
日志说明:
- script_filename 是入口文件
- curl_exec() : 说明是执行这个方法的时候超过执行时间的。
- exfilter_curl_get() :说明调用curl_exec()的方法
- exfilter_curl_get() 。
- 每行冒号后面的数字是行号
开启后,在错误日志文件中也有相关记录。如下
1 | [19-Dec-2013 15:55:37] WARNING: [pool www] child 18575, script '/home/web/htdocs/sandbox_canglong/test/tt.php' (request: "GET /test/tt.php") executing too slow (1.006222 sec), logging |
使用举例
问题一描述:
在一次nginx应用更新的灰度过程中,我们选取一台nginx上线,观察接下来的半小时内,nginx占用内存不断增大,直到耗尽系统资源。
问题一排查步骤:
- 排查error_log中并没有错误信息;
- 监控发现新上线的nginx流量大增;
- 分析access_log发现新上线的nginx的QPS是原机器的6~8倍。
- 证实是Keepalived导致流量负载不均衡。LVS作为负载均衡时,后端的nignx配置的keepalive_timeout时间有差异导致。
LVS的负载均衡是TCP层的,只能做连接的均衡,如果Keepalive时间设置的超长,会导致路由到这个连接的请求越多
问题二描述:
nginx做反向代理,有时发现某些接口较慢,通常都在3s左右。
问题二排查步骤:
- 配置nginx的access log记录upstream_response_time
- 分析发现响应大约3s多。
- 分析后端的access_log,处理时间都在毫秒级别。这说明问题是由于nginx跟后端connect较慢导致
参考博客: