产品性能自测

*本文是从公司内网KB转过来的,格式有点混乱懒得改了QAZ~~

目录 (Table of Contents)

  • FAQ
  • 一、测试目的
  • 二、测试环境
  • 三、测试方法
  • 四、测试结果
    • 写:
    • 读:
  • 五、结论
    • 1、指标库写性能:
    • 2、指标库读性能:

FAQ

1.写入能力:多少个15秒监控周期的主机,或180秒监控周期的网络设备的数据写入


假设现场1个资源每15 S上报100个指标,则每分钟上报400个,


若部署单节点Cassandra,在redis集群状况良好的情况下,每分钟可写入80W个指标,可支持800000/400=2000个资源左右;


若部署Cassandra 集群,每分钟可写入110W个指标,可支持1100000/400=2750个资源左右;


考虑到稳定性可酌情减少资源量或增加配置。


2.读出能力:每秒完成指定数据点数查询的TPS性能峰值,以便预测可以支持什么数量的仪表盘


在三台4C*16G的Cassandra节点的配置下,稳定查询的前提下,每分钟至少400条并发请求(每条请求至少6000条元数据,大约为15分钟的数据)。






一、测试目的


测试在指定硬件条件下,指标库写入能力与读取能力。


二、测试环境








































































ip cpu 内存 磁盘 用途 备注
个人电脑 4核 16G 部署jmeter
10.1.53.37 6 8G 部署jmeter-server

通过jmeter来发送测试请求,


这些机器同时部署着其他产品。

10.1.53.38 4核 16G
10.1.53.65 4核 8G
10.1.61.10 4核 24G
10.1.53.39 4核 16G 指标库、ES、租户等组件 该机器主要用来部署指标库
10.1.61.117 4核 16G 38G kairosdb、omp等 kairosdb 堆内存为默认的3g
10.1.61.118 4核 16G 38G Cassandra

kairosdb 堆内存为为默认的4g,


计算公式 max(min(1/2 ram, 1024MB),min(1/4 ram, 8GB))




三、测试方法


测试工具为Jmeter,通过调用指标库相应的openApi测试,用jconsole 监控进程占用资源变化。


四、测试结果

写:


Ramp-up Period 决定多长时间启动所有线程。如果使用10个线程,ramp-up period是100秒,那么JMeter用100秒使所有10个线程启动并运行。每个线程会在上一个线程启动后10秒(100/10)启动。


monitor 指标上报的频率是15S一次,故此处从 以15S/s 的频率启动一个上报线程开始测试。


如组1,测试逻辑为:


每15秒启动一个线程,单个线程每次上报25个指标,重复上报500次,每分钟指标写入请求次数为5W条。


jmeter-server为1,表示只在本机运行测试;若为4,表示在4个机器上同时对指标库发起请求测试。





1.kairosdb 自带写入统计指标:


kairosdb.metric_counters - Counts the number of data points received since the last
report. Tags are used to separate one metric from another.(统计自上次上报后接收的数据量。标签用于区分指标。)



kairosdb 统计结果:






“1”处为组别12的测试结果,“2”处为直接调用kairosdb restApi 写入接口,“3”处为组别14 的结果。结果与指标库的统计日志一致。

2.时间有限,每组测试时间间隔较短,因此可能会对CPU、内存以及Cassandra状态产生影响,使结果不够准确。



注:


【1】:指标库redis 报内存不够,异常: Can’t save in background: fork: Cannot allocate memory


【2】:短时间插入大量指标会导致未压实的sstable数据太多,压实进程报可用磁盘空间不足,重新压实…恶性循环。







1
2
3
4
5
6
7
<![CDATA[[root@localhost data_points-1e09be40c3c811e7977aa147ea7baf03]# /opt/cassandra/bin/nodetool compactionstats -H
pending tasks: 2
- kairosdb.data_points: 2
id compaction type keyspace table completed total unit progress
ef340e00-d4d8-11e7-a239-0d717928a22e Compaction kairosdb data_points 6.23 GB 11.42 GB bytes 54.56%
Active compaction remaining time : 0h05m32s
]]>






Cassandra报异常:





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<![CDATA[WARN  [CompactionExecutor:46] 2017-11-28 22:26:29,785 CompactionTask.java:91 - insufficient space to compact all requested files BigTableReader(path=&#39;/opt/dbdata/cassandra/data/kairosdb/data_points-1e09be40c3c811e7977aa147ea7baf03/ma-216-big-Data.db&#39;), BigTableReader(path=&#39;/opt/dbdata/cassandra/data/kairosdb/data_points-1e09be40c3c811e7977aa147ea7baf03/ma-237-big-Data.db&#39;)
ERROR [CompactionExecutor:46] 2017-11-28 22:26:29,827 CassandraDaemon.java:195 - Exception in thread Thread[CompactionExecutor:46,1,main]
java.lang.RuntimeException: Not enough space for compaction, estimated sstables = 1, expected write size = 2395303467
at org.apache.cassandra.db.compaction.CompactionTask.checkAvailableDiskSpace(CompactionTask.java:278) ~[apache-cassandra-3.5.jar:3.5]
at org.apache.cassandra.db.compaction.CompactionTask.runMayThrow(CompactionTask.java:126) ~[apache-cassandra-3.5.jar:3.5]
at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) ~[apache-cassandra-3.5.jar:3.5]
at org.apache.cassandra.db.compaction.CompactionTask.executeInternal(CompactionTask.java:82) ~[apache-cassandra-3.5.jar:3.5]
at org.apache.cassandra.db.compaction.AbstractCompactionTask.execute(AbstractCompactionTask.java:60) ~[apache-cassandra-3.5.jar:3.5]
at org.apache.cassandra.db.compaction.CompactionManager$BackgroundCompactionCandidate.run(CompactionManager.java:264) ~[apache-cassandra-3.5.jar:3.5]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_144]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_144]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]

]]>





解决方法:


1、增大磁盘空间、


2、直接删除同一编号的sstable 大文件


3、重装Cassandra

多节点写:


1.通过观察发现,写的瓶颈在指标库的gateway,然后增加多节点的测试如下:



  • 开启一个gateway、一个writer模块后,指标写入能力在 50W/分钟

  • 开启三个gateway、一个writer模块后,指标写入能力在 80W/分钟

  • 开启三个三个gateway、三个writer 模块后,指标写入能力在 85W/分钟






2.当部署Cassandra集群(3个节点)后,指标写入能力可以再次提升,开启三个gateway、一个writer模块,指标写入能力在 100W/分钟 ,此状态下可持续写入四个小时,期间redis会报内存不够的异常。

<p style=”margin-left: 30.0px; >


另外,当指标库写入在满载的情况下,指标的读取能力会受到很大影响,且写入也会偶尔报连接超时现象。




读:


指标的查询,其实是kairosdb去查Cassandra中数据。因此kairosdb查Cassandra的速度才是关键因素。而查Cassandra数据的速度,跟查询的Cassandra的row数量、元数据量等因素相关。


要模拟读取测试,就需要先调查现场实际查询的row和元数据大小。


统计局的统计如下:


上图为密集查询30分钟内指标时,从Cassandra中查询的row的行数;


中图为密集查询30分钟内指标时,从Cassandra中查询的元数据的数量;


下图为定时查询时row的行数。





















可以看出:


密集查询时,row最大的在4000,大部分比较小,接近1。定时查询时,row在100行以下。


现场400个设备,查询30分钟指标时,理论上应该有大约400430=48000 的元数据,实际查询时,要小于该值。基本都在几百条。



过程:


  1. 可以看到单Cassandra节点下,kairosdb查询Cassandra最短耗时已经在2S左右,而集群模式下,kairosdb查询Cassandra的最短耗时在200ms
    左右,可以看出在低硬件配置下,Cassandra部署集群模式比单机模式的性能提升很大。

  2. Cassandra刚部署时,查询性能表现优秀,连续写入一个小时数据后,查询性能下降。

  3. 2-5组发现kairosdb 查询时间正常, 但指标库查询出现超时,经建飞排查,原因是调用kairosdb client时创建的 http连接 最大数量最2,修改为200后,情况好转。






  4. 从测试过程可以看到,部分指标库的查询耗时比kairosdb查Cassandra的耗时长很多,查询kairosdb.datastore.queries_waiting
    指标,发现kairosdb存在大量等待线程。如下:






    修改
    kairosdb 的配置:kairosdb.datastore.concurrentQueryThread ,再次查询,依然会有等待的查询线程。
    据此判断,当查询15个指标时,每个指标耗时在2.5S左右时,此硬件配置下的kairosdb性能已达瓶颈,影响因素为CPU核数。当更改部署kairosdb
    机器的核数后,性能得到了提升。

  5. 同样的查询条件下,CPU核数与kairosdb 的concurrentQueryThread 参数一致时,性能最优;且该参数只在kairosdb 查Cassandra较慢(2S以上)时,才会产生影响。



五、结论


1、指标库写性能:



  1. 由3、5、6组可知,每分钟请求总量一定的情况下,在未到达瓶颈前,并发线程越多,指标写入量越大。

  2. 由6、8组可知,本机的机器性能并未成为影响指标写入的因素。

  3. 由6、7和8、9两组可知,在4核16G单节点Cassandra 配置下,请求数在50W/min 左右时,指标库的gateway 模块接收请求已到达瓶颈,为 50W /min 左右。

  4. 由9、10、11三组可知,在指标写入能力到达瓶颈后,改变并发的线程数,不再产生影响。

  5. 由9、12组可知,待写入的指标类型量不是影响因素。

  6. 由15组可知,当指标库写入请求量每分钟到千万级时,会出现redis 内存问题。

  7. 单指标库、单Cassandra节点下,指标写入能力瓶颈在Cassandra处,为 80W/min
    多指标库、单Cassandra节点下,指标写入能力瓶颈在Cassandra处,为
    85W/min
    单指标库、多Cassandra节点下,指标写入能力瓶颈为 100W/min
    多指标库、多Cassandra节点下,指标写入能力瓶颈为
    110W/min






配置预估:


假设现场1个资源每15 S上报100个指标,则每分钟上报400个,若采用单节点Cassandra
配置,在redis集群状况良好的情况下,可支持1750个资源左右,考虑到稳定性可酌情减少资源量或增加配置。



2、指标库读性能:



  1. 由1、2组可知R12版本指标库在现有配置下,最多支持每分钟30次的查询。

  2. 由2、3组可知,查询较慢时,每10S钟查询10次,比每5S钟查询5次,查询要快。

  3. 由2、4组可知,相同的请求量下,同一个指标密集查询2次,比两个指标同时各查一次要慢很多。

  4. 由1、5组可知,查询的数据量从600到7200,查询的Cassandra row从 77到740,查询耗时基本没有变化,不过Cassandra的资源消耗增加很多。

  5. 由2、7组可知,kairosdb client 创建的 http连接 最大数量与查询性能十分相关,R13中已调整该参数为200。

  6. 由6-8、14、15组可知,单Cassandra节点下,指标查询的瓶颈为 90次/分钟,且当 指标库的查询耗时 与
    kairosdb查Cassandra的耗时相差不大时,可以维持稳定查询状态,否则指标库查询超时会越来越严重。

  7. 由8-13、17-19组可知,kairosdb的concurrentQueryThread 参数值与CPU核数一致时,性能最优;且该参数只在kairosdb 查Cassandra较慢(2S以上)时,才会产生影响。

  8. 由8、16组可知,指标库是否集群模式不是瓶颈。

  9. 由19、22和20、23两组可知,单kairosdb 8核的查询性能 与双kairosdb 4核基本相同,所以kairosdb 的查询性能与机器的CPU核数有关。

  10. 由19、24组可知,当前的查询瓶颈在Cassandra 处,Cassandra 集群的查询性能是单节点的10倍。

  11. 由24-29组可知,Cassandra集群下,查询性能瓶颈为1400次/分钟,当查询到1500次/分钟时,kairosdb出现瓶颈,等待查询线程不断增加。

  12. 由30、31组可知,当Cassandra写入一段时间数据后,指标查询性能下降很多。