Prometheus存储
存储
Prometheus可以处理数百万个时间序列。更多的时间序列需要更多内存,需要配置Prometheus的storage.local.target-heap-size
每个chunks包含单个时间序列样本,时间序列被表示为一系列chunks,最终形成磁盘上的序列文件
chunk生命周期
由出生至死亡
最新样本序列会具有开放头部的chunk,一旦chunk被填满或序列一段时间内未收到新样本,chunks头部关闭,并成为等待追加到时间序列文件的chunks(正在等待持久化),chunks被持久化后若当前仍未被查询使用,则可从内存中移除
从内存中移除chunk的操作用于满足目标heap-size,有开放头部块的序列被称为active series。(内存序列除了active series外还有等待持久化的chunks,查询序列调用的chunks,可驱逐的chunks)。一个时间序列如果在内存中没有任何chunks,可以把这个时间序列持久化,不必占用内存。
死不了怎么办?
Prometheus在内存里的chunks数量取决于启动参数设置的堆大小和其他进程在内存中所占用的量,如果chunks都不能被移除,满足不了heap-size的要求的话,Prometheus会限制样本摄取(通过跳过scrape和rule评估),直到heap-size满足要求。
官方承认,Prometheus的节流功能做的确实比较一般。
内存中开放头部chunks,等待持久化的chunks,和正在查询的chunks
这三种chunks无法被移除
只有chunks头部关闭,等待持久化满足持久化时间的时候,才会从内存中移除并序列化
所以为什么会OOM?
因此,从ch