Prometheus 为远程写实现了合理的默认值,但许多用户有不同的需求,希望优化其远程设置。
本页介绍了通过远程写配置可用的调优参数。
每个远程写目标都会启动一个队列,该队列从预写日志 (WAL) 中读取数据,将样本写入由一个分片拥有的内存队列中,然后该分片向配置的端点发送请求。数据流如下所示
|--> queue (shard_1) --> remote endpoint
WAL --|--> queue (shard_...) --> remote endpoint
|--> queue (shard_n) --> remote endpoint
当一个分片积压并填满其队列时,Prometheus 将阻止从 WAL 读取数据到任何分片中。除非远程端点停机超过 2 小时,否则失败将重试而不会丢失数据。2 小时后,WAL 将被压缩,未发送的数据将丢失。
在运行期间,Prometheus 将根据传入的样本速率、未发送的待处理样本数量以及发送每个样本所需的时间,持续计算要使用的最佳分片数量。
使用远程写会增加 Prometheus 的内存占用。大多数用户报告内存使用量增加约 25%,但该数字取决于数据的形状。对于 WAL 中的每个序列,远程写代码会缓存序列 ID 到标签值的映射,导致大量的序列流失显著增加内存使用量。
除了序列缓存之外,每个分片及其队列也会增加内存使用量。分片内存与 分片数量 * (容量 + 每次发送的最大样本数)
成正比。进行调优时,考虑在增加 容量
和 每次发送的最大样本数
的同时减少 最大分片数
,以避免意外耗尽内存。容量: 10000
和 每次发送的最大样本数: 2000
的默认值将把每个分片的内存使用量限制在小于 2 MB。
远程写还会增加 CPU 和网络使用量。然而,出于上述同样的原因,很难预测会增加多少。如果您的 Prometheus 服务器通过远程写发送样本出现延迟(prometheus_remote_storage_samples_pending
),通常最好检查 CPU 和网络是否饱和。
所有相关参数都可以在远程写配置的 queue_config
部分找到。
容量
容量控制着每个分片在阻塞从 WAL 读取之前有多少样本在内存中排队。一旦 WAL 被阻塞,样本就无法附加到任何分片,所有吞吐量将停止。
容量应该足够高,以在大多数情况下避免阻塞其他分片,但过多的容量会导致内存消耗过多,并在分片重组期间需要更长时间来清除队列。建议将容量设置为 每次发送的最大样本数
的 3-10 倍。
最大分片数
最大分片数配置了 Prometheus 将为每个远程写队列使用的最大分片数量或并行度。Prometheus 会尽量不使用过多的分片,但如果队列落后,远程写组件会将分片数量增加到最大分片数以提高吞吐量。除非远程写入一个非常慢的端点,否则 最大分片数
不太可能需要增加超过默认值。但是,如果有可能压垮远程端点,或者在数据备份时需要减少内存使用量,则可能需要减少最大分片数。
最小分片数
最小分片数配置了 Prometheus 使用的最小分片数量,也是远程写启动时使用的分片数量。如果远程写落后,Prometheus 将自动扩展分片数量,因此大多数用户无需调整此参数。但是,增加最小分片数将允许 Prometheus 在计算所需分片数量时避免一开始就落后。
每次发送的最大样本数
每次发送的最大样本数可以根据使用的后端进行调整。许多系统通过每批发送更多样本而延迟没有显著增加的方式工作得很好。其他后端如果尝试在每个请求中发送大量样本则会遇到问题。默认值足够小,适用于大多数系统。
批量发送截止时间
批量发送截止时间设置了单个分片两次发送之间的最大时间间隔。即使队列中的分片尚未达到 每次发送的最大样本数
,也会发送请求。对于不注重延迟的低容量系统,可以增加批量发送截止时间以提高请求效率。
最小回退时间
最小回退时间控制着重试失败请求之前等待的最短时间。增加回退时间可以在远程端点恢复在线时分散请求。每次失败请求的回退间隔都会加倍,直到达到 最大回退时间
。
最大回退时间
最大回退时间控制着重试失败请求之前等待的最长时间。
本文档是开源的。请通过提交问题或拉取请求帮助改进它。