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

2014-09-11 14:52:51 +08:00
 xap
服务器是租的腾讯云,双核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这两位大姨妈又来拜访……
9278 次点击
所在节点    PHP
8 条回复
kmvan
2014-09-11 15:08:14 +08:00
网站的流量有多少呢?
msg7086
2014-09-11 15:13:07 +08:00
首先你要分析原因。原因不分析你说个

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

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

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

所以,先说说网站的流量和负载吧。
aru
2014-09-11 15:21:23 +08:00
非常赞同 @msg7086 的看法,50个php进程不算少了,如果网站不是一天几十万pv的请求,那么就是程序的执行速度太慢了,很有可能受限于数据库等情况
lzjun
2014-09-11 15:30:12 +08:00
持续关注
xap
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
2014-09-12 10:36:41 +08:00
每秒平均200qps挺大了其实。

如果是远程mysql的话,问题会不会出在mysql的网络连接上?
xap
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
2014-09-12 12:24:08 +08:00
那就很难说了。如果db确实能够承受下这个数量的访问的话,那我也不清楚到底哪里有问题了。

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

毕竟平时很少会出现。不具有普遍性。甚至是短暂攻击导致502也有可能呢。

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

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

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

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

© 2021 V2EX