先给一个有条件的结论:如果突增期间所有动态请求一起变慢、静态资源仍然稳定,优先怀疑资源压力;如果只有某一类路径、某个状态码或某种客户端变慢,而其余流量正常,优先怀疑配置错误。这个判断只在你能把“同一时间窗内的不同类型请求”分开观察时成立,否则两类原因会互相掩盖。
资源压力指CPU、内存、数据库连接、带宽或上游依赖达到瓶颈后,所有依赖该资源的请求一起退化。它的关键特征不是慢的绝对值,而是相关性:动态页面、接口、登录、搜索几乎在同一分钟开始变慢,静态文件因为走缓存或独立通道仍然正常。
可操作的区分动作:按分钟统计各路径的响应时间中位数和错误率,再对照同一分钟的并发数或请求量。如果并发上升与多类请求同时退化高度同步,资源压力的解释力更强。反过来,如果并发上升但只有一条路径退化,压力解释就不充分。
需要注意一个反例:共享上游依赖也会造成“同时变慢”。例如数据库、缓存、对象存储或第三方接口本身先出问题,你的服务器资源并不紧张,但所有依赖它的请求一起变慢。此时把并发数降下来也不会恢复,因为瓶颈不在你的机器上。要排除这种情况,需要看上游依赖自己的延迟和错误指标,而不是只看本机CPU。
配置错误包括连接池上限、超时时间、重试次数、缓存规则、反向代理缓冲区、限流阈值、路径重写等设置不当。它们的共同特征是选择性:只影响特定路径、特定状态码、特定客户端,或者在请求量超过某个阈值后才出现。
可区分的原因证据包括:
这些信号更指向配置边界,而不是单纯的资源不足。但要注意,配置错误和资源压力可以叠加:连接池太小在低流量下无害,在高流量下会放大资源等待,看起来像资源不足。此时要分别调整连接池上限和机器规格,观察哪一个先改变错误曲线。
假设某站在一次活动期间访问量翻倍,监控显示动态页面平均响应从200毫秒升到2秒,静态图片仍在50毫秒左右。同时,504错误集中在搜索接口,登录和下单接口只是变慢但没有报错。
按前面的判据:静态稳定、动态整体变慢,说明资源压力可能存在;但错误只集中在搜索接口,又说明配置或该接口的依赖有独立问题。下一步动作不是直接扩容,而是先把搜索接口的查询耗时、连接池等待时间和上游依赖延迟单独拉出来。如果搜索接口的等待时间随并发线性上升,而其他接口的等待时间平稳,那么优先修配置或该接口的资源隔离;如果所有接口的等待时间同步上升,再考虑整体扩容。
这个例子的边界是:它假设你能拿到分路径、分状态码的分钟级指标。如果只有整站平均响应时间,上面的区分方法不成立,因为平均值会把两类原因混在一起。
缓存配置错误或缓存击穿会让大量请求同时穿透到后端,表现为动态请求一起变慢。这看起来像资源压力,实际触发点是缓存规则或过期策略。重试逻辑同样如此:客户端或代理在超时后自动重试,会成倍放大请求量,让原本的配置问题升级为资源压力。
区分方法是看请求量的来源:如果后端收到的请求数远高于前端实际用户请求数,重试或缓存穿透的解释力更强;如果请求数与用户量基本一致,资源压力的解释力更强。这个判断依赖请求计数口径一致,否则会误判。
不要在没有对照的情况下直接扩容或改配置。先做三件事:
拿到这三组数据后,如果多类请求同步退化且请求数没有异常放大,优先处理资源压力;如果只有特定路径或状态码失效,优先检查配置边界和依赖。每次只改一个变量,观察错误曲线是否随之改变,再决定下一步是扩容、调参还是修依赖。这样即使第一次判断错了,也能从对照数据里看出是哪一类原因在起作用。