概述
线上一套微服务里的移动端查询接口突然”忽快忽慢”:快的时候几十毫秒返回,慢的时候要等上秒级,而且同一个接口、同样的参数,前后两次请求表现完全不同。服务是双副本部署,监控大盘上宿主机 CPU 长期 90% 以上空闲——看起来谁都不缺资源。
- 故障现象:同一查询接口延迟呈双峰分布(几十 ms / 秒级),双副本中一个 pod load 6+、三十个线程处于运行态,另一个 pod load 0.5、全部休眠;
- 根因:Pod 的 CPU limit 只有 0.4 核(
cpu.cfs_quota_us=40000/100000),繁忙副本在 38.8% 的调度周期里打穿 CFS 配额被整体冻结,所有业务线程以 100ms 为台阶周期性停摆; - 关键反直觉点:该 pod 平均 CPU 用量只占配额的 25%,”平均很闲”与”高频被限流”并不矛盾——限流看的是峰值,不是均值。
调大 limit 后 nr_throttled 归零、接口延迟恢复平稳。这篇复盘记录完整排查路径,以及两个值得单独记录的坑:top 的 TIME+ 单位误读(差 60 倍),和容器里没有 jcmd/jstat 时的取证替代。文末后记补充同日把排查铺向全集群后的发现:这不是一个服务的病,是整个集群的系统性配额问题。