TSDB之KairosDB:Tag对性能的影响测试

简介:

在使用TSDB时,在进行数据建模与项目实施时,都需要考虑如何设置标签?
按常识标签的数量,对性能是有影响的,所以在如何平衡“用户统计需求”与“性能”之间,我们需要进行权衡。
那么,问题出现了:

命题1:是否可以不断增加标签?

结论:不可以!增加标签会牺牲性能
标签个数从3到6,写入性能下降20%,读出性能下降40%。
应谨慎选择标签,当新建一些有用的标签时,也应考虑去除一些无用的标签。

命题2:标签值的值域对KairosDB的性能有多大影响?

比如地理位置这样的标签,值域是很窄的,不会上千。
但host这样的标签,会随着用户的设备规模增加。
而如果使用一些带时间信息的标签,其值域则随着时间的推移会不断增加

结论:有较大的影响
标签值域从1000做到30000(扩大30倍),写入性能下降14%,读出性能下降30%。

命题3:应该选择多少标签较为合适?

结论:建议选择5个以下的标签数

其它总结

总结1:每增加一个标签,rowkey增加标签key=value的字符串长度

由于kairosdb与opentsdb不同,以下是其生成的真实rowkey:
rowkey=0x73797374656d2e6370752e7573616765000000015923d3cc00000d6b6169726f735f646f75626c657461676b6b6b6b6b6b6b6b6b6b6b6b6b313d746167767676767676767676767676363a7461676b6b6b6b6b6b6b6b6b6b6b6b6b323d74616776767676767676767676767631313a7461676b6b6b6b6b6b6b6b6b6b6b6b6b333d7461677676767676767676767676763231333a
转成string后
system.cpu.usage____Y#ÓÌ___kairos_doubletagkkkkkkkkkkkkk1=tagvvvvvvvvvvvv6:tagkkkkkkkkkkkkk2=tagvvvvvvvvvvvv11:tagkkkkkkkkkkkkk3=tagvvvvvvvvvvvv213:
可以看出,对于kairosdb来说,是直接使用字符串相加的方式,生成rowkey的,所以指标名与标签的长度越长,rowkey越长。

总结2:标签与值,应当选择与时间无关的属性

因为与时间有关的属性,其标签值数量总是会随着运行时长不断增长,导致string_index表会一直增长。
像一些项目中的日志文件名,就含有时间属性,因此不应该用来作为标签。

总结3:kairosdb应进行改进,避免write failed无返回值

通过阅读kairosdb的源代码可以发现,其内部使用了以下代码逻辑:
接收请求的线程,只是简单的把请求收到,并转存到数据桶中
数据桶有个数配置,使用配置项kairosdb.datastore.cassandra.write_buffer_job_queue_size来设置
使用独立的线程,消费数据桶。
所以当数据桶消费失败时(如无法连接到cassandra、java线程池满拒绝任务),无法把消息通知到kairosdb的client,导致client会以为写入是顺利的,一直不停的写入。
通过修改kairosdb的TelnetServer模块,可实现写入失败时,阻塞client,避免client一直写入数据,导致数据丢失。

总结4:cassandra与kairosdb在windows平台无法充分利用机器性能

在测试过程中搭建了多个环境,发现cassandra与kairosdb无法在windows平台上充分利用机器性能,通过一些配置,都无法把CPU使用率与RAM提高。
但在linux下无此问题,虚拟机里的性能甚至好于windows宿主机。

总结5:rowkey的查询原理及租户或指标间的影响性

kairosdb在处理写入或查询操作时,其过程如下:

  1. 接收查询参数:指标、时间范围、标签范围、汇聚参数
  2. 根据“指标与时间范围”,生成rowkey_range_start与rowkey_range_end
  3. 向cassandra查询rowkey_range_start与rowkey_range_end间的所有rowkey,生成match1_rowkeys
  4. 针对match1_rowkeys进行计算,分析是否包含了“标签范围”中指定的标签,将包含的rowkeys,生成match2_rowkeys
  5. 根据match2_rowkeys查询数据,并根据“汇聚参数”进行汇聚与返回
    由于上述step3 cassandra可以快速的利用集群能力查询出所在范围段内的rowkey,所以这里的成本很低,最大的成本在于step 4,这里需要大量的数据contains计算。

所以从上述原理可以看出:

  1. 指标数量增加,影响非常小,因为step3的成本很低
  2. 时间的增加,影响非常小,因为step3的成本很低
  3. 标签组合出来的值域越大,性能越低。因为导致step4的成本较高
    测试方案与数据

编写一个程序,使用不同的tag组合,20线程并发写入与10线程并发读取3000万笔指标,组合如下:

序号 标签数 标签组合 测试次数 写入TPS 读取TPS rowkey长度
1 3 1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~10'}
2. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~30'}
3. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~1000'}
3 33406 1.55 148
2 6 1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~10'}
2. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~30'}
3. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~1000'}
4. TagPolicy{key='tagkkkkkkkkkkkkk4', value='tagvvvvvvvvvvvv0~10'}
5. TagPolicy{key='tagkkkkkkkkkkkkk5', value='tagvvvvvvvvvvvv0~10'}
6. TagPolicy{key='tagkkkkkkkkkkkkk6', value='tagvvvvvvvvvvvv0~10'}
2 26860 0.95
3 9 1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~10'}
2. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~30'}
3. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~1000'}
4. TagPolicy{key='tagkkkkkkkkkkkkk4', value='tagvvvvvvvvvvvv0~10'}
5. TagPolicy{key='tagkkkkkkkkkkkkk5', value='tagvvvvvvvvvvvv0~10'}
6. TagPolicy{key='tagkkkkkkkkkkkkk6', value='tagvvvvvvvvvvvv0~10'}
7. TagPolicy{key='tagkkkkkkkkkkkkk7', value='tagvvvvvvvvvvvv0~10'}
8. TagPolicy{key='tagkkkkkkkkkkkkk8', value='tagvvvvvvvvvvvv0~10'}
9. TagPolicy{key='tagkkkkkkkkkkkkk9', value='tagvvvvvvvvvvvv0~10'}
1 23610 0.8 364
4 4 1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~10', uniqure=true}
2. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~30', uniqure=true}
3. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~1000', uniqure=true}
4. TagPolicy{key='tagkkkkkkkkkkkkk4', value='tagvvvvvvvvvvvv0~300000', uniqure=false}
1 26065
5 3 1. TagPolicy{key='tagkkkkkkkkkkkkk1', value='tagvvvvvvvvvvvv0~1000', uniqure=true}
2. TagPolicy{key='tagkkkkkkkkkkkkk3', value='tagvvvvvvvvvvvv0~30000', uniqure=false}
3. TagPolicy{key='tagkkkkkkkkkkkkk2', value='tagvvvvvvvvvvvv0~300', uniqure=true}
1 28841 1.1 154
目录
相关文章
|
11天前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
1月前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
86 2
|
8天前
|
监控 测试技术 PHP
性能和压力测试
【10月更文挑战第10天】性能和压力测试
105 60
|
1月前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
4天前
|
测试技术 PHP 开发工具
php性能监测模块XHProf安装与测试
【10月更文挑战第13天】php性能监测模块XHProf安装与测试
10 0
|
1月前
|
敏捷开发 安全 测试技术
软件测试的艺术:确保质量与性能的平衡之道
【9月更文挑战第24天】在软件开发的海洋中,测试是导航灯塔,指引着项目安全抵达质量的彼岸。本文将深入探讨软件测试的核心原则、方法论以及如何通过精心设计的测试策略来保障产品的可靠性和性能。我们将从测试的基础知识出发,逐步深入到高级测试技巧,最终展示如何通过实际案例来应用这些知识以确保软件的成功交付。
|
1月前
|
测试技术 Python
软件测试的艺术:确保质量与性能
【9月更文挑战第19天】在数字化时代,软件已成为我们生活的一部分。然而,随着软件复杂性的增加,如何确保其质量和性能成为了一个挑战。本文将探讨软件测试的重要性,介绍常见的测试类型和策略,并提供实用的代码示例来帮助读者更好地理解和应用这些测试方法。无论你是开发人员、测试工程师还是项目管理者,这篇文章都将为你提供有价值的见解和技巧。
|
1月前
|
存储 Java 关系型数据库
“代码界的魔法师:揭秘Micronaut框架下如何用测试驱动开发将简单图书管理系统变成性能怪兽!
【9月更文挑战第6天】Micronaut框架凭借其轻量级和高性能特性,在Java应用开发中备受青睐。本文通过一个图书管理系统的案例,介绍了在Micronaut下从单元测试到集成测试的全流程。首先,我们使用`@MicronautTest`注解编写了一个简单的`BookService`单元测试,验证添加图书功能;接着,通过集成测试验证了`BookService`与数据库的交互。整个过程展示了Micronaut强大的依赖注入和测试支持,使测试编写变得更加高效和简单。
62 4
|
2月前
|
消息中间件 Kafka 测试技术
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
|
2月前
|
缓存 NoSQL 测试技术
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能