ZenFS+rocksdb+nvmevirt搭建ZNS SSD模拟环境

在虚拟机中搭建ZNS SSD实验环境并通过rocksdb进行测试。
Nvmevirt是一款比较新的SSD 仿真器(emulator),通过内核模块来模拟ZNS SSD,论文中性能更好,模拟的准确度更接近真实设备,且支持kv-ssd。
在NVMeVirt可以通过Makefile中不同的参数配置SSD类型,也可以在ssd_config里配置SSD参数。
Zenfs是rocksdb的一个插件,可以减少系统写放大,支持ZNS,自带性能测试工具。

系统设置

推荐直接使用Ubuntu 22.10,Kernel相关配置不用再更改。
笔者踩坑,Ubuntu22.10不受社区支持,推荐使用22.04。
低版本内核需要进行编译,使用Zenfs需要Linux 内核5.9以上,使用NVMeVirt需要内核版本5.15以上。

非Ubuntu22.10进行编译内核过程中可能需要开启内核选项,在enable the block layer中开启Zoned block device support或者在.config中修改CONFIG_BLK_DEV_ZONED为y,在IO scheduler中修改为MQ deadline

编译过程中容易报错

make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'.  Stop.
make: *** [Makefile:1868: certs] Error 2

在命令行中执行

scripts/config --disable SYSTEM_TRUSTED_KEYS

如果报错 canonical-revoked-certs.pem:

make[1]: *** No rule to make target 'debian/canonical-revoked-certs.pem', needed by 'certs/x509_revocation_list'.  Stop.
make: *** [Makefile:1868: certs] Error 2

在命令行中执行:

scripts/config --disable SYSTEM_REVOCATION_KEYS

Compiling the kernel 5.11.11

编译内核报错 No rule to make target ‘debian/canonical-certs.pem‘ 或 ‘canonical-revoked-certs.pem‘ 的解决方法

库的安装

Zenfs需要依赖比较多的库,容易踩坑,如果出现gflags,snappy等库未安装的提示,安装完相应的库后需要将 plugin/zenfs/util以及rocksdb下的文件都make clean后再make
需要make clean后再make!
需要make clean后再make!
需要make clean后再make!

按照Zenfs页面,先安装libzbd

libzbd库依赖于以下几个包:

  • m4
  • autoconf
  • automake
  • libtool
  • GTK3 and GTK3 development headers (when building the gzbd and gzbd-viewer graphical applications) 此项不装也可以,但是gzbd和gzbd-viewer的图形化程序会自动不编译
sudo apt install m4 autoconf automake libtool

之后就可以按照libzbd官方文档说明安装了
libzbd编译

$ sh ./autogen.sh
$ ./configure
$ make

libzbd安装

$ sudo make install

如果在/usr/lib(或/usr/lib64) 下找到libzbd.a等库文件证明安装成功。库头文件安装在/usr/include/libzbd.
示例应用程序的可执行文件安装在 /usr/bin.

libzbd安装

Zenfs相关依赖安装

容易踩坑

安装好所有的库再进行编译,否则需要安装库之后make clean后再进行编译

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

# 压缩库
sudo apt install libsnappy-dev

安装gflags

git clone https://github.com/gflags/gflags.git
mkdir build
cmake ..
make
make install

gflags安装

Zenfs安装

Zenfs
下载源码

$ git clone https://github.com/facebook/rocksdb.git
$ cd rocksdb
$ git clone https://github.com/westerndigitalcorporation/zenfs plugin/zenfs

Build and install rocksdb with zenfs enabled:

$ DEBUG_LEVEL=0 ROCKSDB_PLUGINS=zenfs make db_bench install

我这里make -j会报错,所以不推荐按官方的make -j48,把-j48删掉,等待时间会比较长
之后build zenfs utility

$ cd plugin/zenfs/util
$ make

至此Zenfs的环境就搭建完毕了,之后进行NvmeVirt的搭建。

NVMeVirt搭建ZNS SSD环境

启动项配置

修改/etc/default/grub
在GRUB_CMDLINE_LINUX行后加入

“memmap=64(硬盘的大小)\$128G(内存偏移位置)”

这样将从 128GB 内存偏移开始保留 64GB 物理内存块(总共 192GB 物理内存)。
我的物理机内存比较小,都设置的4GB
grub设置
推荐mmap设置内容比需要的SSD空间大1G,以及不设置成相同的数字,这样不容易混淆。
更新grub

$ update-grub
$ reboot

重启后可以通过

$ sudo cat /proc/iomem

查看是否预留内存成功
在这里插入图片描述
内核启动参数memmap
预留内存成功后可以通过NVMeVirt模拟ZNS SSD啦

NVMeVirt 配置ZNS SSD

源码下载

$ git clone https://github.com/snu-csl/nvmevirt

可以修改Makefile进行SSD类型的更改,一次只能模拟一种SSD

# Select one of the targets to build
#CONFIG_NVMEVIRT_NVM := y
#CONFIG_NVMEVIRT_SSD := y
CONFIG_NVMEVIRT_ZNS := y
#CONFIG_NVMEVIRT_KV := y

修改为ZNS SSD

NVMe Virt本身的ZONE_SIZE设置为2GB,比较大,我进行了修改
通过修改ssd_config.h进行修改
我修改为32MB
在这里插入图片描述
之后就可以make了
正常输出如下信息

$ make
make -C /lib/modules/5.15.37/build M=/path/to/nvmev modules
make[1]: Entering directory '/path/to/linux-5.15.37'
  CC [M]  /path/to/nvmev/main.o
  CC [M]  /path/to/nvmev/pci.o
  CC [M]  /path/to/nvmev/admin.o
  CC [M]  /path/to/nvmev/io.o
  CC [M]  /path/to/nvmev/dma.o
  CC [M]  /path/to/nvmev/simple_ftl.o
  LD [M]  /path/to/nvmev/nvmev.o
  MODPOST /path/to/nvmev/Module.symvers
  CC [M]  /path/to/nvmev/nvmev.mod.o
  LD [M]  /path/to/nvmev/nvmev.ko
  BTF [M] /path/to/nvmev/nvmev.ko
make[1]: Leaving directory '/path/to/linux-5.15.37'
$

我的电脑输出如下信息
在这里插入图片描述
其中BTF的提示不用管,不影响使用。
之后可以通过加载内核模块.ko文件模拟ZNS SSD
由于NVMeVirt模拟ZNS SSD需要1MB空间记录信息,因此启动参数需要在ZNS SSD容量上+1M,启动命令如下

$ insmod nvmev.ko memmap_start=4G memmap_size=2049M cpus=0,1
查看是否模拟成功
$ dmesg

看到如下信息证明模拟成功

[ 1751.371339] nvmev: loading out-of-tree module taints kernel.
[ 1751.371399] nvmev: module verification failed: signature and/or required key missing - tainting kernel
[ 1751.378128] NVMeVirt: Storage : 100100000 + 80000000
[ 1751.379523] NVMeVirt: Total Capacity(GiB,MiB)=2,2112 chs=8 luns=32 lines=64 blk-size(MiB,KiB)=1,1056 line-size(MiB,KiB)=33,33792
[ 1751.381513] NVMeVirt: [chmodel_init] bandwidth 450 max_credits 14 tx_time 271
[ 1751.383483] NVMeVirt: [chmodel_init] bandwidth 450 max_credits 14 tx_time 271
[ 1751.398424] NVMeVirt: [chmodel_init] bandwidth 450 max_credits 14 tx_time 271
[ 1751.415916] NVMeVirt: [chmodel_init] bandwidth 450 max_credits 14 tx_time 271
[ 1751.432908] NVMeVirt: [chmodel_init] bandwidth 450 max_credits 14 tx_time 271
[ 1751.449557] NVMeVirt: [chmodel_init] bandwidth 450 max_credits 14 tx_time 271
[ 1751.466091] NVMeVirt: [chmodel_init] bandwidth 450 max_credits 14 tx_time 271
[ 1751.482771] NVMeVirt: [chmodel_init] bandwidth 450 max_credits 14 tx_time 271
[ 1751.483178] NVMeVirt: [chmodel_init] bandwidth 3050 max_credits 99 tx_time 40
[ 1751.483180] NVMeVirt: zone_size=33554432(Byte),32(MB), # zones=64 # die/zone=32
[ 1751.483183] NVMeVirt: [NVMEV_NAMESPACE_INIT] ns=0 ns_addr=00000000dc72fbc3 ns_size=2048(MiB)
[ 1751.483241] PCI host bridge to bus 0001:10
[ 1751.483243] pci_bus 0001:10: root bus resource [io 0x0000-0xffff]
[ 1751.483245] pci_bus 0001:10: root bus resource [mem 0x00000000-0x1fffffffffff]
[ 1751.483246] pci_bus 0001:10: root bus resource [bus 00-ff]
[ 1751.483253] pci 0001:10:00.0: [0c51:0101] type 00 class 0x010802
[ 1751.483256] pci 0001:10:00.0: reg 0x10: [mem 0x100000000-0x100003fff 64bit]
[ 1751.483258] pci 0001:10:00.0: reg 0x30: [mem 0x00000000-0x000007ff pref]
[ 1751.483259] pci 0001:10:00.0: enabling Extended Tags
[ 1751.490230] NVMeVirt: Successfully created virtual PCI bus (node 0)
[ 1751.496773] NVMeVirt: nvmev_io_worker_0 started on cpu 1 (node 0)
[ 1751.496961] NVMeVirt: Successfully created Virtual NVMe device
[ 1751.496987] NVMeVirt: nvmev_dispatcher started on cpu 0 (node 0)
[ 1751.506274] nvme nvme0: pci function 0001:10:00.0
[ 1751.508875] NVMeVirt: Handling NVME_LOG_SMART
[ 1751.515535] nvme nvme0: 16/0/0 default/read/poll queues
[ 1751.541689] NVMeVirt: Handling NVME_LOG_CMD_EFFECTS

ZNS SSD测试

$ lsblk 可以看到模拟出的ZNS SSD
#安装nvme-cli工具
$ apt install nvme-cli
#查看zone信息
$ nvme zns report-zones /dev/nvme0n1 <path to zoned block device>

可以看到number of zones:64 申请了2G的ZNS SSD,ZONE_SIZE为32MB,共有2048/32=64个zone
在这里插入图片描述
还可以通过nvme-cli进行zone的写入等操作,更多使用参见nvme-cli
可以通过fio进行性能测试
测试命令

fio --ioengine=psync --direct=1 --filename=/dev/nvme2n1 --rw=write --bs=64k --group_reporting --zonemode=zbd --name=seqwrite --offset_increment=8z --size=8z --numjobs=14 --job_max_open_zones=1

在这里插入图片描述

挂载Zenfs

$ cat /sys/class/block/<zoned block device>/queue/scheduler
# out [none] mq-deadline 说明目前IO调度是none
$ echo deadline > /sys/class/block/<zoned block device>/queue/scheduler
# out [mq-deadline] none 更改为deadline IO调度

创建Zenfs

$ cd rocksdb
$ ./plugin/zenfs/util/zenfs mkfs --zbd=<zoned block device> --aux_path=<path to store LOG and LOCK files>
# 默认2GB的zone会导致报错 zenfs需要大于32个zone
# 正常会显示zenfs created 

在这里插入图片描述

运行rocksdb测试工具

./db_bench --fs_uri=zenfs://dev:<zoned block device name> --benchmarks=fillrandom --use_direct_io_for_flush_and_compaction

在这里插入图片描述

在搭建过程中遇到了比较多的困难,相关资料也比较少,踩了不少坑,因此写的比较细,特别感谢利用 RocksDB + ZenFS 测试 ZNS 的环境搭建和使用博客的指导,多次在踩坑后发现少装了库然后重新安装,重新编译,最终搭建好环境。

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要测试ZNS SSD(Zoned Namespace Solid State Drive),可以采取以下步骤: 1. 确定测试目标:在进行测试之前,首先要明确测试的目标和需求。例如,测试读取速度、写入速度、随机读取/写入速度、顺序读取/写入速度、数据完整性等。 2. 选择适当的测试工具:根据测试目标,选择合适的测试工具。常用的测试工具包括FIO、IOmeter、CrystalDiskMark等。这些工具可以帮助模拟不同的负载和执行各种读写操作。 3. 进行性能测试:使用选定的工具,进行性能测试。可以通过测试不同的文件大小、读取/写入混合负载、多线程负载等方式,来评估ZNS SSD的性能表现。记录测试结果,包括读取/写入速度、IOPS(每秒输入/输出操作数)、延迟等指标。 4. 进行数据一致性测试:为了确保ZNS SSD的数据完整性,在测试过程中需要进行数据一致性测试。可以使用校验和算法来验证写入和读取的数据是否一致,以确保数据在读写过程中没有出现错误。 5. 进行耐久性测试:ZNS SSD通常具有更高的耐久性,可以进行更频繁的写入操作。可以通过反复进行写入/擦除测试,以评估其耐久性和寿命。 6. 进行其他测试:根据具体需求,还可以进行其他测试,如功耗测试、温度测试、兼容性测试等。 7. 分析和评估测试结果:根据测试结果,进行数据分析和评估。比较不同测试条件下的性能表现,确认ZNS SSD是否符合预期。 最后,根据测试结果,可以根据需求进行优化和调整,以提升ZNS SSD的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值