使用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负载等信息。

image.png

请你以母语中文解释以下内容,只需要一个选项:

以下是对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)
广告
将在 10 秒后关闭
bannerAds