cadvisor不直接提供波峰波谷统计,但通过采集container_memory_rss等指标、合理设置采样频率(如10s)、结合prometheus的max_over_time/min_over_time等函数,可在grafana中准确识别内存波峰与波谷,并需关联容器事件交叉验证。
cadvisor 本身不直接提供“波峰波谷”这类统计摘要,但它持续采集高精度、高频率的内存时序数据,为识别波峰(峰值)、波谷(低谷)提供了完整原始基础。关键在于用对指标 + 合理采样 + 后处理分析,而不是依赖 cadvisor 内置的极值计算。
以下三步是实际可行、生产环境常用的方法:
明确采集哪个内存指标才反映真实波动
-
container_memory_usage_bytes:总内存使用量(含 cache),波动大但含噪声,适合观察整体压力趋势 -
container_memory_working_set_bytes:工作集大小(≈ RSS + active_file),Kubernetes OOM 判定依据,常用于调度与驱逐场景下的“压力波峰”识别 -
container_memory_rss:最推荐用于波峰波谷分析——它代表进程真正锁定在物理内存中的页(JVM 堆、Go runtime 分配内存等),剔除 page cache 干扰,波动更贴近业务真实内存行为 - 避免使用
container_memory_cache单独分析,它随文件读写剧烈抖动,不代表应用内存变化
确保采集频率和保留窗口满足波形还原要求
- 默认 cAdvisor 采集间隔为 10–60 秒(取决于配置和负载),对秒级突增可能平滑掉尖峰
- 生产中建议通过启动参数显式控制:
./cadvisor --housekeeping_interval=10s --event_storage_age_limit=72h
- 若需捕捉短时内存爆发(如批处理任务、GC 瞬时高峰),可配合 Prometheus 抓取间隔设为
10s,并启用scrape_timeout: 5s防超时丢点 - 注意:高频采集会增加存储与查询压力,
container_memory_rss每 10 秒一个点,7 天约 6 万条/容器,需评估后端存储容量
在 Prometheus 或 Grafana 中识别波峰波谷
- 波峰识别(Peak Detection):
- 使用
max_over_time(container_memory_rss[1h])查看每小时最高值 - 结合
deriv(container_memory_rss[5m]) > 1000000找出每 5 分钟内上升速率超 1MB/s 的陡升段(典型内存泄漏或突发加载)
- 使用
- 波谷识别(Trough Detection):
-
min_over_time(container_memory_rss[30m])获取半小时最低水位 - 用
rate(container_memory_rss[5m]) 辅助判断是否处于稳定释放阶段(注意:RSS 一般不下降,除非显式释放或 GC)
-
- 可视化建议:
- 在 Grafana 中叠加
container_memory_rss曲线 +max/min_over_time(...[15m])带状区域 - 设置告警规则:
abs(max_over_time(container_memory_rss[1h]) - min_over_time(container_memory_rss[1h])) > 500_000_000(波动超 500MB 触发人工核查)
- 在 Grafana 中叠加
不复杂但容易忽略的是:波峰未必等于问题,波谷也不代表健康——要结合容器生命周期事件(如 container_event{event=="start"} 或 event=="oom_kill"})交叉比对。例如某 Pod 每次重启后 RSS 从 200MB 阶跃升至 1.2GB 并不再回落,这才是真正的内存增长型波峰,而非瞬时抖动。











