499为客户端请求超时主动断开后,NGINX日志中记录的状态码.笔者线上遇到一个问题,NGINX日志记录499,request_time记录为1s左右(即客户端的超时时间),php-fpm层记录的实际处理时间为10-20ms,产生了不一致,通过文章中的实验验证一下问题出自哪里.
WRK
安装
环境如下:
1 | [root@rh etc]# cat /etc/redhat-release |
- 安装wrkYUM源:yum install https://extras.getpagespeed.com/release-el7-latest.rpm
- 安装wrk :yum install wrk
使用
1 | [root@rh etc]# wrk |
php-fpm的配置
1 | pm = dynamic |
模拟配置,生产上比该值要大.
首先验证一个问题,我们在php代码逻辑中sleep 50s,并发10个请求,根据如上配置,php-fpm是有4个worker还是10个worker
1 | [root@rh matrix]# wrk -c 10 -d 30 -t 10 http://localhost/alloc |
可以看到是10个worker,请求结束后会变为4个.
看起来似乎跟php-fpm的配置没有关系.php-fpm是能够动态增加个数的.
模拟线上
线上情况是客户端1s的超时时间,那么我们可以如下设计实验,在php接口中sleep 900ms,然后设置请求持续时间为1s,看看实际情况:
1 | [root@rh fpm.d]# wrk -c 20 -t 20 -d 1 --latency http://localhost/alloc |
可以看到只执行成功4个请求,并不是如预料中所想的10个请求,看看nginx和应用的日志
1 | - - localhost [08/Sep/2019:08:37:33 +0800] "GET /alloc HTTP/1.1" 49 200 5 0.903 0.903 22 "-" "-" 127.0.0.1 "-" "-" |
大量的499 1s钟超时
应用层日志处理时间基本维持在900ms左右.并且应用层与nginx层日志数量都是24条
当然,调大php-fpm启动数量后可以请求的个数相应增加.读者可自行实验.
小结
动态配置看起来很美好,实际总是有时间开销(master统计,fork进程,监控并发).大并发场景建议还是使用static静态配好.
即使php-fpm处理不了所有请求,nginx还是会发送所有建立的连接并发送到php-fpm,占用资源