FS技术总结

2023-11-12

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=32768size改为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.sh194和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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FS技术总结 的相关文章

  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序

随机推荐

  • 美国的ACH支付体系

    美国支付体系研究 ACH支付网络 ACH是Automatic Clearing House的缩写 是美国支付体系中最主要的支付网络之一 是一个批量处理 存储和转发的电子支付系统 在美国支付体系中占据重要地位 ACH支付网络 以下简称ACH
  • 高级计算机网络(习题一加解析)

    个性不要个体 独立不要孤立 自由不要自私 浪漫不要散漫 路漫漫其修远兮 吾将上下而求索 屈原 离骚 文章介绍 这是计算机网络老师布置的课后作业 参考文章 习题二 习题三 习题四 持续更新 题目都很新型 网上很难能够找出所有答案 今天分享出来
  • C++ 基础编程 路灯问题

    问题描述 V先生有一天工作到很晚 回家的时候要穿过一条长l的笔直的街道 这条街道上有n个路灯 假设这条街起点为0 终点为l 第i个路灯坐标为ai 路灯发光能力以正数d来衡量 其中d表示路灯能够照亮的街道上的点与路灯的最远距离 所有路灯发光能
  • equals与==的区别

    1 equals 函数 只是用来比较两个变量中的值是否一致 它不管类型等要素 例s1 ssss s2 ssss s1 equals s2 为ture 2 是比较两个变量的地址是否一样 类型不一样地址也不一样 就算类型一样 储存的空间不一样的
  • BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Mode

    Paper name BLIP 2 Bootstrapping Language Image Pre training with Frozen Image Encoders and Large Language Models Paper R
  • control的用法及短语_out of control用法及例句

    out of control短语的意思是 失去控制 不受控制 如果Out of control 三个单词之间用横杠连接 做形容词 意思是失控的 out of control用法例句 An out of control car crashed
  • IDEA配置sonar

    idea配置sonar步骤如下 1 安装sonar插件 如果安装失败就多安装几次 博主就是安装了两次 第一次安装失败了 第二次才安装成功的 安装成功后重启idea 2 添加sonar服务器连接 3 选择连接到服务 填入名称和服务地址 4 n
  • window 设置开机自启脚本

    想在开机的时候启动某些程序 exe bat 什么的 想启动那个程序找到程序的启动目录 或者右键其快捷方式 打开文件位置找到其应用程序 如果路径为 D weixin wechat exe 则新建一个文件 文本类型就行 打开后编辑 D cd w
  • 吐血总结!50道Python面试题集锦(附答案)

    Python是目前编程领域最受欢迎的语言 在本文中 我将总结Python面试中最常见的50个问题 每道题都提供参考答案 希望能够帮助你在2023年求职面试中脱颖而出 找到一份高薪工作 这些面试题涉及Python基础知识 Python编程 数
  • 类的成员函数

    类的成员函数 1 拷贝构造函数 1 1 定义 1 2 特征 1 3 implementation 2 赋值运算符重载 2 1 定义 2 2 特征 2 3 implementation 1 拷贝构造函数 1 1 定义 构造函数 特殊的成员函数
  • 怎么在gitLab代码拉到本地

    怎么在gitLab代码拉到本地 新手从gitLab下载代码到本地 首先在本地上面创建一个空文件 然后在cmd里边输入 命令 1 cd C Users l Desktop 帝测科技 dou 创建的空文件路径 2 git clone http
  • amd 虚拟化怎么开_虚拟化技术 - CPU虚拟化

    物理机器是由CPU 内存和I O设备等一组资源构成的实体 虚拟机也一样 由虚拟CPU 虚拟内存和虚拟I O设备等组成 VMM VM Monitor 按照与传统OS并发执行用户进程的相似方式 仲裁对所有共享资源的访问 前面的文章对虚拟化技术进
  • windows下:“activate” is not a conda command

    问题描述 在windows下安装了anaconda并安装虚拟环境后 打开Anaconda Prompt窗口 执行 conda activate virtual env 时出现以下错误 CommandNotFoundError Command
  • 神州路由器DHCPv6中继服务配置

    配置如下 R1 Router gt ena Router conf R1 config ipv6 unicast routing R1 config int g0 1 R1 config g0 1 ipv6 add 2001 1 2 64
  • 在WPF中将数据从数据库导出到Excel的快速解决方案

    Spire XLS一种专业且功能强大的Excel API 使开发人员 程序员可以使用其应用程序操作Excel文件 没有Microsoft Automation Spire XLS可使编程变得更加简单 免费下载 本文将介绍一种将数据从数据库导
  • python增删改查界面_必看!!!python列表( 增 删 改 查),超详细讲解!!

    列表类型特有方法 不同的类型有自己不同的操作方法 对列表的操作有增删改查四种操作 1 增加操作 方法描述append追加 在列表的尾部加入指定的元素 extend将指定序列的元素依次追加到列表的尾部 合并 不会去重复内容 insert将指定
  • 身份证性别判断

    性别判断 param value return 1 女 2 男 public String execute String value value value trim if value length 15 if Integer parseI
  • 加速度计和陀螺仪指南

    本帖翻译自IMU 加速度计和陀螺仪设备 在嵌入式应用中使用的指南 这篇文章主要介绍加速度计和陀螺仪的数学模型和基本算法 以及如何融合这两者 侧重算法 思想的讨论 介绍 本指南旨在向兴趣者介绍惯性MEMS 微机电系统 传感器 特别是加速度计和
  • ReentrantLock详解

    一 AQS 1 AbstractQueuedSynchronizer AbstractQueuedSynchronizer简称AQS 是一个用于构建锁和相关同步器的框架 它依赖于FIFO的等待队列实现 见AbstractQueuedSync
  • FS技术总结

    技术总结 1 单机FIO测试 1 1 配置FS环境 1 2 配置 Linux NVMe over Fabrics 主机 1 3 FIO通过配置文件运行 1 4 双机 双fio测试 1 5 fio测试 2 优化代码 2 1 程序运行细节 3