努力
加油

服务器CPU使用率达到多少需要引起注意?

这个问题没有唯一的“标准答案”,因为 CPU 使用率只是一个表象,背后的业务类型、架构设计和预期目标决定了什么样的数值是“健康”的,什么是“危险”的。

在阿里云、腾讯云等国内主流云厂商的运维实践中,我们通常不会只看一个绝对值,而是结合基线(Baseline)、峰值和持续时间来综合判断。

以下是基于不同场景的详细拆解:

1. 通用经验法则(仅供参考)

如果非要给出一组粗略的红绿灯指标,大致如下:

  • < 60%:绿色区间。大多数情况下这是健康的,留有充足的缓冲空间应对突发流量。
  • 60% – 80%:黄色预警区。需要关注趋势。如果是长期稳定在这个区间,说明资源利用率较高,性价比不错;但如果是在业务低峰期也达到这个水平,或者正在缓慢上升,就需要排查是否有内存泄漏、死循环或异常进程。
  • > 80%:红色警戒区。必须介入。此时系统响应时间可能会开始变长,队列堆积风险增加。对于高并发服务,这已经是高危状态。
  • 持续 > 95%:严重故障/濒临崩溃。除非你有极其特殊的实时计算需求且做了充分的负载均衡,否则这意味着系统已经过载,用户端会出现明显的卡顿、超时甚至连接拒绝。

2. 为什么“看平均值”会死人?——关键维度分析

单纯看 top 命令里的 %CPU 是没有意义的,你需要从以下几个维度深入:

A. 业务类型决定阈值

  • Web 应用/API 服务(如 Nginx, Tomcat, Spring Boot):
    • 这类服务通常是 I/O 密集型或等待型。CPU 使用率维持在 40%-70% 是比较理想的状态。
    • 如果经常飙到 90%+,往往意味着代码逻辑有问题(如复杂 JSON 序列化、频繁 GC)、数据库查询慢导致线程阻塞,或者恶意爬虫攻击。
  • 计算密集型任务(如视频转码、AI 推理、科学计算):
    • 这类任务的目标就是榨干 CPU。使用率长期保持在 90%-100% 是正常的,甚至是预期的。
    • 这时候你要关注的不是 CPU 百分比,而是任务完成耗时是否满足 SLA(服务等级协议)。
  • 数据库(MySQL, PostgreSQL, Redis):
    • 数据库对 CPU 非常敏感。一般建议控制在 70%-80% 以下。
    • 一旦超过 80%,通常伴随着锁竞争加剧、慢查询增多。Redis 作为纯内存数据库,CPU 过高通常意味着网络带宽打满或大 Key 操作。

B. “持续时间”比“瞬时峰值”更重要

  • 瞬时尖峰(Spike):比如某秒突然跳到 100%,但 1 秒后回落。这通常是正常的请求波动,无需过度反应,除非你发现每次都是这样。
  • 持续高位(Sustain):如果 CPU 连续 5-10 分钟维持在 90% 以上,这才是真正的威胁。它会导致:
    • 上下文切换(Context Switching)激增:CPU 花在调度进程上的时间多于执行任务的时间。
    • TCP 队列溢出:内核处理不过来新的连接请求。
    • OOM 风险:虽然 CPU 高不直接导致内存溢出,但高负载往往伴随复杂的计算,可能间接引发内存问题。

C. 多核 vs 单核

  • 云服务器通常是多核的。top 显示的 100% 是指单个核心满载,还是整体平均?
  • 假设你有一台 4 核机器:
    • 如果 4 个核心的使用率都是 100%,总负载确实是 400%(即 100% 平均),这时系统肯定卡了。
    • 如果只有 1 个核心是 100%,其他 3 个是 10%,平均下来才 30%。这种情况看似健康,但那个满载的核心可能就是瓶颈所在(例如某个特定算法无法并行化)。
  • 建议:使用 mpstat -P ALL 1 或云监控中的各核使用率分布图,查看是否存在“偏科”现象。

3. 如何正确排查?(实操建议)

当你发现 CPU 使用率异常时,不要急着扩容(加配服务器),先做以下三步:

  1. 定位进程:
    top -c
    # 按 P 排序,找到最耗 CPU 的 PID
  2. 定位线程:
    ps -T -p <PID> | head -n 20
    # 找出该进程中哪个线程在消耗 CPU
  3. 定位代码行(Java/Go/C++ 等):
    • Java: 使用 jstack <PID> 生成堆栈信息,查看哪个方法占用最多 CPU 时间。常见陷阱:正则表达式回溯、无限循环、频繁 Full GC。
    • Go: 使用 pprof,分析 goroutine 的 CPU profile。
    • C/C++: 使用 perf 或 eBPF 工具进行火焰图分析。

4. 云环境下的特殊考量

在国内的云环境中,还有几个需要注意的点:

  • 突发性能实例(Burstable Instances):如阿里云的 t5/t6 系列,腾讯云的 S5 系列。这些实例有 CPU 积分机制。平时积累积分,高峰时释放积分提升性能。如果你的实例是这种类型,CPU 使用率突然飙升可能导致积分耗尽,从而被强制降频到基准性能(如 10%-20%),这时候你会看到 CPU 使用率反而不高,但业务极慢。 请务必检查云控制台的“CPU 积分余额”。
  • 弹性伸缩(Auto Scaling):设置合理的触发策略。不要等到 CPU 100% 再扩容,那样用户已经感知到了延迟。建议在 CPU 持续 5 分钟 > 70% 或 80% 时触发扩容。
  • 监控粒度:确保你的监控探针采集频率足够(建议 10 秒或 1 分钟级)。如果只靠 5 分钟平均值,可能会掩盖掉关键的瞬时峰值。

总结

  • 日常监控:关注 70% 作为预警线,85% 作为行动线。
  • 核心原则:不看绝对值,看趋势和基线对比。
  • 行动指南:CPU 高 ≠ 一定要加机器。先查代码、查 SQL、查配置,确认是正常业务增长还是技术债务导致的效率低下。

记住,最好的服务器状态不是“永远低负载”,而是“在可预测的峰值下保持平稳,并有足够的余量应对突发”。