由于官方YCSB测试需要硬盘搭载文件系统,使用ZenFS进行测试,发现编译问题报错,本人对Rocksdb及Java、Maven等不甚熟悉,采用YCSB-cpp进行测试。
本测试基于ZenFS文件系统,如未安装ZenFS请参照上一篇博客或官方Github链接进行安装
YCSB-cpp安装
git clone https://github.com/ls4154/YCSB-cpp.git
cd YCSB-cpp
git submodule update --init
make
下载后进行YCSB-cpp的安装,但由于ZenFS非标准POSIX接口文件系统,需要修改代码进行文件系统适配。
修改Makefile如下:
# Extra options
DEBUG_BUILD ?=
EXTRA_CXXFLAGS ?= -I/home/spdk/Desktop/rocksdb/include
EXTRA_LDFLAGS ?= -L/home/spdk/Desktop/rocksdb -lsnappy -lzstd -lbz2 -llz4 -lgflags -u zenfs_filesystem_reg -lzbd
接着修改 rocksdb/rocksdb_db.cc文件
在RocksdbDB::GetOptions定义处加入如下代码
if (!env_uri.empty() || !fs_uri.empty()) {
rocksdb::Status s = rocksdb::Env::CreateFromUri(rocksdb::ConfigOptions(), env_uri, fs_uri, &env, &env_guard);
if (!s.ok()) {
throw utils::Exception(std::string("RocksDB CreateFromUri: ") + s.ToString());
}
//加入这行代码
printf("env is nullptr ? %s %p filesystem %p\n",env ? "no" : "yes",env,env->GetFileSystem().get());
//
opt->env = env;
}
此外还要修改rocksdb.properties来指定fs_uri参数,我的文件参考如下
#rocksdb.dbname=/tmp/ycsb-rocksdb
//这里修改是因为创建ZenFS时会指定目录
rocksdb.dbname=/
rocksdb.format=single
rocksdb.destroy=false
rocksdb.fs_uri=zenfs://dev:nvme4n1
# Load options from file
#rocksdb.optionsfile=
# Below options are ignored if options file is used
rocksdb.compression=snappy
rocksdb.max_background_jobs=2
rocksdb.target_file_size_base=67108864
rocksdb.target_file_size_multiplier=1
rocksdb.max_bytes_for_level_base=268435456
rocksdb.write_buffer_size=67108864
rocksdb.max_open_files=-1
rocksdb.max_write_buffer_number=2
rocksdb.use_direct_io_for_flush_compaction=false
rocksdb.use_direct_reads=false
rocksdb.allow_mmap_writes=false
rocksdb.allow_mmap_reads=false
rocksdb.cache_size=8388608
rocksdb.bloom_bits=0
# deprecated since rocksdb 8.0
rocksdb.compressed_cache_size=0
rocksdb.increase_parallelism=false
rocksdb.optimize_level_style_compaction=false
修改完毕后再make然后按照YCSB-cpp官方指导进行测试
./ycsb -load -run -db rocksdb -P workloads/workloadb -P rocksdb/rocksdb.properties -s
运行结果
运行结果如图