脉冲流量不是洪水,是系统的心跳?复盘一次把我吓醒的流量尖峰

🔑 关键词:脉冲流量,突发流量,流量尖峰,服务器限流,流量分析

📖 摘要:一次凌晨的流量尖峰让服务器几近失联。脉冲流量到底要不要拦?本文用一次真实复盘告诉大家,脉冲并非全是坏事,可能是系统心跳,也可能只是运维留的坑。

凌晨两点十六分,手机响了。准确说,是nagios先给的信号,然后微信群里直接炸了。抓起手机看一眼面板,入站带宽刚好一个尖尖的脉冲,像公鸡打鸣头一点那种,从几百K直接蹦到九万多,存活时间不到三分钟又落回去。第一反应想骂人,第二反应觉得哪里不对劲。

图片

讲道理,这才是标准的“脉冲流量”。以前谁教程里都爱解释成瞬时高峰,没什么新意,数据包里一看,又有点像一堆肉鸡拿你当厕所,抽一下走了。可是更常见的场景呢?是你自己半夜维护脚本忘了限速,比如某台测试机rsync仓库时把出口打光了,尖峰一过,啥事没有。这种流量有个明显特征:没有持续性,失真是瞬间的,普通流量监控很难第一时间逮住它,平均流量图上面几乎看不出来,但实际已经让核心路由器堵了一哆嗦。

图片

这里头有个非常坑的地方:大家总拿平均值来评估容量。平均值真不是个好东西,尤其在这种脉冲场景里。比如一秒脉冲200M,五分钟一循环,平均值可能只有20M,但交换机的缓冲队列扛不住啊,超过包缓冲直接丢。你以为带宽留够了?其实差得远。容量规划要是不看P99或者瞬时最大值,只靠平均带宽来买机器,什么时候被冲垮都不奇怪。有一次我把一天流量按15分钟粒度导出来看了下,80%时间段带宽使用低于1G,但每天总有那么几个点是直接打到上限九千九百多兆,要不是运营商没限制,晚上业务早就瘫了。

图片

后来偶然翻到一篇讲心电图的文章,才发现脉冲在生物医学里是另外一种意思——血流就不是匀速的,永远是“收缩→舒张”这样一个周期里的喷涌。网络流量要是太匀了反而说明没真业务,全是潮汐式或者突然涌来,有点波峰反而是活力。重点不是去波,而是要搞清楚波从哪来:同样抖一下,爬虫定时爬和业务放量不是一回事,促销秒杀和黑客试探也不是一回事。脉冲本身就是一个信息,只会限流封IP的话,等于把线索引信手扔了。

图片

拿真实案例来说,上次那个尖峰我去查了,发现不是攻击,是核心应用每个整点会自动拉一次报表数据,每次拉取超过11万条记录,那会儿数据库CPU和IO都跳高,前端请求直接排队。后来在nginx层加了个limit_req,令牌桶burst只敢给到不超过20的宽度,再加层缓存就顺了。结果这里头还踩了个坑,把页面缓存设成固定600秒,客户端每次更新完看到旧数据又吵着说没刷新。改成后台主动刷新缓存,只在写库后更新一次Key,流量反而平滑多了。

图片

写到后头,说点我的独立看法:别动不动把脉冲流量当洪水猛兽,它其实更像系统的心跳。当整个系统都快匀速前进的时候,偶尔来一阵脉冲,其实是一种值得记录的异常状态。追根溯源,往往能找到业务里的隐性任务、恶搞脚本或者配置失当,处理好了反而是稳定性的加分项。反过来,靠脚本死命把它压平,那不叫优化,是把线索直接埋了。真没有绝对平滑的流量,尤其在中小规模系统里。你看到的那些平直的监控线,要么是大厂流量被削过峰了,要么是监控粒度太粗看不见。脉冲,是我们感知业务呼吸的一种方式。信不信由你,反正我现在凌晨看到尖峰,第一反应是有案子,而不是完蛋了,端杯茶开个tcpdump看个究竟,事情往往就有答案了。

图片