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 |

时间: 2025-01-21 01:43:37

TSDB之KairosDB:Tag对性能的影响测试的相关文章

SQL Server中多表连接时驱动顺序对性能的影响

原文:SQL Server中多表连接时驱动顺序对性能的影响   本文出处:http://www.cnblogs.com/wy123/p/7106861.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他)   最近在SQL Server中多次遇到开发人员提交过来的有性能问题的SQL,其表面的原因是表之间去的驱动顺序造成的性能问题,具体表现在(已排除其他因素影响的情况下),存储过程偶发性的执行时间超出预期,甚至在调

CSS的!important规则对性能有影响吗

    最近在做项目中发现很多CSS代码里面都使用!important去覆盖原有高优先级的样式.按照常理来说,越是灵活的东西,需要做的工作就会更多.所以 想当然的认为像!important这样灵活.方便的规则如果用得多的话肯定会对性能有所影响.基于这种考虑,本来想把所有的这些样式通过提高优先级给去 掉的.不过后来一想,还是去google一下吧,猜想一般都是不可靠的.于是查到了这篇文章Is !important bad for performance?.下面是大概意思:        firefo

Oracle中利用DETERMINISTIC声明提高性能(二) 参数顺序对性能的影响

虽然Oracle提供的DETERMINISTIC声明,本意是确保函数的确定性,但是如何合理利用,是可以用来提高性能的. 这一篇描述参数顺序对性能的影响. 上一篇文章提到了,如果希望通过DETERMINISTIC来获取性能收益,那么采用批量方式是必须的,而且数组的值相对而言越大对于性能的帮助会越大. 但是这里存在一个问题,如果需要处理的数据量本身很大,虽然重复的输入参数不少,但是总的参数不同的值更多,那么即使将ARRAY的值设置到1000,能带来的性能收益也很有限,因为即使1000次调用,也不能保

Oracle中利用DETERMINISTIC声明提高性能(一) ARRAY对性能的影响

虽然Oracle提供的DETERMINISTIC声明,本意是确保函数的确定性,但是如何合理利用,是可以用来提高性能的. 这一篇描述ARRAY对性能的影响. 关于DETERMINISTIC函数,以前已经写过一些文章了,不过对于DETERMINISTIC声明用来提高性能只是简单提了一句,并没有展开来说. 由于函数声明了DETERMINISTIC特性,Oracle对于相同的输入,可以只运行一次,而这对于代码比较复杂,调用时间较长的函数而言,确实可以提高性能. 但是在上面的几篇文章中也提到了,DETER

JAVA异常是否对于性能有影响

  在对OneAPM的客户做技术支持时,我们常常会看到很多客户根本没意识到的异常.在消除了这些异常之后,代码运行速度与以前相比大幅提升.这让我们产生一种猜测,就是在代码里面使用异 常会带来显著的性能开销.因为异常是错误情况处理的重要组成部分,摒弃是不太可能的,所以我们需要衡量异常处理对于性能影响,我们可以通过一个实验看看异常处理的对于性能的影响. 实验 我的实验基于一段随机抛出异常的简单代码.从科学的角度,这并非完全准确的测量,同时我也并不了解HotSpot 编译器会对运行中的代码做何动作.但无

SQL where条件顺序对性能无影响

转自:无尽空虚 原帖地址:http://blog.sina.com.cn/s/blog_4586764e0100mdif.html   经常有人问到oracle中的Where子句的条件书写顺序是否对SQL性能有影响,我的直觉是没有影响,因为如果这个顺序有影响,Oracle应该早就能够做到自动优化,但一直没有关于这方面的确凿证据.在网上查到的文章,一般认为在RBO优化器模式下无影响(10G开始,缺省为RBO优化器模式),而在CBO优化器模式下有影响,主要有两种观点: a.能使结果最少的条件放在最右

前端乱码-asp.net前端页面的乱码对程序性能有影响吗?

问题描述 asp.net前端页面的乱码对程序性能有影响吗? .net程序写好的页面查看源代码时,前面代码部分会出现很长的而一段乱码,网上找资料说是.net程序加密过程,这段乱码删掉与不删掉对程序的性能有影响吗?请有过研究的前辈告知,我也想了解一下! 解决方案 Asp.net中的页面乱码的问题Asp.net中的页面乱码的问题Asp.net中的页面乱码的问题 解决方案二: 那是嵌入的.net代码,被编译后的结果,删了,就完蛋了

大型网站的 HTTPS 实践(二):HTTPS 对性能的影响

大型网站的 HTTPS 实践(二):HTTPS 对性能的影响 1 前言 HTTPS 在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降低用户访问速度,增加网站服务器的计算资源消耗. 本文主要介绍 https 对用户体验的影响. 2 HTTPS 对访问速度的影响 在介绍速度优化策略之前,先来看下 HTTPS 对速度有什么影响.影响主要来自两方面: 协议交互所增加的网络 RTT(round trip time). 加解密相关的计算耗时. 下面分别介绍一下. 2.1

多核开发中中断绑对性能的影响有多大?

问题描述 多核开发中中断绑对性能的影响有多大? 描述: 想采用PowerPC的T4240开发一款数据转发模块,数据量大小不一小到几KB大到MB.现在不能确定小包数据会对效率有什么影响.有个想法是将小包数据的中断绑定到固定的核心上去,大包数据绑定到其他核心. 目前无法量化测试,请问有什么好的方法或思路?