V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xap
V2EX  ›  PHP

网站 502/504 故障解决过程分享

  •  1
     
  •   xap · 2014-09-11 14:52:51 +08:00 · 9241 次点击
    这是一个创建于 3719 天前的主题,其中的信息可能已经有所发展或是发生改变。
    服务器是租的腾讯云,双核CPU,4G内存,只跑nginx+php(mysql是另租的db server)

    以前跑的一直很正常,最近几天用户反映经常502/504,等我接到消息打开网站时,又一切正常了!


    这不,又来了
    ssh到服务器上,第一件事儿是重启php,重启nginx
    然后刷新网站,正常了

    可是……没几秒钟,又502了

    再重启php,重启nginx……
    正常一会儿,又502……

    好吧,这次是重启大法没用了!

    查看nginx的error日志,发现有很多这样的日志出现
    upstream timed out (110: Connection timed out) while reading response header from upstream

    经过goolge大法,在 nginx.conf 配置里加上以下几行解决问题

    fastcgi_buffer_size 128k;
    fastcgi_buffers 6 128k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_intercept_errors on;

    可究竟是为什么恢复正常了,自己也不太明白(哪位大拿清楚请指点一下)

    我猜想原因是我们网站输出的html页面有几十k,默认的buffer不够大(是多大我也8晓得),于是php进程总是要读写硬盘导致速度过慢,于是响应不过来,堆积多了就卡502/504了……


    ———————— 一切正常的 分割线 ——————————

    过了几个礼拜,今儿上午又出现502/504了

    愁吖,这顽疾又来了
    再重启php,重启nginx……
    刷新网站……还是502……

    查看nginx的error日志,发现有很多这样的日志出现
    recv() failed (104: Connection reset by peer)
    connect() failed (111: Connection refused)

    咦,这是新的error日志喔

    再看php的error日志,发现网站挂掉的那个时间点有这么两行
    [11-Sep-2014 09:14:51] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 47 total children
    [11-Sep-2014 09:14:52] WARNING: [pool www] server reached pm.max_children setting (50), consider raising it

    再次启用google大法,不求甚解的修改了/etc/php-fpm.d/www.conf文件的这么几个参数
    pm.max_children = 100
    pm.start_servers = 30
    pm.min_spare_servers = 20
    pm.max_spare_servers = 70
    重启php、nginx后,一切恢复正常


    哪位大神给说说还有什么漏洞需要补上的么?以免以后502/504这两位大姨妈又来拜访……
    8 条回复    2014-09-12 12:24:08 +08:00
    kmvan
        1
    kmvan  
       2014-09-11 15:08:14 +08:00 via Android
    网站的流量有多少呢?
    msg7086
        2
    msg7086  
       2014-09-11 15:13:07 +08:00   ❤️ 2
    首先你要分析原因。原因不分析你说个

    首先是PHP的负载,如果你网站流量很大,PHP会吃满CPU,这时候妥妥的换好机器去。

    然后如果PHP没有吃满的情况下,多数就是PHP连接的第三方服务跟不上了,比如MySQL。

    MySQL的qps几乎就是看磁盘性能。像linode这样全SSD的机器,iops轻松上千,请求完全不会跟不上。但是普通硬盘的话,qps有个200那就是运气好,遇上共享HDD,qps跌破20都有可能。结果就是MySQL一堆排队的,PHP也要等着,然后就把PHP进程用光了,于是502/504就出来了。

    所以,先说说网站的流量和负载吧。
    aru
        3
    aru  
       2014-09-11 15:21:23 +08:00
    非常赞同 @msg7086 的看法,50个php进程不算少了,如果网站不是一天几十万pv的请求,那么就是程序的执行速度太慢了,很有可能受限于数据库等情况
    lzjun
        4
    lzjun  
       2014-09-11 15:30:12 +08:00
    持续关注
    xap
        5
    xap  
    OP
       2014-09-12 10:07:59 +08:00
    @msg7086

    服务器配置
    web server:CPU:2核 内存:4G
    top - 09:43:42 up 32 days, 18:05, ? users, load average: 0.17, 0.33, 0.35
    Tasks: 154 total, 1 running, 153 sleeping, 0 stopped, 0 zombie
    Cpu(s): 18.6%us, 1.1%sy, 0.0%ni, 79.4%id, 0.0%wa, 0.0%hi, 0.7%si, 0.2%st
    Mem: 4051060k total, 3862184k used, 188876k free, 396548k buffers
    Swap: 2097144k total, 92k used, 2097052k free, 667160k cached


    db server是购买的CDB服务,没写具体配置
    只有容量和建议访问次数指标,分别是100G、1500次/秒
    腾讯云提供的后台负载显示为:空间占有率12.5%,访问200多次/秒(峰值400多,远低于建议访问次数)



    网站跑的是一个游戏
    流量不高,每天1-2千人次
    平均在线估计100左右,人均操作估计4-5次/分钟左右吧(没用长连接,每次操作ajax
    连一次服务器)
    如果每次操作算一个pv的话,倒是达到了 @aru 说的一天几十万pv了……
    msg7086
        6
    msg7086  
       2014-09-12 10:36:41 +08:00
    每秒平均200qps挺大了其实。

    如果是远程mysql的话,问题会不会出在mysql的网络连接上?
    xap
        7
    xap  
    OP
       2014-09-12 11:30:40 +08:00
    @msg7086
    web、db server都是租的腾讯云,其间的网络连接应该不会有问题吧?
    我买的是一般的cdb服务,它最贵的cdb能支持7500次/秒

    问了下同事,做了下列操作
    netstat -nat |grep 1027 > netlog.text
    1027是db server的端口
    netlog.text 有3000多行,基本都是TIME_WAIT,只有1行ESTABLISHED

    同事说
    TIME_WAIT 表示刚断开不久的连接
    ESTABLISHED 表示正在执行中的连接

    又连续执行了5次
    netstat -nat |grep 1027 |grep ESTABLISHED
    2次1行
    1次2行
    1次5行
    1次0行

    我理解这表明到mysql db的网络连接是很顺畅的,应该可以排除这个问题
    msg7086
        8
    msg7086  
       2014-09-12 12:24:08 +08:00
    那就很难说了。如果db确实能够承受下这个数量的访问的话,那我也不清楚到底哪里有问题了。

    只能说等服务器出现502的时候再snapshot下系统状态才能知道了。

    毕竟平时很少会出现。不具有普遍性。甚至是短暂攻击导致502也有可能呢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2622 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:59 · PVG 12:59 · LAX 20:59 · JFK 23:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.