初学cassandra 如有错误请指正 谢谢
Cassandra 性能测试
目的:
验证Cassandra 是否达到如下性能:
在数据量为5000万下,读写数据1000/单台每秒,
准备工作:
一、Cassandra运行环境配置(linux jdk为64位)
1、 Cassandra性能相关参数修改(cassandra.yaml文件)
(1) 最好将数据文件和日志文件存储在不同硬盘
# directories where Cassandra should store data on disk.
data_file_directories:
- /var/lib/cassandra/data
# commit log
commitlog_directory: /var/lib/cassandra/commitlog
(2) 修改并发写的线程数量为128
# On the other hand, since writes are almost never IO bound, the ideal
# number of "concurrent_writes" is dependent on the number of cores in
# your system; (8 * number_of_cores) is a good rule of thumb.
concurrent_reads: 32
concurrent_writes: 128
(3)
2、 不能让Cassandra出现使用交换内存的情况,否则服务性能会出现严重下降。
二、Key Cache大小设置的原理
1、 认为平常认证人员的数量符合平均值为2500万,标准差为125万的正态分布。因此位于左右两个标准差之内人员的操作最多的。因此Key Cache的大小应该总量x百分比。X的值为上述四个标准差所占的面积比例。左右4个标准差之间的面积比例为99.99%,认为是5000万,因此,标准差大小为5000/(4+4)=625万。因此可以存入1250万。
三、创建数据库
1、 创建keyspace
create keyspace mcas;
2、 创建column family
create column family timebasedtoken with
key_validation_class=UTF8Type and
comparator = UTF8Type and
column_metadata =
[
{column_name:seed ,validation_class:UTF8Type},
{column_name: offset, validation_class: LongType},
{column_name: state, validation_class: LongType},
{column_name: modelType, validation_class: UTF8Type},
{column_name: timeWindow, validation_class: LongType},
{column_name: idType, validation_class: UTF8Type},
{column_name: idNumber, validation_class: UTF8Type},
{column_name: badPwCount, validation_class: LongType},
{column_name: staticPwd, validation_class: UTF8Type},
{column_name: staticPwVolity, validation_class: LongType},
{column_name: algorith, validation_class: UTF8Type},
{column_name: pwLength, validation_class: UTF8Type},
{column_name: chgCode, validation_class: UTF8Type},
{column_name: lastPwd, validation_class: UTF8Type}
];
3、修改key缓存大小
update column family timebasedtoken with keys_cached = 7000000;
4、编写插入数据小程序mcas-jar-with-insertdatatest.jar,插入5000万条数据
小程序带有三个参数,第一个参数是-p,第二和第三个分别是开始位置和结束位置。
执行命令:java –jar mcas-jar-with-insertdatatest.jar –p 0 50000000
5、编写读取并修改数据的程序 mcas-jar-with-mutiTest-ks-theadnum-count.jar
mcas-jar-with-mutithreadtest.jar <keyspace> <thread_count> <readwrite_Number>
测试:
1、 执行16个线程读写数据
(1)执行命令 java -jar mcas-jar-with-mutiTest-ks-theadnum-count mcas 16 10000000;
(2)通过查看日志,在20分钟后每秒钟读写的数量趋于稳定,在16个线程并发下,每个线程处理的数量平均800左右,某线程部分日志输出如下:
(3)在执行过程中通过vmstats 2 查看服务器cpu使用率大约为65%
运行bin/nodetool -h localhost cfstats
Cassandra keyspace状态图
2、执行32个线程读写数据
(1)执行命令 java -jar mcas-jar-with-mutiTest-ks-theadnum-count mcas 32 10000000;
(2)在32个线程并发下,每个线程处理的数量大约400左右,某线程部分日志输出如下:
(3)在执行过程中通过vmstats 2 查看服务器cpu使用率大约为60-70%。
Cassandra keyspace状态图
上图所圈项为key命中率 。
并且命中率会随着key cache capacity增大而增加。超过阈值后,运行一段时后由于内存的限制会出现严重性能问题。具体情况为当内存不足而运行垃圾回收的时候,Cassandra将不能提供服务,直到垃圾回收完成。
结论:
1、16个线程并发下,总处理能力为16 * 800= 12800次/每台/每秒;32个线程并发下,总处理能力为32 * 400 = 12800次/每台每秒。这两数值都完全能满足1000次/每台/每秒的需求。
2、Cassandra的命中率随着内存中key的缓存容量增大会逐渐增加。
初学cassandra 如有错误请指正 谢谢