最近压测中被 502 问题搞的头大,请大家帮忙看看(都发生在压力上升期,服务器压力不大):
1. connection reset by peer 发生在 php 脚本执行 10 秒
2. connection timed out 发生在连接 php 后端 3 秒
以上两个错误时间都是在 access log 的 request_time 中看到的,很有规律。
但是,当我写一个执行时间超过 10 秒钟,在单独访问(无压力)状况下,不会报错。
发生 502 错误时, php 本身是没有报错的,都执行成功。
以上就是能知道的现象了,不知道该怎么进行下一步。
服务器环境是: centos6,kernel(2.6.32), php5.2.14, php-fpm 模式, nginx1.6.3
Access log:
[28/Nov/2015:14:41:08 +0800] "GET /ben2.php HTTP/1.1" 502 172 "-" "Apache-HttpClient/4.2.6 (java 1.5)" "-" 3.000
[28/Nov/2015:14:41:11 +0800] "GET /ben2.php HTTP/1.1" 502 172 "-" "Apache-HttpClient/4.2.6 (java 1.5)" "-" 10.000
Error log:
2015/11/28 14:41:08 [error] 12981#0: *798215 connect() failed (110: Connection timed out) while connecting to upstream, client: xx.xx.xx.xx, server: xx.xx.xx, request: "GET /ben2.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xx.xx.xx"
2015/11/28 14:41:11 [error] 12981#0: *798323 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xx.xx.xx.xx, server: xx.xx.xx, request: "GET /ben2.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xx.xx.xx"
1
kn007 2015-11-29 11:03:45 +08:00
php5.2.14 。。。。。。好老。。。
尝试增加 php-fpm 进程数试试。 |
2
kran OP @kn007 版本已经没办法了,代码需要它。
php 进程数已经是极限了,而且 256-512 都已经尝试过了。 8G 的内存。 压力测试用的 jmeter , 200 线程、循环 100 次(这样的压力下对应进程应该是能处理的),错误在 1%~ 3%。 |
3
kn007 2015-11-29 11:08:48 +08:00
@kran 你 php 处理的是什么,一般 php 一次处理需要多少时间?
我 40 个进程, 4G ,从来没 502 。。。。 502 一般出现, php-fpm 不够用。要么就是脚本执行时间过长,导致不够用,要么就是进程数够多,但创建不了,也没用,我看你用的 port ,尝试使用 unix socket ,而不是 port 。或许同时请求 port 被阻塞了(我想象的)。 |
4
kn007 2015-11-29 11:10:44 +08:00
@kran 其实提高 php 版本,不仅能提高效率也能解决一些意外的问题。。。
当然,重构代码成本太高,那也没什么意义。看利益与实际。 |
5
kran OP @kn007 进程确实起来了,脚本是简单查库、更新操作,看 access log 其他 200 的请求都是在毫秒级别完成。 unix socket 我还没试。另一台同样配置的机器就是 0 错误,甚至是在压力是它几倍的情况下也是 0 错误。
|
7
kn007 2015-11-29 11:19:16 +08:00
|
8
kran OP @kn007 机器硬件和软件以及各种配置都是一样的。这也是让人无奈的地方。
那之后我尝试下用 unix socket ,文件打开数和另一台也一样,崩溃,我要变身运维了。 接手老代码同样是充满血泪的话题。。 |
11
boro 2015-11-29 11:26:09 +08:00
你做过 php-fpm 和 nginx 优化,并修改过相关配置参数?
|
12
kran OP @boro 嗯。。肯定是调整过一些参数了,但几乎都没有作用( 10s , 3s 的问题一直出现)。
比如: request_terminate_timeout, fastcgi_connect/read/send_timeout 等等。 有哪些相关的参数我需要尝试? |
13
mikuazusa 2015-11-29 11:36:16 +08:00 via iPhone
感觉也是 php-fpm 配置问题,如果有一台机器能稳定重现,那逐个逐个组件去排查比较应该能找到问题
|
14
xuhaoyangx 2015-11-29 13:02:38 +08:00 via iPhone
@kn007 用 uninx socket 错误率会更高
|
15
boro 2015-11-29 13:13:20 +08:00
@kran 当时我没办知道确切是那里的问题,就把修改过的参数,一个个调一遍。就是这样的笨方法解决的。具体那个参数,这个的看你的修改的是那些了。
|
16
kn007 2015-11-29 13:45:24 +08:00
@xuhaoyangx 或许吧,我一直是 unix socket ,这么多年,没错误过。起码没 502
|
17
xuhaoyangx 2015-11-29 21:29:50 +08:00 via iPhone
@kn007 别人测试过,我记得是 php-fpm 内部的错误率。你可以谷歌下
|
18
kn007 2015-11-29 21:52:23 +08:00
@xuhaoyangx 你说的不会是高压下的 unix socket 错误吧?在 I/O 不高的情况下是不会出现的。
|
19
kn007 2015-11-29 22:04:57 +08:00 1
@xuhaoyangx port 在高并发可能更稳定,但目前是在 port 情况出现,就还不如换 unix socket 换取更好的性能。
而且记得如果是因为 socket 原因出错的 502 ,提示是不会出现 recv() failed 的。。 总而言之,控制进程数在合理范围,不要过多或过少,而且尽量采取静态分配的方式,动态在高并发时,根本来不及加,而且也容易被杀。 @kran 对了,你有没有试试用 pm = static 。。。一开始就把进程分配了。。。 |
20
xuhaoyangx 2015-11-29 22:44:28 +08:00 via iPhone
@kn007 只不过提高版本还是最好的选择, 5.2 现在漏洞挺多的,随便就能打挂了
|