先看一个可操作的分界:把同一时刻的请求分成“静态资源”和“动态请求”两类,再对比它们的失败模式。如果静态资源(图片、CSS、JS)也大面积变慢或超时,通常指向资源压力(带宽、连接数、磁盘或后端进程被占满);如果静态资源正常,只有带参数、带会话或需要查询数据库的请求变慢或报错,则更可能是配置错误(缓存规则、超时值、并发上限、重写规则)在突增流量下被放大。这个判断不依赖任何单一指标,而是靠“哪一类先坏”来定位。
访问量突增时,最容易误判的是把“所有请求都慢”当成同一个原因。实际可以先看三个可区分证据:
需要说明的是,请求量归零或某项监控指标突然下降,并不能单独证明处理正确。它也可能是采集延迟、日志采样变化或上游缓存命中造成的,必须结合错误码和路径分布一起看。
两种做法都成立,但前提不同。
选择先扩容的条件:静态资源与动态请求同时变慢,且服务器 CPU、内存、连接数或带宽确实接近上限;近期没有改动过缓存、重写、超时或并发相关配置。此时扩容能立即缓解,代价是成本上升,并且如果根因其实是配置错误,扩容只会把问题推迟到下一次突增。
选择先回滚配置的条件:突增前刚调整过缓存规则、超时时间、并发上限、重写规则或反向代理配置;错误集中在特定路径;静态资源仍然正常。此时回滚的代价是可能暂时放弃刚做的优化,但能快速确认因果关系。回滚后如果动态请求恢复正常,就可以把配置错误作为主因继续排查,而不是继续加机器。
一个假设例子:某站点在活动开始后动态接口大量 502,静态图片正常。先回滚最近一次超时配置,502 消失;随后再逐步提高超时值并观察,而不是一次性恢复原值。这个动作的价值在于把“配置错误”和“资源压力”分开验证,避免同时改动两个变量。
缓存层在突增期间既是保护也是干扰。保留它的前提是:缓存命中率在突增前后没有明显下降,且被缓存的路径返回内容一致。此时缓存仍在吸收静态和可缓存动态请求,不应贸然关闭。
绕过缓存直接回源的前提是:怀疑缓存规则把不同用户或不同参数混在一起,导致部分请求命中错误内容或频繁回源。绕过后的代价是源站压力立即上升,因此只适合在流量可控的短窗口内做,并且要同时观察源站连接数和错误码变化。如果绕过缓存后错误消失,说明问题在缓存配置;如果错误依旧,则更偏向源站资源或后端配置。
继续观察适用于:错误率仍在可接受范围,静态资源未受影响,且已有自动扩容或队列缓冲。此时贸然限流可能把正常用户挡在外面,代价是损失访问。
立即限流适用于:后端进程已接近崩溃、数据库连接池耗尽、错误开始扩散到静态资源。限流的代价是部分请求被拒绝,但它能保住核心路径。限流后要记录被限流的路径和比例,因为如果被限流的全是静态资源,说明限流规则本身可能配错了位置。
无论选择哪条路径,下一步都应基于“哪一类请求先坏”来决定:静态先坏,优先查带宽、连接数和进程资源;动态先坏且集中在特定路径,优先查缓存、超时、重写和并发配置。回滚或扩容之后,不要立刻恢复所有改动,而是逐项恢复并观察同一组指标。这样即使下一次突增再次出现,也能用同样的分流方法快速定位,而不是在资源压力和配置错误之间反复猜测。