3、缓存命中率指标:关键性能指标(命中率、延迟、吞吐量)、如何采集与监控命中率

缓存命中率是衡量 CNI 数据面转发效率的核心指标。当 Pod 间通信频繁创建或销毁时,CNI 缓存(如 conntrack、FIB、ARP 表)的命中率直接决定数据包是走快速路径(内核旁路/硬件卸载)还是慢速路径(协议栈处理)。本节定义三大关键性能指标,并给出生产环境下的采集与监控方案。

3.1 关键性能指标(KPI)定义

指标名称 定义 计算公式 健康阈值
缓存命中率 数据包在 CNI 缓存中直接匹配成功的比例 命中次数 / (命中次数 + 未命中次数) × 100% > 99.5%(关键路径)
> 95%(普通路径)
缓存查询延迟 从发起缓存查询到返回结果的平均耗时 总查询耗时 / 查询次数 < 10 μs(本地缓存)
< 100 μs(分布式缓存)
缓存吞吐量 单位时间内缓存系统处理的查询请求数 成功查询次数 / 时间窗口(秒) 根据节点规格动态评估,通常 > 100K QPS/core
关键认知: 命中率下降 1% 可能导致数据面延迟增加 5-10 倍(因触发协议栈回退)。延迟和吞吐量是命中率的衍生指标,三者需联合监控。

3.2 命中率采集方法

3.2.1 内核级采集(eBPF / tracepoint)

对于基于 conntrack 或 FIB 的 CNI 插件(如 Calico、Cilium),最精确的采集点位于内核网络栈的查找路径:

  • conntrack 命中/未命中: 挂载 kprobe:nf_conntrack_in 和 kprobe:nf_conntrack_confirm,统计 NF_CT_STAT_HIT 与 NF_CT_STAT_MISS。
  • FIB 路由缓存: 读取 /proc/net/stat/rt_cache 中的 in_hit、in_miss 字段。
  • ARP 邻居表: 通过 ip -s neigh show 获取 used 与 failed 计数。
# 使用 bpftrace 实时采集 conntrack 命中率(生产环境建议用 Cilium 的 Hubble 或开源 exporter)
bpftrace -e '
kprobe:nf_conntrack_in {
  @start[tid] = nsecs;
}
kretprobe:nf_conntrack_in /@start[tid]/ {
  $delta = nsecs - @start[tid];
  if (retval > 0) {
    @hit_count++;
    @hit_latency_hist = hist($delta);
  } else {
    @miss_count++;
  }
  delete(@start[tid]);
}
interval:s:10 {
  $total = @hit_count + @miss_count;
  printf("conntrack hit rate: %f%% (hit=%d miss=%d)\n",
         $total > 0 ? (@hit_count / $total) * 100 : 0,
         @hit_count, @miss_count);
  clear(@hit_count); clear(@miss_count);
}'

3.2.2 用户态采集(CNI 插件 metrics API)

主流 CNI 插件已内置 Prometheus 指标端点,推荐优先使用:

CNI 插件 指标端点 关键指标名
Cilium :9962/metrics cilium_conntrack_hit_total
cilium_conntrack_miss_total
Calico (felix) :9091/metrics felix_conntrack_hits
felix_conntrack_misses
Flannel (kube-flannel) :9099/metrics flannel_network_stats(需启用)
最佳实践: 优先使用 CNI 插件官方 exporter,避免重复埋点。若需自定义指标,使用 eBPF 而非 netlink 轮询,后者在高频场景下会引入额外延迟。

3.3 监控体系搭建

下图展示从数据采集到告警的完整监控流水线:

CNI 缓存命中率监控流水线 eBPF 内核探针 conntrack / FIB / ARP CNI Metrics API Prometheus 端点 Node Exporter /proc/net/stat Prometheus Server 聚合:rate(hit_total[5m]) / rate(total[5m]) Grafana 仪表盘 实时命中率热力图 Alertmanager 命中率 < 99% 告警 日志归档 Loki / Elasticsearch 说明:采集层支持 eBPF 零侵入、CNI 原生 exporter、内核 proc 三种方式,统一由 Prometheus 聚合计算命中率

3.4 命中率计算与告警规则

PromQL 查询示例(基于 Cilium 指标):

# 实时命中率(5 分钟滑动窗口)
100 * (
  rate(cilium_conntrack_hit_total[5m])
  /
  (rate(cilium_conntrack_hit_total[5m]) + rate(cilium_conntrack_miss_total[5m]))
)

# 缓存查询延迟 P99(需启用延迟直方图)
histogram_quantile(0.99,
  sum(rate(cilium_conntrack_latency_seconds_bucket[5m])) by (le)
)
避坑指南:
  • 不要直接使用 hit_total / (hit_total + miss_total) 计算瞬时值,必须使用 rate() 或 increase() 避免计数器重置导致突变。
  • 当命中率低于 95% 时,优先检查 conntrack 表大小是否达到上限(net.netfilter.nf_conntrack_max),而非立即怀疑 CNI 插件 Bug。
  • 延迟指标需配合 histogram_quantile 使用,平均值会掩盖尾部延迟问题。

3.5 缓存命中率与性能的关联模型

下面通过第二个独立图示展示命中率下降时,数据面各阶段延迟的连锁变化:

命中率下降对数据面延迟的影响模型 正常路径(命中率 > 99.5%):数据包 3-5 μs 完成转发 网卡 DMA ~1 μs CNI 缓存查找 ~2 μs 硬件卸载 ~1 μs 数据发送 ~1 μs 故障路径(命中率 < 90%):数据包 50-200 μs 完成转发 网卡 DMA ~1 μs 缓存 MISS ~5 μs 协议栈回退 30-150 μs 数据发送 ~1 μs 关键结论: 缓存 MISS 导致协议栈回退,延迟增加 10-50 倍。监控命中率可提前发现卸载路径失效,避免性能劣化。

3.6 生产环境监控清单

  1. 指标采集: 每个节点部署 Prometheus Node Exporter + CNI 插件 exporter,确保 scrape_interval ≤ 15s。
  2. 聚合计算: 使用 rate() 函数计算命中率,避免计数器重置干扰。
  3. 告警阈值: 设置三级告警——Warning(< 99%)、Critical(< 95%)、Pager(< 90%)。
  4. 可视化: Grafana 面板展示命中率趋势图、延迟热力图、吞吐量折线图,按节点和命名空间分组。
  5. 日志关联: 当命中率触发告警时,自动关联对应节点的 conntrack 表大小、CPU 软中断、内存压力等系统指标。
进阶建议: 对于 Cilium 环境,启用 Hubble 的 TCP 流监控,可以精确到每个 Pod 粒度的缓存命中/未命中分布,快速定位异常工作负载。