性能白皮书

前言

本文主要指导用户如何测试云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. 创建测试表

# cn-shanghai-g 替换成你购买的实例具体的 数据中心ID(DC Name), 在控制台可以找到
create keyspace ycsb WITH replication = {'class': 'NetworkTopologyStrategy', 'cn-shanghai-g': 2};
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. 安装测试工具

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

3. 编辑workloads/workloada

加入下面3行

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

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

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

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

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

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

说明

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