【博客620】prometheus如何优化远程读写的性能
prometheus如何优化远程读写的性能
场景
为了解决prometheus本地存储带来的单点问题,我们一般在高可用监控架构中会使用远程存储,并通过配置prometheus的remote_write和remote_read来对接
远程写优化:remote_write
远程写的原理:
每个远程写入目标都会启动一个内存写队列(shards),这个队列从WAL中缓存数据。,通过队列去将指标数据写到有远程存储服务中,数据流如下所示:
|--> queue (shard_1) --> remote endpoint
WAL --|--> queue (shard_...) --> remote endpoint|--> queue (shard_n) --> remote endpoint
重试机制:
当一个分片备份并填满队列时,Prometheus将阻止从WAL中读取数据到任何分片。(关于这点就涉及到对以上参数优化,后面参数capacity部分讲解)
远程端点写入失败会进行重试操作,并且保证数据不会丢失,除非远程端点保持关闭状态超过2小时,因为2小时后,WAL将被压缩,尚未发送的数据将丢失。重试时间见下面参数:min_backoff和max_backoff。
内存使用:
使用远程写入会增加Prometheus的内存占用量。大多数用户报告的内存使用量增加了约25%,但这取决于数据的形状。对于WAL中的每个系列,远程写代码都会缓存系列ID到标签值的映射,从而显着增加内存使用率。除了series缓存之外,每个分片及其队列还会增加内存使用量。当进行优化调整时,请考虑减少max_shards增加的数量,同时提高capacity和max_samples_per_send参数的大小从而避免无意间耗尽内存。默认capacity和 max_samples_per_send的取值将使得每每个shard使用内存小于100kb。

remote write queue的可调参数:
# Configures the queue used to write to remote storage.
queue_config:# Number of samples to buffer per shard before we block reading of more# samples from the WAL. It is recommended to have enough capacity in each# shard to buffer several requests to keep throughput up while processing# occasional slow remote requests.[ capacity: <int> | default = 2500 ]# Maximum number of shards, i.e. amount of concurrency.[ max_shards: <int> | default = 200 ]# Minimum number of shards, i.e. amount of concurrency.[ min_shards: <int> | default = 1 ]# Maximum number of samples per send.[ max_samples_per_send: <int> | default = 500]# Maximum time a sample will wait in buffer.[ batch_send_deadline: <duration> | default = 5s ]# Initial retry delay. Gets doubled for every retry.[ min_backoff: <duration> | default = 30ms ]# Maximum retry delay.[ max_backoff: <duration> | default = 5s ]# Retry upon receiving a 429 status code from the remote-write storage.# This is experimental and might change in the future.[ retry_on_http_429: <boolean> | default = false ]
max_shards和max_samples_per_send决定了Prometheus写入远程存储的最大TPS
参数解析:
-
1、capacity
定义:每个内存队列(shard:分片)的容量。
一旦WAL被阻塞,就无法将样本附加到任何分片,并且所有吞吐量都将停止。所以在大多数情况下,单个队列容量应足够打以避免阻塞其他分片,但是太大的容量可能会导致过多的内存消耗,并导致重新分片期间清除队列的时间更长。
-
2、max_shards
顾名思义,最大的分片数(即队列数),也可以理解为远程写的并行度。peometheus远程写的时候会使用所有的分片,只有在写队列落后于远程写的速度,使用的队列数会达到max_shards,目的在于提高远程写的吞吐量。
PS:在操作过程中,Prometheus将根据传入的采样率,未发送的未处理样本数以及发送每个样本所花费的时间,连续计算要使用的最佳分片数。(实际的分片数是动态调整的)
-
3、min_shards
最小分片配置Prometheus使用的最小分片数量,并且是远程写入开始时使用的分片数量。如果远程写入落后,Prometheus将自动扩大分片的数量,因此大多数用户不必调整此参数。但是,增加最小分片数将使Prometheus在计算所需分片数时避免在一开始就落后。 -
4、max_samples_per_send
定义:每次远程写发送的最大指标数量,即批处理;
这个值依赖于远程存储系统,对于一些系统而言,在没有显著增加延迟的情况下发送更多指标数据而运行良好,然而,对于另外一些系统而言,每次请求中发送大量指标数据可能导致其出现故障,使用的默认值是适用于绝大多数系统的。
-
5、batch_send_deadline
定义:单一分片批量发送指标数据的最大等待时间;
即使排队的分片尚未达到max_samples_per_send,也会发送请求。 对于对延迟不敏感的小批量系统,可以增加批量发送的截止时间,以提高请求效率。
-
6、min_backoff
定义:远程写失败的最小等待时间;
min_backoff是第一次的重试等待时间,第二次等待时间是其2倍,以此类推,直到max_backoff的值;
-
7、max_backoff
定义:远程写失败的最大等待时间;
推荐做法:
-
当进行优化调整时,请考虑减少max_shards的数量,同时提高capacity和max_samples_per_send参数的大小从而避免无意间耗尽内存
-
max_shards和max_samples_per_send决定了Prometheus写入远程存储的最大TPS,
max_shards * max_samples_per_send决定了TPS的值,所以要考虑这两个的合理搭配
给出阿里云prometheus对接TSDB调优参考表:

远程读优化:remote_read
默认情况下,prometheus除了使用remote_write将数据发送到远程时序数据库,同时还会按照以下参数来保留数据到本地自己的时序数据库,两者取最先达到限制的:
--storage.tsdb.retention.time=30d
--storage.tsdb.retention.size=512MB
也就说默认情况下,prometheus保存了两份数据,一份到远程时序数据库,一份在本地
那么读取的时候是读取远程的还是读取本地是由read_recent参数决定
# Whether reads should be made for queries for time ranges that
# the local storage should have complete data for.
[ read_recent: <boolean> | default = false ]
read_recent作用:
- 当设置为 true 时,所有查询都将从远程和本地存储中得到答复。
- 当为 false(默认值)时,任何可以从本地存储完全回答的查询都不会发送到远程端点
推荐做法:
- 通过storage.tsdb.retention.time与storage.tsdb.retention.size控制缓存短期数据在本地
- 配置read_recent为false,使得本地能查询到的数据都优先在本地进行查询

相关文章:
【博客620】prometheus如何优化远程读写的性能
prometheus如何优化远程读写的性能 场景 为了解决prometheus本地存储带来的单点问题,我们一般在高可用监控架构中会使用远程存储,并通过配置prometheus的remote_write和remote_read来对接 远程写优化:remote_write 远程写的原理:…...
redis可视工具AnotherRedisDesktopManager的使用
redis可视工具AnotherRedisDesktopManager的使用 简介 Another Redis DeskTop Manager 是一个开源项目,提供了以可视化的方式管理 Redis 的功能,可供免费下载安装,也可以在此基础上进行二次开发,主要特点有: 支持 W…...
【idea】idea生产类注释和方法注释
网上有很多类似的文章,但是我在按照他们的文章设置后,出现了一些问题,因此我这边在解决了问题后,总结一篇文章,发出来给大家借鉴一下。在此先说明一下idea的版本,是2020.1.3 设置动态模板,File…...
jenkins +docker+python接口自动化之jenkins容器安装python3(二)
jenkins dockerpython接口自动化之jenkins容器安装python3(二) 目录:导读 前提是在docker下已经配置好jenkins容器了,是将python安装在jenkins容器下的 1、先看你的jenkins是否安装好 2、以root权限进入jenkins容器࿱…...
go 命令行工具整理
这里会整理可能会使用到的命令行参数,比如 go build、go run,诸如此类。了解这些内容对我们工作会有什么帮助吗?更多的时候,是能让我们理解代码编译的意图,或者,给我们一种排查问题的手段。 比方说&#x…...
RuntimeError: CUDA out of memory
今天在训练模型的时候突然报了显存不够的问题,然后分析了一下,找到了解决的办法,这里记录一下,方便以后查阅。 注:以下的解决方案是在模型测试而不是模型训练时出现这个报错的! RuntimeError: CUDA out of…...
Kubernetes1.25中Redis集群部署实例
1、概述我们知道在 Kubernetes 容器编排平台中, 我们可以非常方便的进行应用的扩容缩, 同时也能非常方便的进行业务的迭代,本章主要讲解在Kubernetes1.25搭建Redis单实例和Redis集群主从同步的环境流程步骤, 如果是高频访问重要的线上业务我们最好是部署在物理机器上…...
C++11实现计算机网络中的TCP/IP连接(Windows端)
目录引言1、TCP2、IP2.1 IP路由器3、TCP/IP4、TCP/IP协议C11实现参考文献引言 TCP/IP 指传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol)。[1] 在TCP/IP协议簇中主要包含以下内容: TCP (传输控制协议) - 应用程序…...
Spring框架自定义实现IOC基础功能/IDEA如何手动实现IOC功能
继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用! 7.4 自定义Spring IOC 创建新模块,结构如图![[Pasted image 20230210173222.png]] 7.4.1 定义bean相关POJO类 7.4.1.1 定义propertyValue类 /** …...
pip离线安装windows版torch
文章目录前言conda创建虚拟环境安装torchtorch官网在线安装离线手动安装测试是否安装成功后记前言 学习的时候遇到几个机器学习相关的项目,由于不同的项目之间用到的依赖库不太一样,于是想利用conda为不同的项目创建不同的环境方便管理和运行࿰…...
Redis核心知识点
Redis核心知识点Redis核心知识点大全五种数据类型redis整合SpringBoot序列化问题渐进式扫描慢查询缓存相关问题数据库和缓存谁先更新缓存穿透缓存雪崩缓存击穿实际应用超卖问题分布式锁全局唯一ID充当消息队列Feed流附近商户签到HyperLogLog实现UV统计持久化RDBAOF持久化小结事…...
14. 最长公共前缀
14. 最长公共前缀 一、题目描述: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs [“flower”,“flow”,“flight”] 输出:“fl” 示例 2: …...
SignalR注册成Windows后台服务,并实现web前端断线重连
注意下文里面的 SignalR 不是 Core 版本,而是 Framework 下的 本文使用的方式是把 SignalR 写在控制台项目里,再用 Topshelf 注册成 Windows 服务 这样做有两点好处 传统 Window 服务项目调试时需要“附加到进程”,开发体验比较差…...
【前端笔试题二】从一个指定数组中,每次随机取一个数,且不能与上次取数相同,即避免相邻取数重复
前言 本篇文章记录下我在笔试过程中遇到的真实题目,供大家参考。 1、题目 系统给定一个数组,需要我们编写一个函数,该函数每次调用,随机从该数组中获取一个数,且不能与上一次的取数相同。 2、思路解析 数组已经有了…...
专栏关注学习
Node学习专栏(全网最细的教程) 【spring系列】 SpringCloud 前端框架Vue java学习过程 RocketMQ Spring Tomcat websocket 从头开始学Redisson 从头开始学Oracle 跟着大宇学Shiro 吃透Shiro源代码 Git基础与进阶 Java并发编程 Spring系列 手写…...
【手写 Vuex 源码】第八篇 - Vuex 的 State 状态安装
一,前言 上一篇,主要介绍了 Vuex 模块安装的实现,针对 action、mutation、getter 的收集与处理,主要涉及以下几个点: Vuex 模块安装的逻辑;Vuex 代码优化;Vuex 模块安装的实现;Vue…...
Mac下拉式终端的安装与配置 (iTerm2)
Mac下拉式终端的安装与配置 使用效果如图所示 安装前置软件 iTerm2 很可惜,如此炫酷的功能在原终端中并不能实现,我们需要借助iTerm2这个软件来实现。 官网链接:iTerm2 - macOS Terminal Replacement 我们点击download下载即可 配置 当我…...
使用 Spring 框架结合阿里云 OSS 实现文件上传的代码示例
使用 Spring 框架结合阿里云 OSS 实现文件上传的代码示例POM文件配置文件上传工具类控制层使用yaml配置文件(第二种用法,看公司要求)注入 OSSClient 对象及工具类(第二种用法,看公司要求)使用 Vue 前端代码…...
神经网络基础知识
神经网络基础知识 文章目录神经网络基础知识一、人工神经网络1.激活函数sigmod函数Tanh函数Leaky Relu函数分析2.过拟合和欠拟合二、学习与感知机1.损失函数与代价函数2. 线性回归和逻辑回归3. 监督学习与无监督学习三、优化1.梯度下降法2.随机梯度下降法(SGD)3. 批量梯度下降法…...
SpringBoot开发规范部分通用模板+idea配置【项目通用-1】
SpringBoot开发规范通用模板 1 分页插件使用 通过MybatisPlus配置分页插件拦截器 Configuration MapperScan("com.xuecheng.content.mapper") //拦截的mapper层 public class MybatisPlusConfig {//定义分页的拦截器Beanpublic MybatisPlusInterceptor getMybatisPl…...
Gemma-3-12b-it极简交互设计:侧边栏上传+主界面聚焦的UX逻辑解析
Gemma-3-12b-it极简交互设计:侧边栏上传主界面聚焦的UX逻辑解析 如果你用过一些AI工具,可能会被复杂的界面搞得晕头转向。左边是密密麻麻的参数滑块,右边是各种看不懂的模型选项,中间可能还有个需要填写的复杂表单。很多时候&…...
STM32 TM1637数码管驱动:IIC时序解析与Proteus仿真验证
1. 从零开始:为什么选择STM32和TM1637这对“黄金搭档”? 大家好,我是老李,一个在嵌入式领域摸爬滚打了十多年的“老码农”。今天想和大家聊聊一个非常经典且实用的组合:用STM32的GPIO口去驱动TM1637数码管模块。很多刚…...
分布式驱动下的直接横摆力矩控制MPC
分布式驱动 直接横摆力矩控制MPC 自己写的,效果如图踩下电门的那一刻,四台轮毂电机同时爆发的推背感让我意识到——这辆分布式驱动实验车和普通家用车根本不是一个维度的生物。但真正让我着迷的,是当它在80km/h急变道时,四个车轮像…...
NB-IOT开发实战|基于STM32的AT指令状态机优化设计与实现
1. NB-IOT开发中的AT指令痛点解析 第一次接触NB-IOT模块开发时,我被AT指令的响应处理折磨得不轻。最典型的场景就是发送AT指令后,代码里写满了delay_ms(100)这样的延时等待。实测发现这种写法存在三个致命问题: 首先,延时值很难确…...
RAC集群部署中高效配置SSH互信的两种实践方案
1. 为什么SSH互信是RAC集群的“生命线”? 搞过Oracle RAC的朋友都知道,集群部署前有座绕不开的“大山”——配置SSH互信。我第一次接触RAC时,也觉得这玩意儿有点麻烦,不就是几个节点之间能无密码登录吗?但真踩过几次坑…...
Qwen3-14b_int4_awq镜像解析:vLLM高效推理+Chainlit轻量前端协同方案
Qwen3-14b_int4_awq镜像解析:vLLM高效推理Chainlit轻量前端协同方案 1. 技术方案概述 Qwen3-14b_int4_awq是基于Qwen3-14b模型的int4量化版本,采用AWQ(Activation-aware Weight Quantization)技术进行压缩优化。该方案通过vLLM推…...
YOLOv5小目标检测实战:手把手教你集成NWD Loss提升模型精度(附完整代码)
YOLOv5小目标检测实战:集成NWD Loss的完整指南与调优策略 在无人机巡检、卫星图像分析等场景中,小目标检测一直是计算机视觉领域的难点。传统IoU(Intersection over Union)指标在面对像素级小目标时,往往因为轻微的定位…...
PyTorch 2.6降级实战:从卸载到重装2.5版本的完整操作流程
PyTorch 2.6降级实战:从卸载到重装2.5版本的完整操作流程 最近不少朋友在升级到PyTorch 2.6后遇到了各种兼容性问题,特别是使用ComfyUI这类工具时,节点启动失败的情况时有发生。新版本虽然带来了不少诱人的特性,但有时候稳定性和…...
基于Spring Boot的高校学生心理健康管理系统设计与实现
目录 需求分析与功能模块设计技术选型与架构设计数据库设计关键功能实现安全与隐私保护测试与部署扩展性考虑 项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 需求分析与功能模块设计 明确系统核心需…...
放弃 Python 脚本吧!OpenClaw 狂飙 30 万 Star 背后,跨境电商“一人公司”如何靠实在 Agent 真正落地?
摘要: 我是老王。最近跨境电商圈子疯了,开源 Agent 框架 OpenClaw(大龙虾)在一周内 GitHub Star 突破 30.8 万,甚至连 GPT-5.4 和 Gemini 3.1 Flash 都原生适配了。大家都在高喊“一人公司”时代降临,仿佛只…...
