Pod内存使用率一直升高,我们怎样知道大概多久之后会到达Limit值,并在一定时刻触发告警,在Pod被杀掉之前进行排查?如果数据指标数量大导致Promethues占用内存很高,出现Prometheus容器OOM,请问有什么办法可以优化内存占用吗?
1、Promtheus提供了基础的预测能力,基于当前的变化速度,推测一段时间后的值。Prometheus的Deriv和Predict_Linear函数可以满足这种需求。
predict_linear函数:对曲线变化速率进行计算,起到一定的预测作用。比如当前这1个小时的内存可用率急剧下降,这种情况可能导致内存已满,这时可以使用该函数,用当前1小时的数据去预测未来几个小时的状态,实现提前告警。
以mem_free为例,mem_free仅为举例,实际内存可用以mem_available为准。
执行查询:mem_free{instanceIP="xxx.xxxx.xxx.xxx"}/1024/1024
结果显示最近一小时的free值一直在下降。
deriv函数可以显示指标在一段时间的变化速度:
deriv(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h])
predict_linear函数是预测基于这种速度,最后可以达到的值:
predict_linear(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h], 2*3600)/1024/1024
你可以基于设置合理的告警规则,如小于10时触发告警:
rule: predict_linear(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h], 2*3600)/1024/1024 <10
predict_linear与deriv的关系: 含义上约等于如下表达式,不过predict_linear稍微准确一些。
deriv(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h]) * 2 * 3600
+
mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h]
2、如果采集任务的数据指标数量非常巨大,就要考虑Prometheus的hash分区采集,分摊压力。还可以考虑省去一些在生产过程中没必要的指标。
收起