码迷,mamicode.com
首页 > 其他好文 > 详细

论坛---挂掉的思考

时间:2014-11-06 12:56:52      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:style   http   io   sp   strong   文件   数据   on   2014   

某天,某dz论坛整站垮掉,事后分析:遭遇cc攻击,非常多的肉机(不同IP)对该论坛某个特定的url进行访问,造成整站瘫痪。

 

教训:

如果遇到整站瘫痪,我们应该怎么办?

1,测试静态页面,检测web-server是否正常,通常是正常的

2,测试php页面,检测php是否正常,两种状态都有可能,大部分是正常的,少数情况异常

3,手工连接数据,测试连通性,执行show processlist,查慢sql

4,查access-log,慢请求肯定会在access-log中体现,这个很重要

因为请求慢才会造成后续请求阻塞进而出现问题,如果请求足够快就不会产生等待,不会阻塞php进程。

请求慢的原因

可能1:php跑满了,请求被饿死(深层原因还是请求慢,这是表象);

可能2:应用程序内部逻辑问题,有互锁,死循环,函数处理慢要优化(注意,内存溢出不属于此类);

可能3:io阻塞(写文件慢,目前未碰到过),sql慢(因为sql必须等待执行结束才会返回,未结束会一直等待,即使客户端主动断开,mysql有可能还会一直执行,sql慢是碰到最多的,一旦整站出问题,肯定是因为mysql)

另,内存溢出一定会报php错误,会被记录在php错误日志中,会返回500的错误,只会影响单次执行,不会影响后续请求。

怀疑点:对于一个执行时间很长的php进程,是否会有access-log呢?

access-log已经多次为排查事故原因做出了贡献,我们根据access-log来还原下这次cc攻击下webserver和系统的表现。

攻击开始,少量攻击请求被处理,请求能被响应。很不幸,这个没有发生

1,攻击开始,大量的攻击请求打过来,瞬间塌陷,响应全部超过30秒,返回499状态码

a:10:45:48到10:46:50,单台机器的攻击请求数是50个/秒,从第一秒开始所有php请求均响应失败返回499(30秒超时客户端主动断开连接),图片请求正常,status也返回499(设定的是5秒超时)。这段时间内lvs已经知道前端机无法响应php请求了,但是没做下线处理

b:10:46:50,lvs认为前端机确实有问题,执行下线操作,一直到10:51:13才有新的请求。在此期间,一直有status心跳探测。我们看到了这样的日志:

[30/Oct/2014:10:46:56 +0800] "GET /status.php HTTP/1.1" 504 182 "-" "-" 50 60.002 -

[30/Oct/2014:10:46:56 +0800] "GET /thread-3029964-1-1.html HTTP/1.1" 504 ... 60

[30/Oct/2014:10:46:56 +0800] "GET /status.php HTTP/1.0" 499 0 "-" "KeepAliveClient" 82 5.000 -

分析:第三条日志,5秒+499,是正常的status脚本检测,超时时间是5秒;

第一条日志为什么会是60秒超时呢,解释如下:

同时,注意到status.php在10:46:39有条日志, "GET /status.php HTTP/1.1" 504 182 "-" "-" 50 60.003

合理的解释:已经被php接收,但是一直无法得到执行,被卡死,php设置的执行超时60秒到期后退出。(access-log是在执行结束后记录的,实际请求时间=日志时间减去执行时间)

那么这样就容易解释第二条日志了,和第一条日志一样,到了php执行队列,但被饿死。可以看到,超时时间是60秒,请求时间是10:45:56,请求是在cc攻击之后发生的,cc攻击之后php分两部分,一部分(猜测没有进入php执行队列)被客户端断开返回499,另一部分(进入了php执行队列)被调度和饿死返回504。

 

论坛---挂掉的思考

标签:style   http   io   sp   strong   文件   数据   on   2014   

原文地址:http://www.cnblogs.com/helww/p/4078256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!