官方教程:https://github.com/SpanDB/SpanDB
但是官方教程有一些坑。
¶ 安装SPDK
Debian 11 安装SPDK¶ (可选)把memlock的限制解除
sudo bash -c "ulimit -Hl unlimited" |
¶ 申请huge page
4GB |
这个时候可能会提示:
Current user memlock limit: 3967 MB |
但是查看/proc/meminfo
的话,又能看到huge
page已经分配好了:
HugePages_Total: 2048 |
SpanDB的TopFS的cache是从这里申请的。如果后面出现了内存分配失败,说明这里没有申请够,需要把数值改大,或者减小TopFS的cache大小。
¶ 安装依赖
Debian 11:
sudo apt-get install libgflags-dev |
我怀疑其实并不需要这么多压缩算法。但是稳妥起见还是按照官方文档上的全装上吧。
¶ 编译SpanDB
git clone https://github.com/SpanDB/SpanDB.git |
我这里make的时候会报错:
db_stress.cc:(.text.startup+0x1): undefined reference to `rocksdb::db_stress_tool(int, char**)' |
但是build文件夹下面librocksdb
的静态库和动态库都编译好了,所以这条编译报错也许可以不用管?
¶ 编译SpanDB目录下面的YCSB测试程序
cd SpanDB/ycsb |
这下面的CMakeLists.txt
是错的,要把
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/../build/include) |
改成
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/../include) |
把
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/../build/lib64) |
改成
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/../build) |
然后再编译:
mkdir build |
¶ 运行YCSB测试
使用编译出来的test
文件来测试,其参数:
usage: <workload_file> <client_num> <data_dir> <log_dir> <is_load> <dbname> <db_bak> |
在ycsb/workloads
下面有一些自带的workload。
¶ 生成DB
./test <workload_file> 40 <data_dir> <log_dir> 1 rocksdb <db_bak> |
这个时候最后一个参数db_bak
会被忽略,生成的DB在data_dir
里。需要手动把data_dir
移动到db_bak
。
数据写入完成之后会sleep两个3分钟,可能是为了等待后台任务完成,然后打印一些信息之后才会退出,要耐心等待。
注意,load模式不支持SpanDB,测试SpanDB的时候用的db_bak跟RocksDB是一样的。
¶ 测试RocksDB
临时起效 |
这一步会先把data_path
给清空,然后把db_bak
里的内容复制到data_path
里,然后再跑workload。
官方文档里这一步没有ulimit -n 100000
,但是workloada.spec
生成的DB里有1608个文件,而默认最多能同时打开1024个file
descriptor:
$ ulimit -n |
¶ 测试SpanDB
sudo -s |
其中PCIe地址可以通过sudo lspci
查找,我的是:
01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/980PRO |
其中的01:00.0
就是这个SSD的PCIe地址。
SpanDB默认分配了90GB的SPDK缓存,如果前面huge page没有申请够,会分配失败:
SPDK memory allocation starts (90.00 GB) |
这时要么多申请一些huge
page,要么减少TopFS使用的cache,即将ycsb/src/test.cc
中的main
函数里的
options.topfs_cache_size = 90; |
改成更小的值,然后重新make
,再跑就好了。
¶ 参考文献
https://github.com/SpanDB/SpanDB
https://wiki.debian.org/Hugepages
https://askubuntu.com/questions/654820/how-to-find-pci-address-of-an-ethernet-interface