远程写入调优

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 到标签值的映射,这会导致大量的序列流失,从而显著增加内存使用量。

除了序列缓存之外,每个分片及其队列都会增加内存使用量。分片内存与 分片数量 * (容量 + 每次发送的最大样本数) 成正比。在调优时,请考虑在增加 capacitymax_samples_per_send 的同时减少 max_shards,以避免无意中耗尽内存。capacity: 10000max_samples_per_send: 2000 的默认值将把每个分片的内存使用限制在 2 MB 以下。

远程写入还会增加 CPU 和网络使用量。然而,由于上述相同的原因,很难预测会增加多少。如果您的 Prometheus 服务器在通过远程写入发送样本时(prometheus_remote_storage_samples_pending)落后,通常最好检查 CPU 和网络是否饱和。

参数

所有相关参数都可以在远程写入配置的 queue_config 部分找到。

capacity

Capacity 控制每个分片在阻塞从 WAL 读取之前内存中排队的样本数量。一旦 WAL 被阻塞,样本就无法追加到任何分片,并且所有吞吐量都将停止。

在大多数情况下,Capacity 应该足够高以避免阻塞其他分片,但过多的容量可能导致内存消耗过多,并在重新分片期间需要更长时间来清除队列。建议将 capacity 设置为 max_samples_per_send 的 3-10 倍。

max_shards

Max shards 配置 Prometheus 为每个远程写入队列使用的最大分片数量或并行度。Prometheus 会尽量不使用过多的分片,但如果队列落后,远程写入组件将增加分片数量,直到达到最大分片数以提高吞吐量。除非远程写入到非常慢的端点,否则 max_shards 不太可能需要增加超出默认值。但是,如果存在使远程端点过载的可能性,或者在数据备份时需要减少内存使用,则可能需要减少 max shards。

min_shards

Min shards 配置 Prometheus 使用的最小分片数量,也是远程写入启动时使用的分片数量。如果远程写入落后,Prometheus 将自动扩展分片数量,因此大多数用户无需调整此参数。但是,增加 min shards 将允许 Prometheus 在开始时计算所需分片数量时避免落后。

max_samples_per_send

Max samples per send 可以根据所使用的后端进行调整。许多系统通过每批发送更多样本而不会显著增加延迟,从而运行良好。如果尝试在每个请求中发送大量样本,其他后端可能会出现问题。默认值足够小,适用于大多数系统。

batch_send_deadline

Batch send deadline 设置单个分片两次发送之间的最大时间量。即使排队的分片尚未达到 max_samples_per_send,仍将发送请求。对于不敏感于延迟的低容量系统,可以增加 batch send deadline 以提高请求效率。

min_backoff

Min backoff 控制在重试失败请求之前等待的最短时间。增加退避时间可以使远程端点恢复在线时分散请求。每次失败请求的退避间隔会加倍,直到达到 max_backoff

max_backoff

Max backoff 控制在重试失败请求之前等待的最长时间。

本页内容