VictoriaMetrics常见性能问题排查

天翼云开发者社区
• 阅读 107

本文分享自天翼云开发者社区《VictoriaMetrics常见性能问题排查》,作者:YT20

集群架构 VM集群由以下子模块组成 vmstorage: 存储原始数据,并根据指定时间范围和标签过滤条件等返回查询数据集 vminsert: 接收数据写入,并根据指标名和标签按一致性hash分发至集群中vmstorage节点 vmselect:执行查询请求,从数据所在的vmstorage节点获取数据 每个模块可以独立扩缩容。其中vmstorage各节点之间不互相通信,属于share nothing架构。如此可以增加集群可用性,也简化了集群维护、扩容。

VictoriaMetrics常见性能问题排查

慢摄入 VM慢摄入的常见原因如下:

  1. 内存不足(活跃时序数据缓存) vmstorage在内存中维护一个缓存,用于快速检索每个传入指标的内部序列ID。此缓存名为storage/tsid。VM会根据运行vmstorage的主机上的可用内存自动确定此缓存大小。如果缓存大小不足以容纳活跃时序数据的所有条目,则VM会从磁盘加载并重建缺失的条目并将其放入缓存中。这需要消耗额外的CPU时间和磁盘IO。

VM官方的Grafana仪表板包含了慢摄入(slow inserts)图表,其中显示了数据摄入过程中的storage/tsid缓存未命中率。如果图表显示慢摄入比例高于5%持续10分钟以上,则很可能当前的活跃时序数据与storage/tsid缓存大小不匹配了。

针对这个问题,有以下方法可以处理: 1)增加运行VM的主机上的可用内存,直到慢摄入比例低于5%:要么增加每个现有vmstorage节点的可用内存,要么向集群中添加更多的vmstorage结点。 2)减少活动时序数据的数量。VM官方Grafana仪表板包含一个显示活动时序数量的图表。最近版本的VM提供了cardinality explorer,可以有助于确定和修复高cardinality的数据源。

  1. 高周转率(Churn Rate) 在VM指标中,Churn Rate即旧时序数据被新时序数据取代的速率。当VM发现新的时序样本时,它需要为其在内部索引(即indexdb)中注册,以便在后续的select查询中快速定位。在内部索引中注册新时序的过程,比已经注册过的时序添加新样本的过程慢一个数量级。因此VM在高周转率情况下的数据摄入速率会比预期要慢许多。 VM官方Grafana仪表盘提供了Churn Rate图表,显示了过去24小时内注册的新时序数据的平均数量。如果这个数字超过了活动时序的数量,那就需要排查并修复高周转率的来源。高周转率最常见的问题来源是取值经常变化的标签。生产上应尽量避免这样的标签。cardinality explorer可以帮助识别这样的标签。

  2. 资源不足 VM官方Grafana仪表板包含资源利用率图表,显示内存利用率、CPU利用率、磁盘IO利用率和可用磁盘控件。为确保VM有足够的空闲资源来合理处理工作负载潜在高峰,建议在生产上保留一定的空闲资源,比如50%空闲CPU、50%空闲内存、20%可用磁盘空间。 如果VM组件没有足够的空闲资源,就会导致在工作负载增长时其性能显著下降。例如: 1)如果CPU空闲率接近0,则VM摄入数据时会出现较大延迟 2)如果空闲内存接近0%,则运行VM组件的OS可能没有足够的内存用于page cache。VM依靠page cache对最近摄入的数据进行快速查询。如果OS没有足够的可用内存用于page cache,则需要从磁盘中重新读取请求的数据,显著增加磁盘IO,并降低查询和数据接收速度。 3)如果可用磁盘空间低于20%,则VM无法对写入数据执行后台合并。这导致磁盘上的数据文件数量增加,从而降低了数据接收和查询的速度。

  3. 网络延迟 运行集群版VM时,需要保证vminsert和vmstorage之间网络延时要足够低。vminsert负责将写入数据成批打包并串行传给vmstorage,即只有前一个数据包回复ack以后才会发下一个。如果vminsert和vmstorage网络延迟高(比如跨地区部署),则数据摄入速率必然受限。

VM官方Grafana仪表板包含了vminsert组件的connection saturation图表。如果这个图表达到100%(1秒内),则vminsert和vmstorage之间的网络延迟必然有问题。另一个导致这个指标100%的可能性是vmstorage资源不足了。

  1. 混合部署影响 生产上要确保VM组件运行在相对独立的环境中,起码要保证环境内没有其他资源消耗大户程序。如果与其他非常耗资源的程序混合部署,则很难仅通过VM官方Grafana仪表板发现,此时需要检查运行VM的实例的资源利用率。

慢查询

VM可通过-search.logSlowQueryDuration命令行标记设置慢查询时间阈值(默认5s),并提供了/api/v1/status/top_queries接口来给返回执行时间最长的查询请求。排查解决VM慢查询问题的常用方法有:

1)直接扩容:为VM添加更多的CPU和内存,因此可以更快地执行慢查询请求;如果使用集群版本的VM,那么将vmselect节点迁移到具有更多CPU和内存的机器有助于提高慢查询请求的速度。查询性能总是受到处理查询的一个vmselect的资源的限制。例如,如果vmselect上的2 vCPU不能足够快地处理查询,那么将vmselect迁移到具有4vCPU的机器应该会将繁重的查询性能提高2倍。如果VM的官方Grafana仪表板上的Concurrent select图上接近极限,那么更倾向于向集群中添加更多的vmselect节点。有时,添加更多的vmstorage节点也有助于提高慢查询请求的速度。

2)重写慢查询请求,使它们变得更快。但仅仅通过观察很难确定查询请求是否缓慢。VM提供了查询跟踪功能,可以帮助确定慢查询的来源。另请参阅本文,其中解释了如何确定和优化慢速查询。

在实践中,由于子查询的使用不当,会生成许多慢查询请求。如果不清楚子查询是如何工作的,建议避免子查询。在不知道的情况下创建子查询很容易。例如,rate(sum(some_metric))根据MetricsQL查询的隐式转换规则隐式转换为子查询rate ( sum ( default_rollup ( some_metric[1i] ) ) [1i:1i] )。此查询很可能不会返回预期的结果,应该改为使用sum(rate(some_metric))。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
2年前
Redis 集群之 Redis
Redis集群官方推荐方案RedisCluster集群rediscluster  通过分片实࣫容量扩展  通过主从复制实࣫节点的高可用  节点之间互相通信  每个节点都维护整个集群的节点信息  rediscluster把所有的物理节点映射到\016383\slotЇ,cluster负责维护node<sl
Wesley13 Wesley13
2年前
MongoDB分片+副本集搭建
一、概念把大量的数据,根据某个条件分开来存储;举例:1000W条用户数据,根据用户名,ah开头的用户放入节点1,is的放入2,tz的放入3;分片需要:需要1n个节点,需要一个路由进程,需要一个配置库(配置节点);当客户端发送查询请求后,通过路由进程,去配置库查询用户所需的数据在哪个节点中;然由路由进程去节点取数据,返回结果到客
Easter79 Easter79
2年前
TiDB集群大规模删除实践
TiDB集群大规模删除实践一、背景集群在写入了一定的时间后,是存在一些历史可以删除的数据的,为了对集群的空间释放,我和业务一并讨论和计划了待删除的表,但是在drop数据时发现集群QPS有抖动,经过排查发现触发了compaction的流控集群配置集群版本:v3.0.5集群配置:普通SS
Stella981 Stella981
2年前
CentOS 7下 部署Redis
redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用、可扩展等问题,redis集群提供了以下两个好处:1)将数据自动切分(split)到多个节点2)当集群中的某一个节点故障时,redis还可以继续处理客户端的请求一个Redis集群包含16384个哈希槽(hashslot
Stella981 Stella981
2年前
Redis 高可用及分片集群,说了你也不懂
Redis简介Memcached:优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程读写性能高。缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高Redis:优点:高性能读写、多数据类型
Stella981 Stella981
2年前
Redis 集群
集群的概念早在Redis3.0之前讨论了,3.0才在源码中出现。Redis集群要考虑的问题:1.节点之间怎么据的同步,如何做到数据一致性。一主一备的模式,可以用Redis内部实现的主从备份实现数据同步。但节点不断增多,存在多个master的时候,同步的难度会越大。2.如何做到负载均衡?请求量大的时候,如何将请求尽量均分到各个服
Stella981 Stella981
2年前
Redis cluster的核心原理分析
一、节点间的内部通信机制1、基础通信原理(1)rediscluster节点间采取gossip协议进行通信跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间不断通信,保持整个集群所有节点的数据是完整的维护集群的元数据用得,集中式,一种叫做gossip集中式:好处在于,元数据的更新和读取,时效性非常好,
Stella981 Stella981
2年前
Linux集群架构
一、集群介绍集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。集群的特点:高性能(Performance)、价格有效(Costeffectiveness)、可伸缩性(Scalability)、高可用性(Ava
Stella981 Stella981
2年前
K8s StatfulSet使用总结
StatefulSet:在1.3以前K8s中StatefulSet叫PetSet(宠物集),由此也可看出StatefulSet是关注个体,而非群体。StatefulSet要满足以下几点:稳定且唯一的网络标识符;如:Redis集群,在Redis集群中,它是通过槽位来存储数据的,假如:第一个节点是0~1000,第二个节点是1
Stella981 Stella981
2年前
Linux实战教学笔记30:Nginx反向代理与负载均衡应用实践
1.1集群简介简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。这些服务器之间可以彼此通信,协同向用户提供应用程序,系统资源和数据,并以单一系统的模式加以管理。当用户客户机请求集群系统时,集群给用户的感觉就是
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
494
粉丝
8
获赞
37