NVMeVirt模拟ZNS 搭建步骤 服务器上ZenFS的依赖已经完备,直接开装
1 ZenFS和RocksDB安装 使用最新版本的RocksDB和ZenFS时,安装报错(如issue#288所示 ),原因时新版本的RocksDB更换了API而ZenFS未适配,使用RocksDB 8.11.3可以解决,直接按照README即可
1 2 3 4 5 git clone https://github.com/facebook/rocksdb.git cd rocksdb git clone https://github.com/westerndigitalcorporation/zenfs plugin/zenfs cd plugin/zenfs/util make
2 NVMeVirt搭建 2.1 内存预留 1 2 # 从16G开始预留32内存空间给NVMeVirt使用 GRUB_CMDLINE_LINUX="memmap=32G\\\$16G"
1 2 3 sudo update-grub sudo reboot sudo cat /proc/iomem | grep Reserved
400000000- bffffffff
预留了16GB的内存空间400000000-147fffffff
2.2 修改配置 选择zns模式,使用西数ZN540的配置
1 2 3 4 5 # Select one of the targets to build # CONFIG_NVMEVIRT_NVM := y # CONFIG_NVMEVIRT_SSD := y CONFIG_NVMEVIRT_ZNS := y# CONFIG_NVMEVIRT_KV := y
修改zone_size,需要注意在ZenFS挂载时最少需要32个zone
1 2 3 4 #elif (BASE_SSD == WD_ZN540) ...#define ZONE_SIZE MB(256ULL) ...
2.3 加入内核 我选择只使用16GB的空间,其实地址为16GB,注意在设定memmap_size时增加1M,不然会报段错误(需要reboot才能重新插入内核模块,很麻烦),dmesg显示zns_ftl的101行报错,原因是容量(Total Capacity)不能整除分区大小(Zone Size),加1M即可
将2.2中编译好的内核模块加入内核(后续要重新更改修改分区时,先rmmod内核模块,然后修改配置文件重新编译)
模拟16G ZNS 1 sudo insmod /home/yzy/nvmevirt/nvmev.ko memmap_start=16G memmap_size=16385M cpus=6,7
模拟32G ZNS 1 sudo insmod /home/yzy/nvmevirt/nvmev.ko memmap_start=16G memmap_size=32769M cpus=6,7
报错
1 2 [2278744.083448] NVMeVirt: Version 1.10 for >> WD ZN540 ZNS SSD << [2278744.083459] NVMeVirt: [mem 0x400000000-0xc000fffff] is usable, not reseved region
查看预留区域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 yzy@host1:~/DZR-rocksdb/rocksdb-7.10.2$ sudo cat /proc/iomem | grep Reserved 00000000-00000fff : Reserved 0003e000-0003efff : Reserved 000a0000-000fffff : Reserved 5f105000-5f105fff : Reserved 66520000-6841ffff : Reserved 68dc0000-6c1fefff : Reserved 6e580000-6ef2bfff : Reserved 6f800000-8fffffff : Reserved fd000000-fe7fffff : Reserved fed20000-fed44fff : Reserved ff000000-ffffffff : Reserved 400000000-bffffffff : Reserved 1ffc00000000-1fffffffffff : Reserved
可以通过sudo nvme zns zns-reports nvme4n1
查看详细信息
2.4 ZenFS挂载 磁盘调度器设为deadline(貌似同一编号如nvme4n1只需设置一次, 更换另一配置的模拟zns不需该操作)
1 sudo echo deadline > /sys/class/block/nvme4n1/queue/scheduler
挂载ZenFS,指定log和lock文件
1 sudo ./plugin/zenfs/util/zenfs mkfs --zbd=nvme4n1 --aux_path=/home/yzy/zone_256M_log
db_bench测试
1 sudo ./db_bench --fs_uri=zenfs://dev:nvme4n1 --benchmarks=fillrandom --use_direct_io_for_flush_and_compaction
2.3 参考
3 ZNS实验 实验环境:NVMeVirt+RocksDB+ZenFS 实验目的:分区大小与compection和GC的关系量化
3.1 实验记录
1 sudo ./db_bench --benchmarks=fillseq,stats --num=100000000 --value_size=100 --compression_type=none --histogram --fs_uri=zenfs://dev:nvme4n1 --target_file_size_base=510027366 --use_direct_io_for_flush_and_compaction --max_bytes_for_level_multiplier=4 --max_background_jobs=8 --use_direct_reads --write_buffer_size=2147483648 --statistics > /home/yzy/rocksdb811/rocksdb-8.11.3/plugin/zenfs/zns_test/results/16GB_<zone size>_fillseq_flush_10G.out
1 sudo ./db_bench --benchmarks=updaterandom,stats --num=10000000 --value_size=100 --compression_type=none --histogram --fs_uri=zenfs://dev:nvme2n1 --target_file_size_base=510027366 --use_direct_io_for_flush_and_compaction --max_bytes_for_level_multiplier=4 --max_background_jobs=8 --use_direct_reads --write_buffer_size=2147483648 --statistics --use_existing_db=true --use_existing_keys=true > /home/yzy/rocksdb811/rocksdb-8.11.3/plugin/zenfs/zns_test/results/16GB_<zone size>_update_flush_100M.out
sudo ./db_bench –benchmarks=overwrite,stats –num=10000000 –value_size=100 –compression_type=none –histogram –fs_uri=zenfs://dev:nvme2n1 –target_file_size_base=510027366 –use_direct_io_for_flush_and_compaction –max_bytes_for_level_multiplier=4 –max_background_jobs=8 –use_direct_reads –write_buffer_size=2147483648 –statistics – use_existing_db=true –use_existing_keys=true > /home/yzy/rocksdb811/rocksdb-8.11.3/plugin/zenfs/zns_test/results/16GB_64MB_overwrite_flush_100M.out
按论文提供的配置进行实验 1 ./db_bench --fs_uri=zenfs://dev:nvme4n1 –benchmarks=fillrandom,stats –perf_level=3 -use_direct_io_for_flush_and_compaction=true -use_direct_reads=true -cache_size=268435456 -key_size=48 -value_size=43 -num=200000000 -db=./50M_random_insert_kv -disable_auto_compactions=true
1 ./db_bench --fs_uri=zenfs://dev:nvme4n1 –benchmarks=mixgraph,stats -use_direct_io_for_flush_and_compaction=true -use_direct_reads=true -cache_size=268435456 -keyrange_num=1 -value_k=0.2615 -value_sigma=25.45 -iter_k=2.517 -iter_sigma=14.236 -mix_get_ratio=0.83 -mix_put_ratio=0.14 -mix_seek_ratio=0.03 -sine_mix_rate_interval_milliseconds=5000 -sine_a=1000 -sine_b=0.000073 -sine_d=4500 –perf_level=2 -reads=420000000 -num=50000000 -key_size=48 -db=./50M_random_insert_kv -use_existing_db=true -disable_auto_compactions=true
Zenfs
fillrandom : 2.685 micros/op 372401 ops/sec 268.527 seconds 100000000 operations; 52.6 MB/s
NVMeBenchmarks
sudo python3 grid_bench.py -d nvme4n1 -m zns-a -l lbaf0 -f write -s /home/yzy/NVMeBenchmarks/submodules/spdk-22.09 --overwrite 1