VictoriaMetrics 查询性能测试

Vectoria Metrics 查询性能测试用例

原本是测试某款产品和 vm的对比, 某款产品没有对比意义,已经移除相关对比数据, 只看vm的查询性能即可

测试结果

对比项 vectoria metircs
写入吞吐 886k/s(1.66m/s)
压缩率(源json) 0.22%
查询性能(1并发) 6.19
查询性能(10并发, 7个用例同时进行10、50、100个时间段查询,统计总用时) 34.18 s
查询性能(50并发) 560.47
查询性能(100并发) 2040.83
查询性能(50并发,47.5w/s写) 575.19

测试方案

单次查询脚本

  1. 双方准备测试用例sql
  2. 用例均通过双方的query api接口进行查询,均通过response中的执行耗时进行用例耗时统计
  3. 循环测试用例,每个用例连续执行3遍,新用例执行前清除系统cache
  4. 收集所有用例执行时间
  5. 分别统计 冷执行(用例第一次执行) 和 热执行(用例第二次和第三次执行)所耗时间
  6. 进行对比

VictoriaMetrics 写入吞吐和数据压缩比 测试

测试结果

对比项 X2.0 vectoria metircs score
写入吞吐 x 886k/s(1.66m/s)
压缩比(源json) x 0.22%

benchmark 数据源配置

pod 4c6G

数据生成速率

1
2
3
3000*1230 active time series
scrapeInterval 10秒,1230*3K/10 369k samples/sec
每10分钟 更新10% time series

数据协议,prometheus remote write

数据格式(转json 后)

1
2
3
{"metric":{"__name__":"node_scrape_collector_success","job":"node_exporter","instance":"host-2362","collector":"mdadm","replica":"0","revision":"r0","url_replica":"0"},"values":[1],"timestamps":[1724313603243]}
{"metric":{"__name__":"node_textfile_scrape_error","job":"node_exporter","instance":"host-1398","replica":"0","revision":"r5","url_replica":"0"},"values":[0],"timestamps":[1724313609919]}
{"metric":{"__name__":"node_textfile_scrape_error","job":"node_exporter","instance":"host-1902","replica":"0","revision":"r0","url_replica":"0"},"values":[0],"timestamps":[1724313604325]}

指标数据逻辑存储模型

指标数据逻辑存储模型

常见的时序数据库的数据模型,主要分成单值模型和多值模型

单值模型是根据业务指标数据建模,按照单个指标的细粒度进行数据使用和逻辑存储,如下所示,一行数据只有一个指标值,即value列。目前采用单值模型的时序数据库,有OpenTSDB、 KairosDB、Prometheus等。

1
2
3
4
单值模型:
time host metric value
2026-08-08 10:00:00 web01 cpu_usage 72
2026-08-08 10:00:00 web01 io_usage 31

多值的模型则是针对数据源建模,我们每一行数据针对的是一个数据源,它的被测量的多个指标在同一列上,如下所示,一行数据有多个指标值,即有cpu和io两列。目前采用多值模型的时序数据库,有InfluxDB、TimescaleDB等。

1
2
3
多值模型:
time host cpu_usage io_usage
2026-08-08 10:00:00 web01 72 31

可以把两者理解为:

  • 单值模型:一条时序记录只描述一个指标。
  • 多值模型:一条时序记录同时描述同一数据源在同一时刻的多个指标。

严格来说,多值模型中的多个指标是放在同一行的不同列/字段中,而不是同一列。


2024 年终总结

bye 2024 , hi 2025

写得有点晚,没有赶上新年,只能在除夕思索片刻,提笔记录下过去的一年

回顾计划

先说2023年底定的目标,2024大多都没有完成,最主要目标大致为3个:

  1. 首先是300公里的跑步,大概完成了一半,最主要是为了跑马拉松,提前2个月训练跑的,日常几乎不会去跑,倒是今年跟着同事经常去打羽毛球,
  2. 其次每个月的俩篇blog,几乎都暂停了,其实记录的很多,但是整理和发布出来太少。年底还接了5门课程的开发和录制,这个对我帮助挺大,从没有哪个会要求这么全面的了解一门技术,做课程你必须全面,所以相当于完整的复习了一遍对应的知识
  3. 最后是要点亮github 一半的格子,这个也是几乎没动了,之前还想从0开始做一款数据分析的系统软件,今年完全没有动力了,在前几年这个可能还有一定的先进性,现在来看已经意义不大,在经济下行的今天,头部的几家公司活的都很艰难,个人开发者再切入门槛这么高的领域,几乎没有成功的可能性

虽然大都没完成,今年总结时,可能是年纪大了,脸皮厚了,反而不再对自己感到内疚


macos 环境配置

应用安装

WPS 国际版、IDEA、Typora、微信、腾讯会议、阿里云盘、Chrome、Lemon、Iterm 、金山文档、QQ、VSCode、Clash Verge、企业微信..

开发环境

JAVA

SDKMan 因为它支持JVM的SDK,如Java、Groovy、Scala、Kotlin和Ceylon。还支持Gradle、Maven、Spring Boot和许多其他软件(Flink ,ActiveMQ,hadoop,spark)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# usage

sdk list java
sdk list gradle
sdk list maven

#Available Java Versions for macOS ARM 64bit
================================================================================
# Vendor | Use | Version | Dist | Status | Identifier
#--------------------------------------------------------------------------------
# Zulu | | 23.0.1.fx | zulu | | 23.0.1.fx-zulu
# 指定 Identifier
sdk install java 23.0.1.fx-zulu
sdk install maven
sdk install gradle

sdk current java
sdk uninstall scala 3.4.2

Column-Stores vs. Row-Stores

论文标题:Column-Stores vs. Row-Stores: How Different Are They Really?

论文: http://www.cs.umd.edu/~abadi/papers/abadi-sigmod08.pdf

概述

从论文的标题可以看出这篇论文不是陈述一种新的技术、架构,而更偏议论文一点,它主要的目的在于搞清楚对于分析类的查询为什么Column-Store比Row-Store好那么多?好在哪里?

一般认为原因是:

分析类查询往往只查询一个表里面很少的几个字段,Column-Store只需要从磁盘读取用户查询的Column,而Row-Store读取每一条记录的时候你会把所有Column的数据读出来,在IO上Column-Store比Row-Store效率高很多,因此性能更好。

而本文的目的是要告诉你Column-Store在存储格式优势只是一方面,如果没有查询引擎上其它几个优化措施的配合,性能也不会太好的,这篇论文认为Column-Store在查询引擎层有以下几种大的优化手段:

  • 块遍历(Block Iteration)
  • 压缩(Compression)
  • 延迟物化(Late Materialization)
  • Invisible Join

其中前三点是前人就已经总结过的、在现有Column-Store上实现过了的,而最后一点是本论文的创新。下面我们一一看一下这几种优化手段的细节,最后再看看它们优化效果的对比。


指标体系的应用场景 - 动态阈值

指标体系的应用场景 - 动态阈值

在指标体系的应用场景中,基于指标的告警也是指标数据的一个重要应用。

基于指标的告警一般有以下几种类型:

  • 静态阈值:大于/小于 某个具体的值则产生告警(对于明细数据,还可以用中位值/分位值进行阈值判断)
  • 同环比: 同比/环比 变化率/变化值 上升/下降超过多少产生告警
  • 动态阈值: 对比历史同时间段的基线值 产生告警
  • 异常检测:基于历史数据检测度量的异常行为。异常检测会检测指标的行为何时与过去不同,并考虑趋势和季节性
  • 离群点异常检测:离群点异常检测组内与其他成员相比异常的成员,主要用于判断指标的分组组合中哪些和其他组合差异过大
  • 预测告警:预测指标在未来的表现。通过在超出阈值之前发出警报

本篇主要介绍动态阈值的实现方案:


2023 年终总结

2023 年终总结

岁月真是匆匆,一年又一年,很多时间无暇思索,也就只在年初和年末 多愁善感,而今尤盛,因为今年终于成了程序员35岁退休热梗中的预退休人员,往后每多拿一天的薪水,都是命运的恩赐😂

每到年末,都会感叹一年中虚度的光阴,遗憾没有达成的目标,这时候都要给自己找一个冠冕堂皇的借口,好让自己逃出自我讽刺的情绪旋涡,从而让自己在新的一年重新出发

每年的目标都很燃,很艰苦,每年都达不到,也想着躺平,干嘛为难自己,但是想着再不拼博,那就真的拼不动了,35岁而已,还有一战之力,那么下一个十年到45岁之后呢?我会过什么样的人生,我又能过什么样的人生?难不成身体好铁人三项,干不动中年三宝

所以该立的目标还是不能少,做过的傻事不能忘!


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×