42

利用 RocksDB + ZenFS 测试 ZNS 的环境搭建和使用

 1 year ago
source link: https://ywang-wnlo.github.io/posts/b8506868.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文主要记录自己在利用 RocksDB + ZenFS 测试 ZNS 过程中遇到的一些问题以及相应的解决办法

配置 ZNS 环境

ZNS 全称 Zoned Namespaces,中文一般译为分区命名空间,当今最常见的 ZNS 设备类型是基于闪存的 SSD。但是 ZNS SSD 目前还没有在消费级市场出货,只能通过软件模拟来搭建环境

官网给了 null_blk 以及 QEMU 的配置方法,但是个人对 FEMU 比较熟悉,于是采用模拟 FEMU 模拟 ZNS 搭建环境

FEMU 的环境搭建比较简单,参考其 官方仓库 README 操作即可

容易踩坑:但是需要注意 ZNS 对 Linux 内核版本有要求,必须在 5.10 以上,因此推荐安装 Ubuntu 22.04 LTS 或者手动更新内核

配置 RocksDB 环境

RocksDB 官方仓库的 Wiki 有较为详细的安装指导

环境以及依赖安装

以 Ubuntu 为例:

容易踩坑:一定要记得按照顺序来,先安装好所有依赖再编译

# 基本的编译工具等不过多介绍
# sudo apt install build-essential

# gflags
sudo apt install libgflags-dev

# 压缩库,选一个就行
sudo apt install libsnappy-dev
# sudo apt install zlib1g-dev
# sudo apt install libbz2-dev
# sudo apt install liblz4-dev
# sudo apt install libzstd-dev

编译 RocksDB 库以及测试工具

如果要在 ZNS 上测试,可以暂时跳过该小节,等配置好 ZenFS 后再进行

如果要用 YCSB 来测试,就需要编译 Java 版本的 jar 包,具体过程可以参考 这篇博文

db_bench 测试就直接 make db_bench 即可,可以加上 DEBUG_LEVEL=0 保证编译成 release 版本

# 编译测试工具
DEBUG_LEVEL=0 make -j db_bench

# 安装编译好的 RocksDB 库
sudo make install

容易踩坑:如果 -j 会全核一起编译,在核多内存少的情况下可能会报内存资源不足的错误,可以参考 这篇博客 利用 swap “增加” 可用内存大小,或者限制下编译的并发度,例如 -j8

利用 db_bench 测试可以参考 官方测试 的方式,利用 benchmark.sh 来测试,当然也可以直接运行 db_bench

配置 ZenFS 环境

ZenFS 官方仓库其实给了相应的指导,这里重新梳理下

安装 libzbd

# 安装编译工具
sudo apt install m4
sudo apt install autoconf
sudo apt install automake
sudo apt install libtool

# 拉取源码
git clone [email protected]:westerndigitalcorporation/libzbd.git

# 编译
cd libzbd
sh ./autogen.sh
./configure
make

# 安装
sudo make install

ZenFS 插件编译

然后需要切换回 RocksDB 的目录,将 ZenFS 加入其中进行编译

# 拉取源码
# git clone https://github.com/facebook/rocksdb.git
cd rocksdb
git clone https://github.com/westerndigitalcorporation/zenfs plugin/zenfs

# 编译测试工具
DEBUG_LEVEL=0 ROCKSDB_PLUGINS=zenfs make -j db_bench

# 安装编译好的 RocksDB 库
sudo make install

# 编译必要的 ZenFS 工具
cd plugin/zenfs/util
make -j

至此所有测试需要的环境已经基本搭建好了

测试 demo

接下来介绍了测试过程,假设 ZNS 固态盘的设备名为 nvme1n1

首先配置底层 IO 调度器为 mq-deadline 用户保持有序性(因为 ZNS 只支持追加写

echo mq-deadline | sudo tee /sys/block/nvme1n1/queue/scheduler

容易踩坑:利用 zenfs 创建 ZenFS 文件系统,其中 zbd 后直接给出设备名即可,不需要给出设备路径;而且需要指定 aux_path 用于存放 LOG 和 LOCK 文件,推荐放在非 ZNS 设备上,并且使用绝对路径

cd ~
mkdir zenfs-aux

cd rocksdb
sudo ./plugin/zenfs/util/zenfs mkfs --zbd=nvme1n1 --aux-path=/home/femu/zenfs-aux

然后就可以用 db_bench 进行测试了

cd rocksdb
sudo ./db_bench --fs_uri=zenfs://dev:nvme1n1 --benchmarks=fillrandom --use_direct_io_for_flush_and_compaction

demo 的测试结果

Set seed to 1669128699187109 because --seed was 0
Initializing RocksDB Options from the specified file
Initializing RocksDB Options from command-line flags
Integrated BlobDB: blob cache disabled
RocksDB: version 7.7.3
Date: Tue Nov 22 14:51:39 2022
CPU: 16 * Intel(R) Xeon(R) Platinum P-8124 CPU @ 3.00GHz
CPUCache: 16384 KB
Keys: 16 bytes each (+ 0 bytes user-defined timestamp)
Values: 100 bytes each (50 bytes after compression)
Entries: 1000000
Prefix: 0 bytes
Keys per prefix: 0
RawSize: 110.6 MB (estimated)
FileSize: 62.9 MB (estimated)
Write rate: 0 bytes/second
Read rate: 0 ops/second
Compression: Snappy
Compression sampling rate: 0
Memtablerep: SkipListFactory
Perf Level: 1
------------------------------------------------
Initializing RocksDB Options from the specified file
Initializing RocksDB Options from command-line flags
Integrated BlobDB: blob cache disabled
DB path: [rocksdbtest/dbbench]
fillrandom : 2.523 micros/op 396351 ops/sec 2.523 seconds 1000000 operations; 43.8 MB/s

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK