使用YCSB(Yahoo Cloud Serving Benchmark)来评估In-Memory数据库VoltDB的性能
首先
我正在使用YCSB来测试内存数据库VoltDB的性能。
YCSB是Yahoo! Cloud Serving Benchmark的缩写,是由Yahoo! Research开发的用于NoSQL的基准测试工具。
YCSB默认支持Cassandra和Redis等许多NoSQL数据库,但不支持VoltDB。因此,我们将使用VoltDB提供的客户端来进行测试。
环境配置
从以下位置下载YCSB。
我们部署YCSB并设置环境变量YCSB_HOME。
tar xzvf ycsb-0.15.0.tar.gz -C /opt
export YCSB_HOME="/opt/ycsb-0.15.0"
VoltDB的YCSB客户端在以下位置可找到。
将这个存储在/opt目录下。
请使用以下命令编译用于VoltDB的YCSB客户端。
# cd /opt/ycsb
# chmod 755 run.sh
# ./run.sh jars
创建一个用于基准测试所需的STORE表格和过程。
# ./run.sh init
从ycsb_ddl.sql文件中提取的DDL如下所示。
CREATE TABLE Store
(
keyspace VARBINARY(128) NOT NULL
, key VARCHAR(128) NOT NULL
, value VARBINARY(2056) NOT NULL
, PRIMARY KEY (keyspace, key)
);
PARTITION TABLE Store ON COLUMN key;
接下来,将负责创建的STORE表加载基准数据。
# ./run.sh load
我对使用的配置文件进行了修改,并进行了如下执行:使用的配置文件是”base.properties”和”load.properties”这两个文件。
voltdb.servers=localhost
threadcount=150
fieldcount=5 # 100から変更
fieldlength=10 # 100から変更
# load で挿入するレコード数
recordcount=2000000 # 10000000から変更
# run で実行されるクエリの回数
operationcount=2000000 # 10000000から変更
# workload を実行するクラス
workload=com.yahoo.ycsb.workloads.CoreWorkload
准备基准测试数据,但是数据本身也生成了以下的基准测试结果。
每秒吞吐量为24,184个项目。
[OVERALL], RunTime(ms), 82696
[OVERALL], Throughput(ops/sec), 24184.96662474606
[TOTAL_GCS_Copy], Count, 127
[TOTAL_GC_TIME_Copy], Time(ms), 223
[TOTAL_GC_TIME_%_Copy], Time(%), 0.2696623778659185
[TOTAL_GCS_MarkSweepCompact], Count, 3
[TOTAL_GC_TIME_MarkSweepCompact], Time(ms), 28
[TOTAL_GC_TIME_%_MarkSweepCompact], Time(%), 0.03385895327464448
[TOTAL_GCs], Count, 130
[TOTAL_GC_TIME], Time(ms), 251
[TOTAL_GC_TIME_%], Time(%), 0.303521331140563
[CLEANUP], Operations, 150
[CLEANUP], AverageLatency(us), 801.54
[CLEANUP], MinLatency(us), 2
[CLEANUP], MaxLatency(us), 114431
[CLEANUP], 95thPercentileLatency(us), 18
[CLEANUP], 99thPercentileLatency(us), 3325
[INSERT], Operations, 2000000
[INSERT], AverageLatency(us), 6024.355673
[INSERT], MinLatency(us), 69
[INSERT], MaxLatency(us), 294911
[INSERT], 95thPercentileLatency(us), 16143
[INSERT], 99thPercentileLatency(us), 25855
[INSERT], Return=OK, 2000000
执行基准测试
执行基准测试。”workloada”是基准测试的场景,其中包含50%的读取和50%的写入场景。
./run.sh workload workloada
使用的配置文件有两个,分别是”base.properties”和”workload.properties”。针对”workload.properties”进行了以下修改并进行了执行。
maxexecutiontime=600
# load で挿入するレコード数
recordcount=2000000 # 10000000から変更
# run で実行されるクエリの回数
operationcount=2000000 # 1000000000から変更
另外,以下页面对于YCSB概述及其对Cassandra的基准测试提供了参考。
执行后,将显示以下类似结果的性能测试完成。
每秒吞吐量为总共23,723个记录。
[OVERALL], RunTime(ms), 84306
[OVERALL], Throughput(ops/sec), 23723.10393091832
[TOTAL_GCS_Copy], Count, 100
[TOTAL_GC_TIME_Copy], Time(ms), 201
[TOTAL_GC_TIME_%_Copy], Time(%), 0.23841719450572912
[TOTAL_GCS_MarkSweepCompact], Count, 3
[TOTAL_GC_TIME_MarkSweepCompact], Time(ms), 27
[TOTAL_GC_TIME_%_MarkSweepCompact], Time(%), 0.032026190306739734
[TOTAL_GCs], Count, 103
[TOTAL_GC_TIME], Time(ms), 228
[TOTAL_GC_TIME_%], Time(%), 0.2704433848124689
[READ], Operations, 999883
[READ], AverageLatency(us), 6112.663878673805
[READ], MinLatency(us), 58
[READ], MaxLatency(us), 391679
[READ], 95thPercentileLatency(us), 18431
[READ], 99thPercentileLatency(us), 30815
[READ], Return=OK, 999883
[CLEANUP], Operations, 150
[CLEANUP], AverageLatency(us), 1108.56
[CLEANUP], MinLatency(us), 1
[CLEANUP], MaxLatency(us), 162943
[CLEANUP], 95thPercentileLatency(us), 21
[CLEANUP], 99thPercentileLatency(us), 1658
[UPDATE], Operations, 1000117
[UPDATE], AverageLatency(us), 6134.580398093423
[UPDATE], MinLatency(us), 68
[UPDATE], MaxLatency(us), 346623
[UPDATE], 95thPercentileLatency(us), 18495
[UPDATE], 99thPercentileLatency(us), 31071
[UPDATE], Return=OK, 1000117
使用VoltDB,可以通过Web界面方便地查看CPU负载等信息。

请你以母语中文解释以下内容,只需要一个选项:
以下是对YCSB的参考信息。
-
- YCSBの概要とCassandraへのベンチマーク
-
- YCSBでNoSQLのベンチマーク その1
- YCSBでNoSQLのベンチマーク その2
对VoltClient4.java进行修正。
由于VoltDB用的客户端(VoltClient4.java)无法通过编译,因此我进行了以下修正。
# diff VoltClient4.java VoltClient4.java.kaizou
34a35
> import java.util.Map;
109c110
< public Status insert(String keyspace, String key, HashMap<String, ByteIterator> columns)
---
> public Status insert(String keyspace, String key, Map<String, ByteIterator> columns)
115c116
< public Status read(String keyspace, String key, Set<String> columns, HashMap<String, ByteIterator> result)
---
> public Status read(String keyspace, String key, Set<String> columns, Map<String, ByteIterator> result)
174c175
< result.add(unpackRowData(table, columns));
---
> result.add((HashMap)unpackRowData(table, columns));
193c194
< public Status update(String keyspace, String key, HashMap<String, ByteIterator> columns)
---
> public Status update(String keyspace, String key, Map<String, ByteIterator> columns)
251c252
< private byte[] packRowData(HashMap<String, ByteIterator> columns)
---
> private byte[] packRowData(Map<String, ByteIterator> columns)
273c274
< private HashMap<String, ByteIterator> unpackRowData(VoltTable data, Set<String> fields)
---
> private Map<String, ByteIterator> unpackRowData(VoltTable data, Set<String> fields)
279c280
< HashMap<String, ByteIterator> res = new HashMap<String, ByteIterator>(size, (float) 1.25);
---
> Map<String, ByteIterator> res = new HashMap<String, ByteIterator>(size, (float) 1.25);
283c284
< private HashMap<String, ByteIterator> unpackRowData(VoltTable data, Set<String> fields, HashMap<String, ByteIterator> result)
---
> private Map<String, ByteIterator> unpackRowData(VoltTable data, Set<String> fields, Map<String, ByteIterator> result)
291c292
< private HashMap<String, ByteIterator> unpackRowData(byte[] rowData, ByteBuffer buf, int nFields, Set<String> fields, HashMap<String, ByteIterator> result)
---
> private Map<String, ByteIterator> unpackRowData(byte[] rowData, ByteBuffer buf, int nFields, Set<String> fields, Map<String, ByteIterator> result)