技术总结
1. 单机FIO测试
1.1 配置FS环境
略~
1.2 配置 Linux NVMe over Fabrics 主机
安装nvme可通过 yum search nvme
找到对应的nvme版本,然后 yum install nvme-cli.*
Discovery: nvme discover -t tcp -a 192.168.10.194 -s 4420
Connect: nvme connect -t tcp -n "nqn.2016-06.io.spdk:cnode1" -a 192.168.10.194 -s 4420
Disconnect: nvme disconnect -n "nqn.2016-06.io.spdk:cnode1"
下面显示了用于加载驱动程序nvme-tcp的命令 modprobe nvme-tcp
1.3 FIO通过配置文件运行
除了命令行直接执行命令外,也可以通过写配置到 xxx.fio文件中,每次只用修改配置即可,使用更方便些,执行方式为 fio xxx.fio
比如测试10.168.1.194控制器的FIO,那就将偶数编号的卷写入xxx.fio文件中。
卷的编号 nvme list
# fio配置文件举例
[global]
bs=512 # 单次io的块文件大小
ioengine=libaio # Linux本地异步I/O,libaio工作的时候需要文件direct方式打开
userspace_reap # 提高异步IO收割的速度
rw=randrw # 测试随机写和读的I/O
rwmixwrite=20 # 在混合读写的模式下,写占20%
time_based
runtime=180 # 基本单位秒
direct=1 # 如果为真,则使用非缓冲 I/O
group_reporting # 关于显示结果的,汇总每个进程的信息
randrepeat=0
norandommap
ramp_time=6
iodepth=16 # 针对文件保持运行的 I/O 单元数。
iodepth_batch=8 # 一次提交的 I/O 数量
iodepth_low=8 # 指示何时再次开始填充队列的低水位线
iodepth_batch_complete=8 # 这定义了一次检索多少个 IO
exitall
[test]
filename=/dev/nvdisk0 # 测试文件名称,通常选择需要测试的盘的data目录
numjobs=1
1.4 双机+双fio测试
tips:
- 每次操作前首先将
/opt/leadstor/lsfs/
目录下的lsfstool、afa_tgt
文件备份。 - 在3.75上执行
ipmitool -I lanplus -H 192.168.1.127 -U ADMIN -P ADMIN chassis power on/off/cycle
可以关掉125的机器(或者shutdown) - 192.168.1.127是192.168.1.125的管理地址
客户端连接服务器(双机模式)之后,每一步连接之后创执行 nvme list
查看对应的映射盘号,不然后续两个重复的无法分辨;或者全部连接之后,执行 nvme list-subsys
查看详细信息。
查看连接的nvme状态
可以看到最下面四行即为我们连接的卷组映射,/dev/nvme24n1和/dev/nvme26n1、/dev/nvme25n1和/dev/nvme27n1是重复的,执行双机双fio测试就要将四个卷组映射挑选出两个(/dev/nvme25n1、/dev/nvme26n1)执行。
- 遇到问题
- 运行错误显示
fio: looks like your file system does not support direct=1/buffered=0
;改为direct=0 - 设备没有空余空间
fio: io_u error on file /dev/nvme25n1: No space left on device: write offset=16849829888, buflen=32768
;size改为5GB - 上一条是因为NVMF未启动导致写测试并没有真正写到磁盘里,因此先删除dev里面生成的文件(Linux特性,将磁盘读写当成文件,所以没有磁盘设备时会新建一个文件)
- 客户端连接、测试之后,并没有及时关闭连接造成客户端崩溃;及时
nvme disconnect-all
- 关闭客户端
shutdown
,在192.1683.75上执行ipmitool -I lanplus -H 192.168.1.127 -U ADMIN -P ADMIN chassis power on/off/cycle
可以关掉125的机器 - 第二天显示fs系统创建异常;在LSMC停止的情况重启数据库
pcsd LSMC
/opt/leadstor/lsmc/bin/db_setup.py reset
pcse LSMC
tl #实时监控fs启动
- 运行错误显示
1.5 fio测试
fio测试写验证(注意size不超过卷的大小)配置文件
rw=write
verify=crc32c
verify_fatal=1
verify_dump=1
verify_backlog=1
vim配置,其他见链接
<1> zf(Fold creation)–创建折叠(注意在.vimrc中设置set foldmethod=marker)
zf56G,创建从当前行起到56行的代码折叠;
10zf或10zf+或zf10↓,创建从当前行起到后10行的代码折叠。
10zf-或zf10↑,创建从当前行起到之前10行的代码折叠。
在括号处zf%,创建从当前行起到对应的匹配的括号上去((),{},[],<>等)。
zr 打开被折叠的代码
zm 折叠打开的代码
zD 循环删除 (Delete) 光标下的折叠,即嵌套删除折叠。仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。
zE 除去 (Eliminate) 窗口里“所有”的折叠。仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效。
2. 优化代码
2.1 程序运行细节
检查代码内存泄漏:
cp /root/workspace/afa-spdk/module/bdev/lsfsvol/lib_ddn_test.c /root/workspace/lsfs-main/test/devtest
cd /root/workspace/lsfs-main/test/devtest
make test
运行asan
LD_PRELOAD="/lib64/libasan.so.5" ./lib_ddn_test
gdb --args ./afa_tgt
set exec-wrapper env LD_PRELOAD=/lib64/libasan.so.5
make test_asan
/root/workspace/lsfs-main/build/test_asan/devtest
3. 性能测试
3.1 spdk启动
运行gdblsfs.sh
#! /bin/bash
#清理环境
echo 0 > /proc/sys/vm/nr_hugepages
echo 0 > /proc/sys/vm/nr_hugepages
#重置硬盘
cd /root/sqh/
./hugepage.sh
./lsfstool Create -e 2
#./cp_dump -e
#设置 数据库 0 0 1 0代表node0状态0,node1状态0(启动)
#redis-cli -p 6379 hmset node 0 0 1 3
redis-cli -p 6379 hmset node 0 0 1 0
redis-cli -p 6379 keys volume*|xargs redis-cli -p 6379 DEL
redis-cli -p 6379 keys snapshot*|xargs redis-cli -p 6379 DEL
redis-cli -p 6379 keys fs_gns_sync*|xargs redis-cli -p 6379 DEL
redis-cli -p 6379 keys fs_sr*|xargs redis-cli -p 6379 DEL
redis-cli -p 6379 hmset fs_js_recovery_sync:0 idBlk0 -2 idBlkTail0 -2 idBlkFree0 -2 idBlkRem0 -2 dataBlk0 -2 dataBlkTail0 -2 dataBlkFree0 -2 dataBlkRem0 -2 idHeader0 -2 idBlk1 -2 idBlkTail1 -2 idBlkFree1 -2 idBlkRem1 -2 dataBlk1 -2 dataBlkTail1 -2 dataBlkFree1 -2 dataBlkRem1 -2 idHeader1 -2
redis-cli -p 6379 hmset fs_js_recovery_sync:1 idBlk0 -2 idBlkTail0 -2 idBlkFree0 -2 idBlkRem0 -2 dataBlk0 -2 dataBlkTail0 -2 dataBlkFree0 -2 dataBlkRem0 -2 idHeader0 -2 idBlk1 -2 idBlkTail1 -2 idBlkFree1 -2 idBlkRem1 -2 dataBlk1 -2 dataBlkTail1 -2 dataBlkFree1 -2 dataBlkRem1 -2 idHeader1 -2
# 初始化卷
for ((i=1;i<33;++i))
do
redis-cli -p 6379 hmset volume:$i name "vol$i" size 53687091200 raid 2 id $i status 1 origin_vol_id -1 origin_snap_id -1 compression 0 block_len 512 mirror 0
done
#gdb --args $(pwd)/afa_tgt -c $(pwd)/spdk_config.json.iscsi -m 0xFF00000000;
#gdb --args $(pwd)/afa_tgt -c $(pwd)/spdk_config.json.empty -r 10.0.0.110:8888 -m 0x007F000000000000;
#gdb --args $(pwd)/afa_tgt -c $(pwd)/spdk_config.json.empty -r 10.0.0.110:8888 -m 0x0FFF000000000000;
gdb --args $(pwd)/afa_tgt -c $(pwd)/spdk_config.json.empty -r 10.0.0.110:8888 -m 0x0FFF000000000000;
#gdb --args $(pwd)/afa_tgt -c $(pwd)/spdk_config.json.empty -r 10.0.0.110:8888 -m 0x0300000000000000;
#LD_PRELOAD="/lib64/libasan.so.5" ASAN_OPTIONS=verbosity=2:abort_on_error=1:disable_coredump=0:log_path=/var/log/asan_log $(pwd)/afa_tgt -c $(pwd)/spdk_config.json.empty -r 10.0.0.110:8888 -m 0x0FFF000000000000;
3.2 bdev设备
/root/sqh/s1.sh
3.3 互相连接
/root/sqh/s2.sh
194和195服务器上的同步卷互相连接,以便进行同步操作
单机不不需要互相连接
3.4 FS启动
/root/sqh/s3.sh
类似的,单机运行FS启动不需要数据同步这一步
#!/usr/bin/bash
# 数据同步
./rpc.py -s 10.0.0.110 -p 8888 lsfs_setup_js_virtual_disk -d1 /dev/nvme22n1 -d2 /dev/nvme23n1 -d3 /dev/nvme24n1 -d4 /dev/nvme25n1
#./rpc.py -s 10.0.0.110 -p 8888 lsfs_setup_js_virtual_disk -d1 /dev/nvme22n1 -d2 /dev/nvme23n1 -d3 /dev/nvme24n1 -d4 /dev/nvme25n1 -d5 /dev/nvme26n1 -d6 /dev/nvme27n1 -d7 /dev/nvme28n1 -d8 /dev/nvme29n1
#./rpc.py -s 10.0.0.110 -p 8888 lsfs_start -d1 /dev/nvme22n1 -d2 /dev/nvme23n1 -d3 /dev/nvme24n1 -d4 /dev/nvme25n1
#./rpc.py -s 10.0.0.110 -p 8888 lsfs_start -d1 /dev/nvme22n1 -d2 /dev/nvme23n1
# FS系统启动
./rpc.py -s 10.0.0.110 -p 8888 lsfs_start
3.5 映射卷,导入spdk
blk_lsfs_vm_tgt.sh
3.6 虚拟主机
/var/nas/orgin_vm_start.sh &
后面跟&可以在后台运行,同时还要配置ip地址(ipconfig查看本机ip地址)
#!/usr/bin/env bash
source /opt/leadstor/lsmc/bin/conf/common.sh
img_path=`pwd`
qemu_path=qemu-system-x86_64
cpu_num=6
memory_size=8G
start_vm() {
lsmc_sh_log "Start nas qemu vm"
taskset -c 16-21 ${qemu_path} \
--enable-kvm -cpu host -smp ${cpu_num} -m ${memory_size} -object memory-backend-file,id=mem0,size=${memory_size},mem-path=/dev/hugepages,share=on -numa node,memdev=mem0 \
-drive file=${img_path}/centos.img,if=none,id=disk -device ide-hd,drive=disk,bootindex=0 \
-netdev tap,ifname=tap1,id=mynet1,vhost=on,script=no,downscript=no -device virtio-net-pci,netdev=mynet1,id=b1 \
-monitor telnet:127.0.0.1:9977,server,nowait
}
# Start here
main() {
# 设置为本机地址
export DISPLAY="192.168.2.183:0.0"
start_vm
}
main
lsblk
查看194服务器上连接的卷,!tel
打开qemu
,然后配置vhost
chardev-add socket,id=spdk_vhost_blk1,path=/root/sqh/vhost.11
device_add vhost-user-blk-pci,id=blk1,chardev=spdk_vhost_blk1,num-queues=2,queue-size=1024
chardev-add socket,id=spdk_vhost_blk2,path=/root/sqh/vhost.12
device_add vhost-user-blk-pci,id=blk2,chardev=spdk_vhost_blk2,num-queues=2,queue-size=1024
chardev-add socket,id=spdk_vhost_blk3,path=/root/sqh/vhost.13
device_add vhost-user-blk-pci,id=blk3,chardev=spdk_vhost_blk3,num-queues=2,queue-size=1024
chardev-add socket,id=spdk_vhost_blk4,path=/root/sqh/vhost.14
device_add vhost-user-blk-pci,id=blk4,chardev=spdk_vhost_blk4,num-queues=2,queue-size=1024
chardev-add socket,id=spdk_vhost_blk5,path=/root/sqh/vhost.15
device_add vhost-user-blk-pci,id=blk5,chardev=spdk_vhost_blk5,num-queues=2,queue-size=1024
chardev-add socket,id=spdk_vhost_blk6,path=/root/sqh/vhost.16
device_add vhost-user-blk-pci,id=blk6,chardev=spdk_vhost_blk6,num-queues=2,queue-size=1024
chardev-add socket,id=spdk_vhost_blk7,path=/root/sqh/vhost.17
device_add vhost-user-blk-pci,id=blk7,chardev=spdk_vhost_blk7,num-queues=2,queue-size=1024
chardev-add socket,id=spdk_vhost_blk8,path=/root/sqh/vhost.18
device_add vhost-user-blk-pci,id=blk8,chardev=spdk_vhost_blk8,num-queues=2,queue-size=1024
之后执行fio文件,记录ddn性能测试的数据,例如ipos。最后关闭虚拟主机shutdown now