阈值不是拍脑袋定的数字,更不是厂商默认值一用到底。见过太多团队把CPU告警设在99%,结果用户投诉页面卡顿,监控曲线平静如水;也见过数据库连接数阈值设在200,业务高峰期疯狂报警,运维麻木后漏掉真正的故障。阈值设定本质是翻译工作——把业务对稳定性的体感,翻译成机器能执行的数值边界。
先从最基础的资源类指标说起。CPU使用率是最常见的监控项,但只看总使用率远远不够。一台32核服务器,单核跑满100%,总使用率可能只有3%,系统却已经出现严重延迟。正确的做法是同时监控单核CPU使用率,阈值建议设在85%持续3分钟。为什么是85%?因为超过这个值,中断请求的处理能力开始明显下降,上下文切换成本急剧上升。持续3分钟是为了过滤瞬时尖刺,避免编译任务、定时批处理这类正常行为触发误报。
内存监控同样存在普遍误区。Linux的available memory比free memory更有意义,free只统计完全未被使用的内存,available则包含了可回收的缓存和缓冲区。告警阈值建议设在available memory低于总内存的10%。这里有个容易忽略的细节:内存泄漏的判定不能只看绝对值,要看斜率。如果内存在72小时内持续下降,即使还没触及10%红线,也应该发出预警。监控系统需要支持对趋势的检测,比如Prometheus的predict_linear函数可以预判未来几小时是否会耗尽内存。
磁盘IO与空间的双维度监控磁盘空间告警是最容易设定也最容易出问题的指标。根分区满了系统直接不可用,阈值设在85%触发警告、95%触发严重告警是业界共识。但很多人忽略了inode耗尽的情况。小文件密集的场景,磁盘空间还剩30%,inode先用光了,照样无法创建新文件。df -i命令的结果必须纳入监控,阈值同样建议85%。
磁盘IO的监控要区分IOPS和吞吐量。云服务器通常有IOPS上限,比如某云服务器基线IOPS是3000,突发上限12000。如果IOPS持续接近基线值,说明磁盘已经成为瓶颈。阈值建议设在基线值的80%,因为云厂商的IOPS限流是硬性的,触达上限后IO延迟会从毫秒级飙升到秒级。对于物理服务器,则需要关注磁盘平均等待时间,await值超过20ms就说明磁盘队列开始堆积。
网络指标的深层解读网络流量阈值通常设为带宽上限的80%,这是为了留出弹性空间应对突发流量。但更关键的指标是TCP重传率和连接状态。TCP重传率超过2%意味着网络质量恶化,可能是网卡故障、交换机端口错误、或者带宽真的打满了。这个指标比流量曲线更早暴露问题。另外,TIME_WAIT状态的连接数如果短时间内暴增,通常是后端服务出现了大量短连接断开,需要检查负载均衡的健康检查间隔和应用连接池配置。
网络延迟的监控要分两个维度:同机房内延迟和跨地域延迟。同机房内P99延迟超过5ms就属于异常,说明虚拟化层或网络设备可能存在问题。跨地域延迟需要结合专线带宽和实际地理距离设定基线,日常波动超过基线50%就应该触发告警。
应用层指标才是业务真相资源指标健康不代表应用正常。应用层监控必须包含三个核心维度:响应时间、错误率、吞吐量。响应时间不能只看平均值,平均值是最大的骗子。必须监控P50、P95、P99三个分位数。P95响应时间超过500ms,用户就能感知到卡顿;P99超过2秒,关键业务流程可能已经开始超时。阈值设定要基于业务场景:面向用户的API,P95阈值建议200ms;内部管理后台可以放宽到1秒;支付类接口则要求P99在500ms以内。
错误率阈值不能简单设为1%。要区分错误类型:5xx是服务端错误,阈值应该严格控制在0.1%以下;4xx中的401/403可能是权限问题,阈值可以稍宽,但429限流错误如果突然增多,说明上游压力已经传导过来。这里有个实践经验:为每个API端点单独设定错误率阈值,而不是全局一刀切。一个不常用的管理接口100%错误可能无人关心,但登录接口1%的错误率就是事故。
数据库与中间件的专属阈值数据库连接数是监控重灾区。MySQL默认最大连接数151,很多团队直接把这个值当作告警阈值,这是危险的。连接池的等待队列在连接数使用率超过70%时就开始排队,应用端响应时间已经恶化。建议连接数使用率阈值设在60%,超过这个值就要排查是慢查询堆积还是连接池配置过小。慢查询数量阈值建议设为每分钟超过5条,而不是只看绝对数量,因为慢查询的增量比存量更具告警价值。
Redis的内存使用率阈值建议75%,因为Redis的BGSAVE需要fork子进程,内存占用会瞬间翻倍。如果使用率已经超过75%,持久化时可能触发OOM。缓存命中率低于90%就要警惕,说明大量请求穿透到数据库。Kafka的消费延迟阈值要按业务容忍度设定,实时类业务延迟超过5000条就告警,离线分析可以放宽到10万条。但所有场景下,分区的不均衡分布必须监控,某个分区堆积而其他分区正常,往往被总延迟指标掩盖。
阈值设定的动态化与自适应固定阈值在业务增长面前注定失效。一个电商系统,大促期间的QPS是日常的5倍,用日常阈值去监控大促,要么告警风暴,要么阈值太高漏掉故障。动态阈值需要引入时间周期概念:工作日和周末分开设定,白天和夜间分开设定。更进一步,基于历史数据的同比环比自动调整阈值。比如过去4周同一时段QPS的均值上下浮动30%作为正常区间,超出则告警。这种自适应阈值对周期性业务尤其有效。
实现动态阈值并不复杂。以Prometheus为例,可以用如下规则检测流量突降:
( rate(http_requests_total[5m]) / rate(http_requests_total[5m] offset 1w) ) < 0.5
这个表达式比较当前5分钟请求速率与上周同期的比值,低于50%说明流量异常下降,可能是DNS故障或负载均衡摘除了节点。反过来检测流量突增则把小于号改成大于号,阈值设1.5即可。
告警抑制与聚合策略阈值设得再好,没有配套的告警策略等于白做。同一个根因故障可能触发几十条告警,运维被淹没在噪音里。告警聚合要按拓扑关系收敛:一台物理机宕机,上面的虚拟机全部不可达,只发一条物理机宕机的告警,其余虚拟机的告警自动抑制。这需要在监控系统里维护服务依赖拓扑,或者至少按主机组、服务组进行聚合。
告警升级机制同样关键。Warning级别告警30分钟未处理自动升级为Critical,Critical告警15分钟未响应则电话通知。但升级的前提是阈值分级合理。Warning阈值应该留有足够的处理窗口,比如磁盘空间85%告警,按当前增长速度计算,距离95%还有6小时,这个窗口足够运维处理。如果Warning和Critical之间只有5%的差距,而业务增长速度一天就能吃掉10%,那分级就失去了意义。
阈值验证与持续调优阈值上线不是终点。每月至少要回溯一次告警数据,分析误报率和漏报率。误报率超过20%的阈值需要调宽,漏报的故障要反向补充监控项。一个实用的方法是故障复盘时问三个问题:这个故障有没有监控覆盖?告警阈值是否在故障发生前触发?告警信息是否准确指向了根因?三个问题只要有一个答案是否,就说明监控体系存在缺口。
压测是验证阈值的最佳手段。定期对核心链路进行压测,观察各项指标在压力下的变化曲线,找到真正的拐点。比如压测时发现QPS达到5000时P99延迟开始非线性增长,那日常告警阈值就应该设在4000左右,留出20%的安全边际。压测数据比任何理论推算都更贴近真实系统行为。
最后强调一个常被忽视的点:监控系统自身的健康度也需要阈值。监控数据上报延迟超过60秒,说明监控链路本身可能故障;监控存储的写入失败率超过0%,需要立即排查。一个连自己都监控不了的监控系统,是运维最大的盲区。
