zoukankan      html  css  js  c++  java
  • YCSB性能测试工具使用(转)

    在网上查In-Memory NoSQL性能测试的资料时,偶然间发现了这个性能测试工具YCSB,全称为“Yahoo! Cloud Serving Benchmark”。它内置了对常见NoSQL数据库和数据网格产品的支持,如Cassandra、MongoDB、HBase、Redis、Infinispan等等很多的主流产品,而且不仅安装使用简单,还能自由扩展测试数据类型和支持的数据库产品。

    1 编译安装

    首先说一下YCSB的安装。直接下载tar.gz分发包的话其实也不需要安装什么,解压后通过bin目录下的脚本执行即可(依赖python和JRE)。但由于tar.gz分发包比较大,一百多M,而且我这里总是连接超时,于是直接下载master库的源代码,自己编译。编译方法也很简单,因为工程是Maven管理的,所以只要有Maven环境就可以直接在YCSB根目录下运行package任务,之后就能在distribution工程的target中看到ycsb-0.1.4.tar.gz。最后将编译出的包拷贝到自己的环境如虚拟机里,就能使用了。本机调试也是可以的,只需在IDE中配置好Client.main()方法的启动参数就行了。

    2 使用

    现在来说一下如何使用YCSB,以Redis的性能测试为例,分为1.初始化测试数据 (loading阶段)2.执行测试操作(transaction阶段)。首先进行初始化,先保证Redis服务已经启动,然后在YCSB根目录下执行:

    > bin/ycsb load redis -s -P workloads/workloada -p "redis.host=127.0.0.1" -p "redis.port=6379"

    之后我们在Redis中就能看到1000条数据,因为workloada中定义了recordcount=1000。每一个key都是hash类型,我们可以重执行上面的命令,将redis改为basic,basic是一种dummy客户端,实际并不操作任何数据库,而是将YCSB对数据库的各种操作的key-value输出到控制台,这样我们就能看到这些key-value是怎么插入到Redis的,value都是什么样子的了。

    继续开始真正的测试:

    > bin/ycsb run redis -s -P workloads/workloada -p "redis.host=127.0.0.1" -p "redis.port=6379"

     -threads 128 -p "operationcount=10000" -p "measurementtype=timeseries"

     -p "timeseries.granularity=5000"

    简单解释一下这些参数:-threads是模拟的线程数,-p是传入的参数,可以是客户端的参数,可以是YCSB内部组件的参数,例如measurementtype会配置Measurements输出时间序列而不是直方图,也可以覆盖workload文件中预定义的参数,例如上面的operationcount。还有一个常用的参数是-target,指的是每秒最大操作数,当一秒内到达这个阈值,线程就会休眠1毫秒。

    输出的内容大概是这个样子,主要关注总的执行时间、吞吐量,以及读和写的平均延迟:

    [OVERALL], RunTime(ms), 60058.0

    [OVERALL], Throughput(ops/sec), 27049.768557061507

    [UPDATE], Operations, 812803

    [UPDATE], AverageLatency(us), 2275.102034564341

    [UPDATE], MinLatency(us), 616

    [UPDATE], MaxLatency(us), 64614

    [UPDATE], Return=0, 812800

    [UPDATE], 0, 4529.805933250927

    [UPDATE], 5000, 2208.521014693651

    [UPDATE], 10000, 2148.7565276549426

    [UPDATE], 15000, 2139.8536001184116

    [UPDATE], 20000, 2205.0305368941204

    [UPDATE], 25000, 2165.1238092653402

    [UPDATE], 30000, 2180.7067298448014

    [UPDATE], 35000, 2188.5334523973074

    [UPDATE], 40000, 2145.7207987586858

    [UPDATE], 45000, 2199.350677041509

    [UPDATE], 50000, 2175.385860213585

    [UPDATE], 55000, 2156.2515744608663

    [READ], Operations, 811752

    [READ], AverageLatency(us), 2304.3717539346994

    [READ], MinLatency(us), 629

    [READ], MaxLatency(us), 75380

    [READ], Return=0, 811751

    [READ], 0, 4634.609504308506

    [READ], 5000, 2233.603889043769

    [READ], 10000, 2179.2526166711627

    [READ], 15000, 2165.0853859227886

    [READ], 20000, 2234.4603871649133

    [READ], 25000, 2178.2390324907783

    [READ], 30000, 2208.70719241602

    [READ], 35000, 2207.444112422369

    [READ], 40000, 2173.767667054904

    [READ], 45000, 2223.0628439478996

    [READ], 50000, 2200.857439151695

    [READ], 55000, 2178.257027425664

    3 源码分析

    YCSB的核心类都在Maven子模块core中,主要有Client、ClientThread、CoreWorkload、DB实现类等。

     

    其主流程是:python脚本bin/ycsb会调用Client类的main()方法,初始化Workload和DB的实现类,并根据-threads参数创建多个Client线程,-s参数创建一个Status线程。每个线程会循环recordcountoperationcount(在workloada中定义)除以threads次,并根据参数bin/ycsb load/run决定是初始化数据doInsert()还是执行读写操作doTransaction()。

    4 添加新数据库

    1.新建module:在YCSB根目录pom.xml下添加一个Maven子module,artifactId为xxx-binding(ycsb脚本会根据这个名字后缀扫描jar包,加入到classpath中),而目录名则为前缀xxx。

    2.配置pom.xml:打开新建子module的pom.xml,加入<build>一段,这样执行package任务后会在target目录下生成一个包含了所有依赖的大jar包,这是maven-assembly插件的功能。之后将core模块(因为下面我们要继承DB类)和其他所有依赖项添加到pom.xml中。

    3.新建DB子类:在此子module中新建package和类,继承DB类。

    4.打包module:执行package任务,在target下会生成一个xxx-binding.jar。拷贝到YCSB包下xxx-binding/lib目录下。

    5.执行测试:可以通过-db指定我们的DB类,或在ycsb Python脚本中给我们的类加个别名。

  • 相关阅读:
    NYOJ 10 skiing DFS+DP
    51nod 1270 数组的最大代价
    HDU 4635 Strongly connected
    HDU 4612 Warm up
    POJ 3177 Redundant Paths
    HDU 1629 迷宫城堡
    uva 796
    uva 315
    POJ 3180 The Cow Prom
    POJ 1236 Network of Schools
  • 原文地址:https://www.cnblogs.com/wangbin/p/8558943.html
Copyright © 2011-2022 走看看