你的"磁盘将满"告警在说谎:别再按百分比告警

· 1 min read · devops monitoringalertingprometheusgrafanastoragecapacityobservability

我搭好监控、写了一套看着合理的规则,然后用一个下午删掉了其中大半阈值。它们全是百分比,而且都以同一种方式错了。

三个教我道理的告警

1.「文件系统使用率超过 90%」——它在一个还剩约 500 GB 的 17 TB 卷上触发。没事发生,也不会马上有事发生。这种体量的卷,一次大备份就能让百分比摆动几个点:比例是噪声,而”还有 500 GB 可用”才是世界的真实状态。

2.「内存使用率超过 90%」——在一台可用内存 4.8 GB 的主机上反复触发。Linux 会用空闲内存做 page cache,需要时立刻归还;MemTotal - MemFree 描述的是文件缓存,不是你的风险。真正预示 OOM 的是 MemAvailable。

3.「CPU steal 超过 25%」——一台把邮件栈跑得完全正常的 VPS,steal 长期在 41%。steal 说明宿主机忙,它是容量信号而不是故障信号;7 vCPU 的机器 41% steal 就是这台机器的成本。这条规则产生的告警永远为真、也永远无用。

共同点:我在对比例告警,而比例不知道东西有多大。

对”后果”告警,而不是对比例

我现在对每个阈值都问一句:如果这个状态持续下去,实际会发生什么? 答案几乎总能用绝对单位表达。

不要这样改成原因
文件系统 > 90%剩余空间 < N GB“我还能不能写进去”才是问题
内存使用 > 90%MemAvailable < 512 MB逼近 OOM,而不是”缓存很暖和”
CPU steal > 25%steal > 50%容量成本 vs 真的被饿死
负载 > Nload1 / 核数 > 2不谈核数的负载没有意义

PromQL 的前后对比:

# BEFORE — 17 TB 卷的百分比;还剩半 TB 就开叫
(1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 90

# AFTER — 真正装数据的卷上,还剩多少容量
min by (instance, mountpoint) (
  node_filesystem_avail_bytes{mountpoint=~"/volume[0-9]+|/mnt/ssd|/mnt/disk[0-9]+"}
) < 25e9
# BEFORE — 把 page cache 当成压力
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90

# AFTER — 真正的 OOM 前兆
node_memory_MemAvailable_bytes < 512 * 1024 * 1024

两个让规则能活下来的细节:

把比较放进阈值条件里,不要塞进表达式。 查询就写 min by (mountpoint) (node_filesystem_avail_bytes{...}),让告警规则去和 25000000000 比。若你在 PromQL 里写死 < 25e9、规则里又留着继承来的 > 90,规则照样会评估——但界面显示的阈值是错的,下一个读它的人得从两个互相矛盾的条件下反推你的意图。

排除那些”只是另一个挂载点的视图”。 一条”剩余空间”规则有多诚实,取决于它的选择器。在我自己的环境里,同一个 NAS 卷出现三次(/volume1、/opt、以及在另一台主机上以 CIFS 再次挂载),而 unRaid 的 shfs 联合挂载报告 avail=0——不加排除的规则不是永远误报,就是把容量算成两倍。一个写明白的选择器胜过聪明的通用写法。

噪声不是无害的

坏阈值的代价不在告警本身,而在训练:每条”没事乱叫”的告警都在教你先扫一眼、然后忽略;等你真正该看的那条到来时,它出现在一个你早已不再读的频道里。我的规则总数减少了,覆盖率却上升了——更少,但每条都对应一个明确的后果。

阈值是私人的,形状是通用的

上面的数字是我的:NAS 卷剩不到 25 GB 我会在意、可用内存低于 512 MB 我才管、VPS steal 超过 50% 才算被饿。你的数字随硬件和容忍度而变。

能通用的是形状:

结果

同一套栈,从”三条永久无用报警”变成 16 条在机房健康时保持安静的规则——其中一条立刻暴露了一个只剩 21 GB 的 NAS 卷,而那正是百分比规则一直藏在”99% 满的巨物”背后、被你学会忽略的东西。

需要为你的业务做这个吗?

如果你的监控在发你已经学会忽略的告警,或者你根本没有监控、宁愿从一条规则而不是从一次失败的备份里得知磁盘满了,我可以帮你搭自托管的监控与告警(Prometheus + Grafana,通知推 Telegram 和邮件),阈值按”什么会真的坏”来定。

WhatsApp:+60 12-797 2969 · 邮箱:[email protected] · hoelee.com

网站设计与开发是我的主业;服务器加固与自托管基础设施是它的另一半。

Lee Teong Hoe

Full-stack developer & DevOps engineer. I build web apps, self-host infrastructure, and automate things — this blog is my living portfolio.