YCSB初探:测试redis

1.YCSB简介

YCSB的全称是Yahoo! Cloud Serving Benchmark,这是一个用于测试cloud serving/NoSQL/Key-Value Store的benchmark。论文发表在SoCC’10,代码开源。有很多出色的工作(包括SILT@SOSP’11HyperDex@SIGCOMM’12)使用YCSB进行测试。最近接触了Key-Value Store的研究领域,因此学习一些如何使用YCSB。

随着cloud serving的流行,传统数据库不能满足Avalability、Scalabilty等要求,简化了功能(表连接等)、一致性(事务处理)的NoSQL数据库开始流行。这类数据库数量很多,各有tradeoff(read and write,latency and durability,sync and async等),开发人员和用户很难根据应用的特点选择合适的解决方案。YCSB的目的是提供一个公平的舞台。

image

上图是YCSB的结构,可以看成是一个数据库客户端。暗色的模块是可以替换的,Workload Executor是产生应用负载的,DB Interface Layer是将特定数据库的API转为YCSB的API,用户可以自定义负载和数据库。目前YCSB自带了6种负载(workloads/目录下),其中五种如下表。用户可以自定义操作(read、update、insert和scan)的比例,以及选择操作目标记录的分布:Uniform(等概率随机选择记录)、Zipfian(随机选择记录,存在热纪录)和Latest(近期写入的记录是热记录)。image

YCSB目前支持多种数据库,如:

用户可以用任意负载测试任意数据库。YCSB有很好的扩展性,只要按要求实现DB抽象类,就可以添加新的数据库支持。

2.安装、运行YCSB

YCSB可以从github上下载,releases/0.1.4似乎存在问题,GemFire模块无法通过。推荐直接用master。使用前需要安装maven,然后用mvn clean package下载依赖包。使用bin/ycsb就可以运行了。直接运行会输出帮助信息,命令的格式是:

bin/ycsb [load|run] dbname –P path/to/workloadfile –p key=value

用户首先需要用load初始化数据库,然后用run运行负载。dbname指定了目标数据库。-P指定负载文件的位置。-p用来设置一些参数,比如数据库的ip和port。当然,在运行YCSB之前,目标数据库必须是开启的。测试完成后,YCSB会打印平均/最小/最大延迟等信息。

3.安装、运行redis

为了入门,选择了比较简单的redis。redis是开源的内存数据库,很容易下载源码,编译也很直接。redis自带了服务器和客户端,使用src/redis-server可以运行服务器,默认端口是6379,redis.conf有很多配置选项。可以用src/redis-cli测试一下服务器是否正常,-h指定服务器ip,redis提供了较多的命令, 比如set、put、append、dbsize等。

注意redis需要设置vm.overcommit_memory=1,如果该值为0,可能会在记录数太多时出错(显示无法分配内存)。

sysctl vm.overcommit_memory=1

记录数过多时(16GB内存 VS 千万级以上),客户端经常会出现timeout。YCSB用的是jedis客户端,默认的超时是2秒,可以修改RedisClient.java:48行为

jedis = new Jedis(host, port, 1000000);

第三个参数是timeout,单位为毫秒。

4.测试Redis 2.6.16

我使用了两台服务器进行测试,一台16GB内存的服务器跑redis,一台跑YCSB,之间是校园网。选择了负载workloada,load会首先插入一些记录,每条记录1KB,然后在此基础上运行负载,read和update各占50%,Zipfian分布。运行

bin/ycsb load redis –P workloads/workloada –p redis.host=192.168.1.64

bin/ycsb run redis –P workloads/workloada –p redis.host=192.168.1.64

开始测试。我测试了10k、100k、1m,千万级的负载必须修改jedis的timeout才可能运行。

4.1 load性能

load阶段全是插入操作,吞吐率大约是500 ops/sec。

记录数10k100k1m
Avg. latency(us)1858.4971766.457171782.49293
Min latency(us)170715581525
Max latency(us)89571558249603
95th percentile latencey(ms)111
95th percentile latency(ms)212
run time(ms)18863.0177490.01788968.0

4.2 run性能

run阶段有50%查询和50%更新操作,吞吐率大约是1000 opes/sec。

总操作数10k100k1m
Avg. read latency(us)1272.751240.581232.44
Min read latency(us)113210571052
Max read latency(us)1917716838217141
95th percentile read latencey(ms)111
95th percentile read latency(ms)111
Avg. update latency(us)696.97676.19672.72
Min update latency(us)570506448
Max update latency(us)1070696850767
95th percentile update latencey(ms)000
95th percentile update latencey(ms)000
overall run time(ms)10240.097017.0959973.0

可以发现几个规律:

1. 三种操作的延迟关系是:INSERT>READ>UPDATE;

2. 延迟并不会随着记录/操作数增加而增加;

3. Redis的问题不是性能,而是受限于内存大小。

转载于:https://my.oschina.net/fomy/blog/167659

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值