V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
kran
V2EX  ›  问与答

奇怪的 502 错误。

  •  
  •   kran · 2015-11-29 10:55:29 +08:00 · 2019 次点击
    这是一个创建于 3285 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近压测中被 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"
    
    21 条回复    2015-12-04 22:47:05 +08:00
    kn007
        1
    kn007  
       2015-11-29 11:03:45 +08:00
    php5.2.14 。。。。。。好老。。。

    尝试增加 php-fpm 进程数试试。
    kran
        2
    kran  
    OP
       2015-11-29 11:05:50 +08:00
    @kn007 版本已经没办法了,代码需要它。
    php 进程数已经是极限了,而且 256-512 都已经尝试过了。 8G 的内存。
    压力测试用的 jmeter , 200 线程、循环 100 次(这样的压力下对应进程应该是能处理的),错误在 1%~ 3%。
    kn007
        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
        4
    kn007  
       2015-11-29 11:10:44 +08:00
    @kran 其实提高 php 版本,不仅能提高效率也能解决一些意外的问题。。。
    当然,重构代码成本太高,那也没什么意义。看利益与实际。
    kran
        5
    kran  
    OP
       2015-11-29 11:14:26 +08:00
    @kn007 进程确实起来了,脚本是简单查库、更新操作,看 access log 其他 200 的请求都是在毫秒级别完成。 unix socket 我还没试。另一台同样配置的机器就是 0 错误,甚至是在压力是它几倍的情况下也是 0 错误。
    kran
        6
    kran  
    OP
       2015-11-29 11:15:41 +08:00
    @kn007 是呀,同机器上 php5.5 是没有 502 错误的。
    现在的情况也不允许我有那么多时间重构代码(基数太大)。
    kn007
        7
    kn007  
       2015-11-29 11:19:16 +08:00
    @kran 另外一台 0 错误,也是 php5.2.14 ,也是相同项目吗?

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

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

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


    @kran 对了,你有没有试试用 pm = static 。。。一开始就把进程分配了。。。
    xuhaoyangx
        20
    xuhaoyangx  
       2015-11-29 22:44:28 +08:00 via iPhone
    @kn007 只不过提高版本还是最好的选择, 5.2 现在漏洞挺多的,随便就能打挂了
    kran
        21
    kran  
    OP
       2015-12-04 22:47:05 +08:00
    @kn007 暂时已放弃,一直是 static , port+backlog 也没有效果,好忧伤。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3512 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:56 · PVG 18:56 · LAX 02:56 · JFK 05:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.