全部产品
云市场

性能白皮书

更新时间:2019-09-12 08:17:22

前言

本文主要指导用户如何测试云Cassandra,以及给出一些我们基准测试的结果。随着内核&云环境不断优化,基准测试结果可能不能代表最优的性能,会不时更新。如果你需要评估业务需要多大规模的Cassandra实例,可以依照本文提供的测试方法做一些基本测试。当然最好的方式还是模拟业务在实例上实际跑一下,这比任何外部测试工具都准确。

测试工具

使用业内标准测试工具YCSB 0.15.0(当前最新release版本)
https://github.com/brianfrankcooper/YCSB/tree/0.15.0/cassandra

测试环境

测试直接购买 云Cassandra 进行测试。

网络:VPC内网,客户端与服务器同地域同可用区
实例规模:1个DC,3节点
实例容量:单节点400G SSD云盘(容量会适当影响性能)
压测客户端: ecs.c6.2xlarge(8核16G)
实例规格:当前云Cassandra支持的所有规格

测试负载说明

因为不同业务负载不同(每行字段数,每行数据量等),能达到的吞吐&延迟效果也不同。本文使用YCSB默认的workloada进行测试。用户可以自行调整YCSB参数达到最匹配业务的效果。大部分Cassandra相关测试参数也是默认,详见文档:
https://github.com/brianfrankcooper/YCSB/tree/0.15.0/cassandra

主要参数

  • 每行10字段 (默认)
  • 每行1k (默认)
  • 读:写 = 95 : 5
  • 读写一致性级别: ONE(默认)
  • 2副本 (因为是云盘所以使用2副本)
  • 压测线程:根据规格动态调节,具体见测试结果
  • 数据量(recordcount):也就是导入多少行数据,根据规格动态调节,具体见测试结果
  • 压测操作次数(operationcount):压测操作次数和数据量一致

需要注意的是调整一致性级别会影响性能,用户可以根据实际业务情况自行调整。

测试步骤

1. 创建测试表

  1. # cn-shanghai-g 替换成你购买的实例具体的 数据中心ID(DC Name), 在控制台可以找到
  2. create keyspace ycsb WITH replication = {'class': 'NetworkTopologyStrategy', 'cn-shanghai-g': 2};
  3. create table ycsb.usertable (y_id varchar primary key, field0 varchar, field1 varchar, field2 varchar, field3 varchar, field4 varchar, field5 varchar, field6 varchar, field7 varchar, field8 varchar, field9 varchar);

2. 安装测试工具

  1. wget https://github.com/brianfrankcooper/YCSB/releases/download/0.15.0/ycsb-cassandra-binding-0.15.0.tar.gz
  2. tar -zxf ycsb-cassandra-binding-0.15.0.tar.gz

3. 编辑workloads/workloada

加入下面3行

  1. hosts=cds-xxxxxxxx-core-003.cassandra.rds.aliyuncs.com #数据库连接点,控制台可查到
  2. cassandra.username=cassandra #此帐号需要有权限读写ycsb keyspace
  3. cassandra.password=123456 #密码忘记可以控制台修改

4. 数据准备阶段(纯写入测试)

  1. nohup ./bin/ycsb load cassandra2-cql -threads $THREAD_COUNT -P workloads/workloada -s > $LOG_FILE 2>&1 &

此测试结果可以观测写入吞吐上限。要想测试最大吞吐,得不断增大$THREAD_COUNT看吞吐是否有增加,同时压测客户端的规格也不能太小。

5. 压测阶段(读写混合测试)

  1. nohup ./bin/ycsb run cassandra2-cql -threads $THREAD_COUNT -P workloads/workloada -s > $LOG_FILE 2>&1 &

此测试结果可以观测读写混合性能情况。

测试结果

测试结果仅供参考,不同负载情况下延迟吞吐效果也不同。用户可以根据上文所述方法,尝试用不同参数,不同的压力,更大数据量(更长时间)去得到更符合业务情况的测试结果。注意客户端规格也会影响测试结果,不要用共享型。

测试结果解释

Load:数据准备阶段(纯写如测试)
Run:压测阶段(读写混合测试)
OPS:每秒操作次数,也就是整个阶段的吞吐
WAVG:写平均延迟 微秒
RAVG:读平均延迟 微秒
RP999: 99.9% 分位读延迟 微秒
线程:100/100 表示 数据准备阶段YCSB测试线程/压测阶段YCSB测试线程

压测阶段分两组,一组满负载,一组正常负载。

CPU 80% 负载

规格 线程 数据量(万行) Load OPS Load WAVG Run OPS Run WAVG Run RAVG Run RP95 Run RP99 Run RP999
4核8G 100/100 1600 32277 3071 29745 2846 3363 7795 23039 43999

CPU 60% 负载

规格 线程 数据量(万行) Load OPS Load WAVG Run OPS Run WAVG Run RAVG Run RP95 Run RP99 Run RP999
4核8G 100/16 1600 32063 3093 16721 514 974 1879 3047 28063

PS: 本文只列了SSD云盘结果。因为高效云盘也拥有不错的IOPS,在数据规模&实例规格较小的情况下,差距不明显(磁盘不是瓶颈),不具备参考价值。用户可以根据实际业务情况,模拟相对真实的负载,实际测试一下。业务侧实际能达到的效果还应结合业务应用实现,比如Java实现的应用可能客户端侧本身GC就会影响延迟。