VictoriaMetrics常见性能问题排查

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

本文分享自天翼云开发者社区《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
3年前
Redis 集群之 Redis
Redis集群官方推荐方案RedisCluster集群rediscluster  通过分片实࣫容量扩展  通过主从复制实࣫节点的高可用  节点之间互相通信  每个节点都维护整个集群的节点信息  rediscluster把所有的物理节点映射到\016383\slotЇ,cluster负责维护node<sl
Wesley13 Wesley13
3年前
MongoDB分片+副本集搭建
一、概念把大量的数据,根据某个条件分开来存储;举例:1000W条用户数据,根据用户名,ah开头的用户放入节点1,is的放入2,tz的放入3;分片需要:需要1n个节点,需要一个路由进程,需要一个配置库(配置节点);当客户端发送查询请求后,通过路由进程,去配置库查询用户所需的数据在哪个节点中;然由路由进程去节点取数据,返回结果到客
Easter79 Easter79
3年前
TiDB集群大规模删除实践
TiDB集群大规模删除实践一、背景集群在写入了一定的时间后,是存在一些历史可以删除的数据的,为了对集群的空间释放,我和业务一并讨论和计划了待删除的表,但是在drop数据时发现集群QPS有抖动,经过排查发现触发了compaction的流控集群配置集群版本:v3.0.5集群配置:普通SS
Stella981 Stella981
3年前
CentOS 7下 部署Redis
redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用、可扩展等问题,redis集群提供了以下两个好处:1)将数据自动切分(split)到多个节点2)当集群中的某一个节点故障时,redis还可以继续处理客户端的请求一个Redis集群包含16384个哈希槽(hashslot
Stella981 Stella981
3年前
Redis cluster的核心原理分析
一、节点间的内部通信机制1、基础通信原理(1)rediscluster节点间采取gossip协议进行通信跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间不断通信,保持整个集群所有节点的数据是完整的维护集群的元数据用得,集中式,一种叫做gossip集中式:好处在于,元数据的更新和读取,时效性非常好,
Stella981 Stella981
3年前
Linux集群架构
一、集群介绍集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。集群的特点:高性能(Performance)、价格有效(Costeffectiveness)、可伸缩性(Scalability)、高可用性(Ava
Stella981 Stella981
3年前
K8s StatfulSet使用总结
StatefulSet:在1.3以前K8s中StatefulSet叫PetSet(宠物集),由此也可看出StatefulSet是关注个体,而非群体。StatefulSet要满足以下几点:稳定且唯一的网络标识符;如:Redis集群,在Redis集群中,它是通过槽位来存储数据的,假如:第一个节点是0~1000,第二个节点是1
Stella981 Stella981
3年前
Linux实战教学笔记30:Nginx反向代理与负载均衡应用实践
1.1集群简介简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。这些服务器之间可以彼此通信,协同向用户提供应用程序,系统资源和数据,并以单一系统的模式加以管理。当用户客户机请求集群系统时,集群给用户的感觉就是
京东云开发者 京东云开发者
4个月前
广告在线模型系统负载均衡策略实践
一、背景简介1.1、现状•实际生产环境中,复杂业务系统对分布式服务集群架构的依赖。•服务集群异质化节点的容器化部署,机器性能超卖现象不可避免、性能不均情况时有发生。•服务集群各硬件组件出错率不可避免•集群内负载不均,整体资源利用率低。•单节点过载容易触发集
弹性存储关键技术介绍
关键技术:(1)一致性HASH算法,保证数据分片尽量均衡在不同的故障域上,提升存储数据的安全可靠性。以数据唯一标识符、当前存储集群的拓扑结构以及数据备份策略作为一致性HASH算法的输入,可以随时随地通过计算获取数据所在的底层存储设备并直接通信获取或者写入数据,从而避免查表操作,实现去中心化和高度并发,将数据均衡的存储到各个存储节点,实现数据存储的负载均衡
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
696
粉丝
15
获赞
40