给出磁盘 I/O 利用率 > 80% 的 PromQL 告警表达式。

解读

国内互联网公司在面试 CouchDB 运维/监控岗位时,常把“如何写一条能真实反映磁盘 I/O 瓶颈的 PromQL”作为**区分“只背指标”与“真做过监控”**的试金石。
面试官想确认三点:

  1. 你清楚 Linux 下磁盘 I/O 利用率到底指什么(iostat 的 %util,即设备处于“有请求在处理”状态的时间占比)。
  2. 你知道 CouchDB 进程本质还是 Erlang BEAM,不直接暴露块设备指标,因此必须依赖 Node Exporter 的 node_exporter 采集。
  3. 你能把“>80%”翻译成一条可在 Alertmanager 里直接使用的 PromQL,并附带标签过滤、挂载点排除、速率平滑等工程化细节,而不是随手抄一条“rate(node_disk_io_time_seconds_total[1m])>0.8”交差。

知识点

  1. node_disk_io_time_seconds_total:Node Exporter 对每个块设备累计的“忙碌时间”,单位秒。
  2. irate / rate:irate 取最近两个采样点,灵敏;rate 取整个滑动窗口,适合告警。国内生产环境通常用5m 窗口抑制毛刺。
  3. 标签过滤
    • device=~“sd.|vd.|nvme.*” 排除 loop、dm 等虚拟设备;
    • mountpoint!~“.docker.|.kubelet.” 避免容器挂载点误报。
  4. 聚合策略:CouchDB 节点多为单机多盘云盘单盘,需按 instance、device 维度保留标签,方便定位。
  5. 阈值单位:io_time 是“秒/秒”,80% 即 0.8;写 PromQL 时直接跟 0.8 比较即可。
  6. 告警持续:国内 SRE 规范通常要求持续 5 分钟才 page,所以表达式里用“> 0.8”即可,Alertmanager 的 for: 5m 负责抑制抖动。

答案

# 单设备 I/O 利用率 > 80%
- alert: CouchDB_Node_Disk_IO_Util_High
  expr: |
    rate(node_disk_io_time_seconds_total{device=~"sd.*|vd.*|nvme.*"}[5m]) > 0.8
  for: 5m
  labels:
    severity: critical
    team: dba
  annotations:
    summary: "CouchDB 节点 {{ $labels.instance }} 设备 {{ $labels.device }} I/O 利用率超 80%"
    description: "当前值 {{ $value | humanizePercentage }},持续 5 分钟,可能影响 CouchDB 视图构建与压缩任务。"

若公司要求按节点聚合(只要有一块盘超阈值就报警),可把表达式改为:

max by (instance) (
  rate(node_disk_io_time_seconds_total{device=~"sd.*|vd.*|nvme.*"}[5m])
) > 0.8

拓展思考

  1. CouchDB 特殊场景
    当触发大视图压缩数据库压缩(compaction)时,I/O util 会瞬间飙高。为避免误报,可在表达式里串联 CouchDB 自身指标做降噪:

    (
      rate(node_disk_io_time_seconds_total{device=~"sd.*|vd.*|nvme.*"}[5m]) > 0.8
      and
      couchdb_compaction_running == 0
    )
    

    这样只有“非压缩期间”I/O 高才真正告警,体现业务感知能力。

  2. 云盘场景
    国内阿里云 ESSD、腾讯云 CBS 的底层限速以吞吐/OPS为准,%util 100% 也不一定代表“慢”。高级方案可再叠加

    rate(node_disk_read_bytes_total[5m]) + rate(node_disk_written_bytes_total[5m]) > 240MB/s
    

    双条件告警,既看 util 又看吞吐,防止云盘“假忙”。

  3. 面试加分句
    “如果贵司 CouchDB 跑在 K8s 里,我会用 kube-prometheus-stack 的 ServiceMonitor 把 CouchDB 的 metrics 与 node_exporter 一起采集,然后在 Grafana 里做 multi-window、multi-burn-rate 的 SLO 面板,既看瞬时 util,也看 1h/24h 的 I/O burn rate,实现谷歌 SRE 章节里提到的‘错误预算’。”