奇怪的 502 错误。

2015-11-29 10:55:29 +08:00
 kran
最近压测中被 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"
1999 次点击
所在节点    问与答
21 条回复
kn007
2015-11-29 11:03:45 +08:00
php5.2.14 。。。。。。好老。。。

尝试增加 php-fpm 进程数试试。
kran
2015-11-29 11:05:50 +08:00
@kn007 版本已经没办法了,代码需要它。
php 进程数已经是极限了,而且 256-512 都已经尝试过了。 8G 的内存。
压力测试用的 jmeter , 200 线程、循环 100 次(这样的压力下对应进程应该是能处理的),错误在 1%~ 3%。
kn007
2015-11-29 11:08:48 +08:00
@kran 你 php 处理的是什么,一般 php 一次处理需要多少时间?

我 40 个进程, 4G ,从来没 502 。。。。 502 一般出现, php-fpm 不够用。要么就是脚本执行时间过长,导致不够用,要么就是进程数够多,但创建不了,也没用,我看你用的 port ,尝试使用 unix socket ,而不是 port 。或许同时请求 port 被阻塞了(我想象的)。
kn007
2015-11-29 11:10:44 +08:00
@kran 其实提高 php 版本,不仅能提高效率也能解决一些意外的问题。。。
当然,重构代码成本太高,那也没什么意义。看利益与实际。
kran
2015-11-29 11:14:26 +08:00
@kn007 进程确实起来了,脚本是简单查库、更新操作,看 access log 其他 200 的请求都是在毫秒级别完成。 unix socket 我还没试。另一台同样配置的机器就是 0 错误,甚至是在压力是它几倍的情况下也是 0 错误。
kran
2015-11-29 11:15:41 +08:00
@kn007 是呀,同机器上 php5.5 是没有 502 错误的。
现在的情况也不允许我有那么多时间重构代码(基数太大)。
kn007
2015-11-29 11:19:16 +08:00
@kran 另外一台 0 错误,也是 php5.2.14 ,也是相同项目吗?

尝试 unix socket 或许是个好主意,记得加大文件打开数的值。

老代码重构一直是个沉重的话题, 233333
kran
2015-11-29 11:22:43 +08:00
@kn007 机器硬件和软件以及各种配置都是一样的。这也是让人无奈的地方。
那之后我尝试下用 unix socket ,文件打开数和另一台也一样,崩溃,我要变身运维了。
接手老代码同样是充满血泪的话题。。
kn007
2015-11-29 11:23:47 +08:00
@kran 无能为力,只能靠自己了
kran
2015-11-29 11:24:42 +08:00
@kn007 感激涕零~
boro
2015-11-29 11:26:09 +08:00
你做过 php-fpm 和 nginx 优化,并修改过相关配置参数?
kran
2015-11-29 11:29:22 +08:00
@boro 嗯。。肯定是调整过一些参数了,但几乎都没有作用( 10s , 3s 的问题一直出现)。
比如: request_terminate_timeout, fastcgi_connect/read/send_timeout 等等。
有哪些相关的参数我需要尝试?
mikuazusa
2015-11-29 11:36:16 +08:00
感觉也是 php-fpm 配置问题,如果有一台机器能稳定重现,那逐个逐个组件去排查比较应该能找到问题
xuhaoyangx
2015-11-29 13:02:38 +08:00
@kn007 用 uninx socket 错误率会更高
boro
2015-11-29 13:13:20 +08:00
@kran 当时我没办知道确切是那里的问题,就把修改过的参数,一个个调一遍。就是这样的笨方法解决的。具体那个参数,这个的看你的修改的是那些了。
kn007
2015-11-29 13:45:24 +08:00
@xuhaoyangx 或许吧,我一直是 unix socket ,这么多年,没错误过。起码没 502
xuhaoyangx
2015-11-29 21:29:50 +08:00
@kn007 别人测试过,我记得是 php-fpm 内部的错误率。你可以谷歌下
kn007
2015-11-29 21:52:23 +08:00
@xuhaoyangx 你说的不会是高压下的 unix socket 错误吧?在 I/O 不高的情况下是不会出现的。
kn007
2015-11-29 22:04:57 +08:00
@xuhaoyangx port 在高并发可能更稳定,但目前是在 port 情况出现,就还不如换 unix socket 换取更好的性能。
而且记得如果是因为 socket 原因出错的 502 ,提示是不会出现 recv() failed 的。。

总而言之,控制进程数在合理范围,不要过多或过少,而且尽量采取静态分配的方式,动态在高并发时,根本来不及加,而且也容易被杀。


@kran 对了,你有没有试试用 pm = static 。。。一开始就把进程分配了。。。
xuhaoyangx
2015-11-29 22:44:28 +08:00
@kn007 只不过提高版本还是最好的选择, 5.2 现在漏洞挺多的,随便就能打挂了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/239754

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX