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_totalcilium_conntrack_miss_total |
| Calico (felix) | :9091/metrics |
felix_conntrack_hitsfelix_conntrack_misses |
| Flannel (kube-flannel) | :9099/metrics |
flannel_network_stats(需启用) |
最佳实践: 优先使用 CNI 插件官方 exporter,避免重复埋点。若需自定义指标,使用 eBPF 而非 netlink 轮询,后者在高频场景下会引入额外延迟。
3.3 监控体系搭建
下图展示从数据采集到告警的完整监控流水线:
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 缓存命中率与性能的关联模型
下面通过第二个独立图示展示命中率下降时,数据面各阶段延迟的连锁变化:
3.6 生产环境监控清单
- 指标采集: 每个节点部署 Prometheus Node Exporter + CNI 插件 exporter,确保
scrape_interval≤ 15s。 - 聚合计算: 使用
rate()函数计算命中率,避免计数器重置干扰。 - 告警阈值: 设置三级告警——Warning(< 99%)、Critical(< 95%)、Pager(< 90%)。
- 可视化: Grafana 面板展示命中率趋势图、延迟热力图、吞吐量折线图,按节点和命名空间分组。
- 日志关联: 当命中率触发告警时,自动关联对应节点的 conntrack 表大小、CPU 软中断、内存压力等系统指标。
进阶建议: 对于 Cilium 环境,启用 Hubble 的 TCP 流监控,可以精确到每个 Pod 粒度的缓存命中/未命中分布,快速定位异常工作负载。