记一次流量爆发导致服务器无响应的记录

5月16日晚上7点40,发现hjdang.com的网页又打不开了。回去登陆腾讯云,发现是来自单一网页的Quark浏览器的流量大爆发,由/d/1776916731646734577带来

223.67.102.60 - - [17/May/2024:17:51:46 +0800] "GET /d/1776916731646734577 HTTP/1.1" 200 10362 "-" "Mozilla/5.0 (Linux; U; Android 12; zh-Hans-CN; WLZ-AN00 Build/HUAWEIWLZ-AN00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 **Quark/**6.12.0.550 Mobile Safari/537.36" "-""-”

User Agent带有Quark的这种

微信接口不响应,网页打不开。晚上7:50回家,发现12M网络饱和,内存耗尽,占用高,TCP连接数超过15000个。看后台发现运行 yunpan-web的nodejs的内存和cpu占用都很高,重启了服务不久后还是占用很高,12M的带宽100%。

一着急,花2000大洋升级服务器到4核16G14M,但还是一样,网络打满,TCP连接数还突破了2w,nodejs的内存和cpu占用高。

想解决TCP连接数高的问题

修改了机器的句柄数:ulimit -n 1000000, 没用

看nginx日志,发现1024 worker_connections are not enough,于是修改nginx.conf配置文件中的worker_connections = 5000 (原来为1024),并重启nginx或者nginx -s reload。没用。

用下面这个命令查看哪个进程的TCP连接数最多:

netstat -anp | awk '{print $7}' |sort | uniq -c | sort -k1 -nr

发现10000多个都在hjdang-web的nodejs 下面。

后来看到网上有人在问nodejs并发下发ajax请求的延迟很高

nodejs 请求接口在高并发下耗时很大,而单个请求非常快 - CNode技术社区 (cnodejs.org)

我也测了下自己在yunpan.js的接口,发现有的延迟竟然有10000多ms,原来TCP全部都堵塞在axios的调用上了!后来查看了下面代码,才发现原因。接口调用用的地址是https://web.hjdang.com,是外网,难怪延迟这么高,赶紧改掉。马上就恢复正常了.

原来不是服务器配置不够,是代码的bug!

这泼天的流量还是没能全部接住。

posted @ 2024-05-17 19:54  zjhgx  阅读(7)  评论(0编辑  收藏  举报