标准答案
- 计算热点通常在 profile 中出现稳定的业务函数或算法栈,吞吐和输入规模有相关性。
- 自旋和锁竞争会出现大量线程在同步原语附近消耗 CPU,成功工作比例下降。
- 重试风暴表现为请求量、下游错误、客户端重试和业务重复操作同时上升。
- 先限流、关闭无效重试或降低非核心工作,再用 CPU profile、锁指标和调用链验证根因。
题目解析
CPU 接近 100% 先要判断这些 CPU 是否转化成有效业务工作。算法热点通常与输入量和成功吞吐相关,自旋和锁竞争会让 CPU 消耗增加但完成量下降,重试风暴则伴随下游错误和请求倍增。
采样 profile、线程状态、锁等待、GC、序列化和调用链重试记录要放在同一时间窗口分析。只看主机 CPU 平均值,无法区分一个高效计算热点和大量无效循环。
止血时可以暂停无效重试、降低非核心任务和限流,但长期方案要修复热点算法、锁粒度、单分片或调用链策略。扩容只有在工作可以分散且下游也有容量时才有效。
常见误区
- 误区:看到 CPU 高就立即加机器。改正:先确认热点是否可横向分散,以及 CPU 是否被自旋、锁竞争或重试消耗。
- 误区:只看平均 CPU 不看线程栈。改正:结合 profile、线程状态、GC 和锁指标定位具体消耗。
- 误区:不先停止重试风暴就扩容。改正:先限制放大源和非核心工作,再评估扩容是否能提高有效吞吐。