问题描述
最近有个活动放出去后,发现访问量非常大,导致服务器负载很高
和产品确认后,得知推送的用户并不多,大约6W,而nginx日志中的记录却有96W
排查流程
2015.12.23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 1.top查看负载、cpu和内存 如果发现高负载、低cpu和内存,那么可能是请求量过大的问题
2.查看近几分钟的并发量,和上一日进行对比: cat /usr/local/nginx/logs/activity.access.log|awk '($4>="[23/Dec/2015:09:00:00" && $4 <= "[23/Dec/2015:09:50:00"){x++}END{print x/(50*60)}' cat /usr/local/nginx/logs/activity.access.log.1|awk '($4>="[22/Dec/2015:09:00:00" && $4 <= "[22/Dec/2015:09:50:00"){x++}END{print x/(50*60)}' 如果发现并发量异常,需要统计异常的用户和IP
3.统计每个uri的请求量: php statFlow.php -f /usr/local/nginx/logs/activity.access.log -t /home/zhouchangju/statFlow/ -s n -p 通过这一步,定位到异常的uri,比如这次是/cfxf/egg2016/index/
4.统计异常的用户(cookie userid): (sort性能消耗极大,千万别在盘中使用。可以将日志文件拷贝到测试服务器查看): cat /usr/local/nginx/logs/activity.access.log|awk '($7~/cfxf\/egg2016\/index/){print $12}'|sort |uniq -c|sort -nrk1|more
5.统计异常的IP: (sort性能消耗极大,千万别在盘中使用。可以将日志文件拷贝到测试服务器查看): cat /usr/local/nginx/logs/activity.access.log|awk '($7~/cfxf\/egg2016\/index/){print $(NF-1)}'|sort |uniq -c|sort -nrk1|more
6.临时添加IP黑名单,并增加squid缓存: if ($http_x_forwarded_for ~ '172.20.1.91|172.20.1.205') { return 403; }
|
2015.12.24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| 针对这次的问题,分析了异常请求的特点,发现: 1.请求首页6次以上的IP有4500多个 2.异常请求的$http_referer都是首页自身 3.$user_agent中,近99%的异常请求都来自Chrome浏览器 4.异常请求中,也包含极少的砸金蛋请求,说明是有用户在操作的 从日志来看,不像是人为发起的请求,更像是我们的程序在部分使用Chrome的用户电脑上出现问题,导致了页面不断刷新。
按照时间顺序观察了部分异常用户的请求,发现一个规律:用户都是正常进入页面,执行登录操作,然后正常砸金蛋,再经过一个时间空隙后,就开始不停发送首页请求了,详见附件图片。
猜测这里可能有两个原因: 1.用户手动刷新了页面,然后sso登录出问题 2.用户点击了页面上某个功能(从日志中来看,一旦循环请求,除了首页请求之外,就没有其他的url了,因此这里点击的,一定是项目之外的功能,即登录或者手机验证)后出问题
目前尚未确定具体原因,针对这两个问题,先做如下处理: 1.修改登录流程 目前的登录流程: 活动首页没登录 弹出iframe登录窗,url中传入http://activity.10jqka.com.cn/reloadroot.html 登录成功后,iframe内的登录页面会跳转到http://activity.10jqka.com.cn/reloadroot.html http://activity.10jqka.com.cn/reloadroot.html触发父窗口刷新 父页面刷新后,会调用sso,如cookie写入失败,会再次触发sso,调用http://activity.10jqka.com.cn/reloadroot.html,触发父窗口刷新,然后进入死循环 (由于reloadroot.html有缓存,因此日志中统计到的reloadroot.html请求很少,统计到的首页请求非常多)
现在已由李晓栋更改为: 活动首页没登录 弹出iframe登录窗,url中传入http://activity.10jqka.com.cn/reloadroot.html 登录成功后,iframe内的登录页面会跳转到http://activity.10jqka.com.cn/reloadroot.html http://activity.10jqka.com.cn/reloadroot.html执行sso操作,sso操作不执行任何回调 活动首页有一个定时器,会每隔一段时间会从cookie中查询用户ID,获取成功后,即请求我们这边的数据,渲染页面
2.修改了对于手机验证框的事件监听,去掉刷新功能
明天盘中推送活动时,我们再关注下,看看是否能够定位到具体原因。
|

2015.12.24
1
| 经过代码检查和日志分析,最终头儿定位到问题是js中的setInterval没有clearInterval,每隔100毫秒会请求一次,在用户网速较慢的情况下,就会不断发送请求。
|
总结
1.活动首页,一定要将动态数据独立出去,并设置squid缓存
2.活动项目的存储方案,需要考虑下,是否应该改为nosql
3.运维工具需要实践学习,以提升解决问题的速度
4.耐心分析日志,从共性中寻找原因
5.先从自身找原因