​Linux开源存储漫谈(3)Linux-IO iSCSI Target vs NFS

SCSI & iSCSI

SCSI是Small Computer System Interface(小型计算机系统接口)的缩写,基于client-server模型,SCSI client称为initiator,server称为target。iSCSI(Internet Small Computer System Interface),Internet小型计算机系统接口,又称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术。iSCSI是建立在TCP协议之上的块传输层协议,是一组基于块的命令,iSCSI协议使用Initiator将一组SCSI命令发送到target上执行某种操作以实现存储和数据读写。

iSCSI及基本概念

两个重要的组件启动器(initiator)和目标(target)
目标,iSCSI target是存储设备端或模拟存储设备,是存储设备,其目的是为其他主机提供网络磁盘。Linux内核LIO模块即实现iSCSI target的模拟, 详见Linux Storage Stack Diagram 。

启动器,iSCSI initiator就是能够使用target的客户端,通常是服务器。也就是说,想要连接到iscsi target的服务器,需要安装iSCSI initiator相关的软件包,如open-iscsi

Network Portal: 网络端口。在 initiator端用IP地址标识,在target端IP地址及端口IP:PORT

Session: 连接initiator和target的一组TCP连接构成。可以向 session 添加 TCP 连接,一个session中是可以有多个连接,一个 session只能看到同一个target(多网卡应用)

Connection : Initiator和target间的一个TCP连接

CID(Connection ID): 每个connection都有一个CID ,该标识在session范围内是唯一。CID由 initiator产生,在 login 请求和使用 logout 关闭 连接时传递给 target。

SSID(Session ID):一个 iSCSI Initiator 与 iSCSI Target 之间的会话(Session)由会话ID(SSID)定义,该会话ID是一个由发起方部分(ISID)和目标部分(Target Portal Group Tag)组成的元组。 ISID 在会话建立时由发起者明确指定。 Target Portal Group Tag 由发起者在连接建立时选择的 TCP端口来隐式指定

Portal Groups: 网络端口组。iSCSI session 支持多连接,一些实现能把通过多个端口建立的多个连接捆绑到一个 session。 一个 iSCSI 网络实体的多个网络端口被定义为一个网络端口组,把该组和一个 session 联系起来,该 session 就可以捆绑通过该组内多个端口建立的多个连接,再使它们一起协同工作以达到捆绑的目的。每一个该组的 session 并不需要包括该组的所有网络端口。一个 iSCSI 节点可能有一或者多个网络端口组,但是每一个 iSCSI 使用的网络端口只能属于 iSCSI 节点的一个组。

Target Portal Group Tag: 网络端口组标识。使用 16 比特的数标识一个网络端口组。在 一个 iSCSI 节点里,所有具有同样组标志的端口构成一个网络端口组

iSCSI Task: 一个 iSCSI 任务是指一个需要响应的 iSCSI 请求

搭建基于Linux-IO的iSCSI target

1.  安装targetcli并启动target服务

ubuntu-live-server 22.04安装targetcli并启动target.service服务(或参考环境准备篇

root@nvme:~# apt install -y targetcli-fb
root@nvme:~# systemctl start target.service
root@nvme:~# systemctl enable target.service

2. 运行targetcli配置iscsi target,先运行lsblk查看块设备

root@nvme:~# lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    ......
sda       8:0    0   1.8T  0 disk
├─sda2    8:2    0   200G  0 part /
└─sda5    8:5    0  1007K  0 part
nvme0n1 259:0    0 931.5G  0 disk

运行targetcli进入交互窗口(# 手动添加说明信息 #)

root@nvme:~# targetcli
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> ls
o- / ................................................................................ [...]
  o- backstores ..........# iscsi后端支持的存储类型 #................................. [...]
  | o- block .............# 块设备,磁盘驱动器、磁盘分区、逻辑卷等 #.... [Storage Objects: 0]
  | o- fileio ............# 指定大小的文件 #........................... [Storage Objects: 0]
  | o- pscsi .............# 物理SCSI设备 #............................. [Storage Objects: 0]
  | o- ramdisk ...........# 内存盘,重启失效 #......................... [Storage Objects: 0]
  o- iscsi ................................................. [mutual disc auth, Targets: 0]
  o- loopback ................................................................ [Targets: 0]
  o- vhost ................................................................... [Targets: 0]
/>

第一步,基于/dev/nvme0n1创建名为iscsi_nvme的backstores/block

/> cd backstores/block/
/backstores/block>
/backstores/block> create iscsi_nvme /dev/nvme0n1
Created block storage object iscsi_nvme using /dev/nvme0n1.

第二步,创建iSCSI target,名称可由系统自动生成,是一串用于描述共享资源的唯一字符串,iSCSI target 命名约定格式,iqn.yyyy-mm.*:*,iqn:ISCSI Qualified Name,如果没有关闭(/> set group=global auto_add_default_portal=false),则自动创建网络端口组(portal groups)及网络端口(portal,0.0.0.0:3260)

/> get global
GLOBAL CONFIG GROUP
===================
auto_add_default_portal=true
----------------------------
If true, adds a portal listening on all IPs to new targets.

auto_add_mapped_luns=true
-------------------------
If true, automatically create node ACLs mapped LUNs after creating a new target LUN or a new node ACL

auto_cd_after_create=false
--------------------------
If true, changes current path to newly created objects.

auto_enable_tpgt=true
---------------------
If true, automatically enables TPGTs upon creation.

auto_save_on_exit=true
----------------------
If true, saves configuration on exit.

auto_use_daemon=false
---------------------
If true, commands will be sent to targetclid.

color_command=cyan
------------------
Color to use for command completions.

color_default=none
------------------
Default text display color.

color_keyword=cyan
------------------
Color to use for keyword completions.

color_mode=true
---------------
Console color display mode.

color_parameter=magenta
-----------------------
Color to use for parameter completions.

color_path=magenta
------------------
Color to use for path completions

daemon_use_batch_mode=false
---------------------------
If true, use batch mode for daemonized approach.

export_backstore_name_as_model=true
-----------------------------------
If true, the backstore name is used for the scsi inquiry model name.

logfile=/root/.targetcli/log.txt
--------------------------------
Logfile to use.

loglevel_console=info
---------------------
Log level for messages going to the console.

loglevel_file=debug
-------------------
Log level for messages going to the log file.

max_backup_files=10
-------------------
Max no. of configurations to be backed up in /etc/rtslib-fb-target/backup/ directory.

prompt_length=30
----------------
Max length of the shell prompt path, 0 for infinite.

tree_max_depth=0
----------------
Maximum depth of displayed node tree.

tree_round_nodes=true
---------------------
Tree node display style.

tree_show_root=true
-------------------
Whether or not to display tree root.

tree_status_mode=true
---------------------
Whether or not to display status in tree.

/>

/> cd /iscsi
/iscsi>
/iscsi> create iqn.2023-05.nvme.iscsi.com:nvmeiscsi
Created target iqn.2023-05.nvme.iscsi.com:nvmeiscsi.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

第三步,创建LUN

/> cd iscsi/iqn.2023-05.nvme.iscsi.com:nvmeiscsi/tpg1/luns
/iscsi/iqn.20...csi/tpg1/luns> create /backstores/block/iscsi_nvme
Created LUN 0.

第四步,配置discovery_auth & acl,"# 注释信息" 


# 设置discovery认证信息

/iscsi> set discovery_auth userid=disUser password=disUserPwd
Parameter userid is now 'disUser'.
Parameter password is now 'disUserPwd'.
/iscsi> set discovery_auth mutual_userid=mDisUser mutual_password=mDisUserPwd
Parameter mutual_userid is now 'mDisUser'.
Parameter mutual_password is now 'mDisUserPwd'.
/iscsi> get discovery_auth
DISCOVERY_AUTH CONFIG GROUP
===========================
enable=True
-----------
The enable discovery_auth parameter.

mutual_password=mDisUserPwd
---------------------------
The mutual_password discovery_auth parameter.

mutual_userid=mDisUser
----------------------
The mutual_userid discovery_auth parameter.

password=disUserPwd
-------------------
The password discovery_auth parameter.

userid=disUser
--------------
The userid discovery_auth parameter.

/iscsi>

# 设置target 认证信息(只读权限)

/iscsi> cd iqn.2023-05.nvme.iscsi.com:nvmeiscsi/tpg1/
/iscsi/iqn.20...vmeiscsi/tpg1> set attribute authentication=1 generate_node_acls=1
Parameter authentication is now '1'.
Parameter generate_node_acls is now '1'.
/iscsi/iqn.20...vmeiscsi/tpg1> set auth userid=clientUser password=clientUserPwd
Parameter userid is now 'clientUser'.
Parameter password is now 'clientUserPwd'.
/iscsi/iqn.20...vmeiscsi/tpg1> set auth mutual_userid=mClientUser mutual_password=mClientUserPwd
Parameter mutual_userid is now 'mClientUser'.
Parameter mutual_password is now 'mClientUserPwd'.
/iscsi/iqn.20...vmeiscsi/tpg1> get auth
AUTH CONFIG GROUP
=================
mutual_password=mClientUserPwd
------------------------------
The mutual_password auth parameter.

mutual_userid=mClientUser
-------------------------
The mutual_userid auth parameter.

password=clientUserPwd
----------------------
The password auth parameter.

userid=clientUser
-----------------
The userid auth parameter.
/iscsi/iqn.20...vmeiscsi/tpg1> 
/iscsi/iqn.20...vmeiscsi/tpg1> cd acls/

# 创建acl,及配置认证信息,acl的名称将用于InitiatorName(读写权限)
/iscsi/iqn.20...csi/tpg1/acls> create iqn.2023-05.vm-nvme.iscsi.com:client001
Created Node ACL for iqn.2023-05.vm-nvme.iscsi.com:client001
Created mapped LUN 0.
/iscsi/iqn.20...csi/tpg1/acls> cd iqn.2023-05.vm-nvme.iscsi.com:client001/
/iscsi/iqn.20...com:client001> set auth userid=rwClientUser password=rwClientUserPwd
Parameter userid is now 'rwClientUser'.
Parameter password is now 'rwClientUserPwd'.
/iscsi/iqn.20...com:client001> set auth mutual_userid=mRwClientUser mutual_password=mRwClientUserPwd
Parameter mutual_userid is now 'mRwClientUser'.
Parameter mutual_password is now 'mRwClientUserPwd'.
/iscsi/iqn.20...com:client001> get auth
AUTH CONFIG GROUP
=================
mutual_password=mRwClientUserPwd
--------------------------------
The mutual_password auth parameter.

mutual_userid=mRwClientUser
---------------------------
The mutual_userid auth parameter.

password=rwClientUserPwd
------------------------
The password auth parameter.

userid=rwClientUser
-------------------
The userid auth parameter.

/iscsi/iqn.20...com:client001>
/iscsi/iqn.20...com:client001> cd /

第四步,最后查看iscsi配置信息

/> cd iscsi/iqn.2023-05.nvme.iscsi.com:nvmeiscsi/tpg1/
/iscsi/iqn.20...vmeiscsi/tpg1> cd /
/> ls
o- / ......................................................................................................................... [...]
  o- backstores .............................................................................................................. [...]
  | o- block .................................................................................................. [Storage Objects: 1]
  | | o- iscsi_nvme ................................................................. [/dev/nvme0n1 (931.5GiB) write-thru activated]
  | |   o- alua ................................................................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]
  | o- fileio ................................................................................................. [Storage Objects: 0]
  | o- pscsi .................................................................................................. [Storage Objects: 0]
  | o- ramdisk ................................................................................................ [Storage Objects: 0]
  o- iscsi .......................................................................................... [mutual disc auth, Targets: 1]
  | o- iqn.2023-05.nvme.iscsi.com:nvmeiscsi .............................................................................. [TPGs: 1]
  |   o- tpg1 .................................................................................... [gen-acls, tpg-auth, mutual auth]
  |     o- acls .......................................................................................................... [ACLs: 1]
  |     | o- iqn.2023-05.vm-nvme.iscsi.com:client001 ................................................ [auth via tpg, Mapped LUNs: 1]
  |     |   o- mapped_lun0 ............................................................................ [lun0 block/iscsi_nvme (rw)]
  |     o- luns .......................................................................................................... [LUNs: 1]
  |     | o- lun0 ............................................................. [block/iscsi_nvme (/dev/nvme0n1) (default_tg_pt_gp)]
  |     o- portals .................................................................................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ..................................................................................................... [OK]
  o- loopback ......................................................................................................... [Targets: 0]
  o- vhost ............................................................................................................ [Targets: 0]
/> exit

第五步,设置防火墙(开放端口,或直接关闭ubuntu防火墙)

# 开放3260端口
root@nvme:~# ufw allow 3260
Rules updated
Rules updated (v6)

# 关闭Ubuntu防火墙
root@nvme:~# ufw disable
Firewall stopped and disabled on system startup
root@nvme:~#

配置iSCSI Initiator

1. 启动qemu-kvm虚拟机,参见环境准备篇启动qemu虚拟机

2. 进入root用户,安装并配置open-iscsi

root@nvme:~# ssh ubuntu@192.168.2.112
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-71-generic x86_64)

    ......

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


Last login: Fri May 12 03:27:02 2023 from 192.168.2.111
ubuntu@vm-nvme:~$ sudo su -
root@vm-nvme:~#
root@vm-nvme:~# apt install -y open-iscsi

# 修改/etc/iscsi/initiatorname.iscsi,修改后内容如下
root@vm-nvme:~# cat /etc/iscsi/initiatorname.iscsi | grep -v -E "^$|^#"
InitiatorName=iqn.2023-05.vm-nvme.iscsi.com:client001
root@vm-nvme:~#


# 修改/etc/iscsi/iscsi.conf,修改后内容如下
root@vm-nvme:~# cat  /etc/iscsi/iscsid.conf | grep -v -E "^$|^#" | grep auth
node.session.auth.authmethod = CHAP
node.session.auth.username = rwClientUser
node.session.auth.password = rwClientUserPwd
node.session.auth.username_in = mRwClientUser
node.session.auth.password_in = mRwClientUserPwd
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = disUser
discovery.sendtargets.auth.password = disUserPwd
discovery.sendtargets.auth.username_in = mDisUser
discovery.sendtargets.auth.password_in = mDisUserPwd

3. 发现iSCSI target,然后login,之后运行lsblk查看iSCSI设备(/dev/sdc)

root@vm-nvme:~# iscsiadm -m discovery -t sendtargets -p 192.168.2.111:3260
192.168.2.111:3260,1 iqn.2023-05.nvme.iscsi.com:nvmeiscsi
root@vm-nvme:~# 
root@vm-nvme:~# iscsiadm -m node -T  iqn.2023-05.nvme.iscsi.com:nvmeiscsi --login
Logging in to [iface: default, target: iqn.2023-05.nvme.iscsi.com:nvmeiscsi, portal: 192.168.2.111,3260]
Login to [iface: default, target: iqn.2023-05.nvme.iscsi.com:nvmeiscsi, portal: 192.168.2.111,3260] successful.
root@vm-nvme:~# 
root@vm-nvme:~# iscsiadm -m session show
tcp: [2] 192.168.2.111:3260,1 iqn.2023-05.nvme.iscsi.com:nvmeiscsi (non-flash)
root@vm-nvme:~# 
root@vm-nvme:~# lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
fd0       2:0    1     4K  0 disk
   ......
sdb       8:16   0  32.2G  0 disk
├─sdb1    8:17   0  32.1G  0 part /
├─sdb14   8:30   0     4M  0 part
└─sdb15   8:31   0   106M  0 part /boot/efi
sdc       8:32   0 931.5G  1 disk
vda     252:0    0   366K  0 disk
root@vm-nvme:~# 

4. 来一波fio性能测试,性能测试之前,先看一下网络,宿主机(192.168.2.111)和虚拟机(192.168.2.112)通过宿主机虚拟网桥kvmbr0连接,先使用iperf测试一下两个系统之间的网络带宽,两个OS都执行,apt install -y iperf,如果虚拟机执行失败,使用宿主机/etc/apt/sources.list覆盖虚拟机/etc/apt/sources.list,在执行apt install -y iperf

# 宿主机192.168.2.111,安装并启动iperf server
root@nvme:~# apt install -y iperf
root@nvme:~# iperf -s -f M
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 9.54 MByte (default)
------------------------------------------------------------
[  1] local 192.168.2.111 port 5001 connected with 192.168.2.112 port 49926
[ ID] Interval       Transfer     Bandwidth
[  1] 0.0000-10.0011 sec  37436 MBytes  3743 MBytes/sec
root@nvme:~#


# 虚拟机192.168.2.112
root@vm-nvme:~# apt install -y iperf
root@vm-nvme:~# iperf -f G -c 192.168.2.111
------------------------------------------------------------
Client connecting to 192.168.2.111, TCP port 5001
TCP window size:  595 KByte (default)
------------------------------------------------------------
[  1] local 192.168.2.112 port 56570 connected with 192.168.2.111 port 5001
[ ID] Interval       Transfer     Bandwidth
[  1] 0.0000-10.0116 sec  36.5 GBytes  3.64 GBytes/sec
root@vm-nvme:~#

iperf测试结果可以看出宿主机与虚拟机的网络带宽可达到36Gbps,3700M字节,可以断定网络带宽足够,不会成为iSCSI数据传输瓶颈

确认网络带宽后,启动fio测试iSCSI的性能,使用​Linux开源存储漫谈——IO性能测试利器中本地测试相同fio参数

root@vm-nvme:~/fio# lsscsi -l
[0:0:1:0]    disk    ATA      QEMU HARDDISK    2.5+  /dev/sda
  state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30
[1:0:0:0]    disk    ATA      QEMU HARDDISK    2.5+  /dev/sdb
  state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30
[2:0:0:0]    disk    LIO-ORG  iscsi_nvme       4.0   /dev/sdc
  state=running queue_depth=128 scsi_level=7 type=0 device_blocked=0 timeout=30
root@vm-nvme:~/fio# 
root@vm-nvme:~/fio# cat nread.fio
[global]
bs=4096
rw=read
ioengine=libaio
size=50G
direct=1
iodepth=256
iodepth_batch=128
iodepth_low=128
iodepth_batch_complete=128
userspace_reap
group_reporting
[test]
numjobs=1
filename=/dev/sdc
root@vm-nvme:~/fio# fio nread.fio
test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=256
fio-3.28
Starting 1 process
Jobs: 1 (f=1): [R(1)][100.0%][r=1183MiB/s][r=303k IOPS][eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=2448: Fri May 12 06:25:25 2023
  read: IOPS=299k, BW=1168MiB/s (1225MB/s)(50.0GiB/43839msec)
    slat (usec): min=69, max=1855, avg=93.69, stdev=16.30
    clat (usec): min=368, max=12692, avg=745.73, stdev=115.29
     lat (usec): min=457, max=13858, avg=839.43, stdev=119.77
    clat percentiles (usec):
     |  1.00th=[  586],  5.00th=[  685], 10.00th=[  693], 20.00th=[  709],
     | 30.00th=[  717], 40.00th=[  725], 50.00th=[  734], 60.00th=[  742],
     | 70.00th=[  758], 80.00th=[  775], 90.00th=[  807], 95.00th=[  865],
     | 99.00th=[  979], 99.50th=[ 1074], 99.90th=[ 1778], 99.95th=[ 2311],
     | 99.99th=[ 4359]
   bw (  MiB/s): min= 1001, max= 1217, per=100.00%, avg=1168.30, stdev=27.87, samples=87
   iops        : min=256256, max=311552, avg=299084.48, stdev=7134.34, samples=87
  lat (usec)   : 500=0.22%, 750=66.40%, 1000=32.58%
  lat (msec)   : 2=0.74%, 4=0.05%, 10=0.01%, 20=0.01%
  cpu          : usr=7.08%, sys=23.74%, ctx=535537, majf=0, minf=266
  IO depths    : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.0%
     submit    : 0=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=100.0%
     complete  : 0=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=100.0%
     issued rwts: total=13107200,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=256

Run status group 0 (all jobs):
   READ: bw=1168MiB/s (1225MB/s), 1168MiB/s-1168MiB/s (1225MB/s-1225MB/s), io=50.0GiB (53.7GB), run=43839-43839msec

Disk stats (read/write):
  sdc: ios=203884/0, merge=12844944/0, ticks=149896/0, in_queue=149896, util=99.82%
root@vm-nvme:~/fio#

测试数据可以看出,内核NVME驱动 + LIO iSCSI Target,性能损耗,iops:299k/728k,BW:1183MiB/2842MiB,无论是iops还是BW都损耗60%,latency则增长近1.5倍,338增长到839

iSCSI混合随机读写(读写比例80/20)

[global]
bs=4096
rw=randrw
rwmixwrite=20
ioengine=libaio
direct=1
group_reporting
iodepth=32
iodepth_batch=8
iodepth_low=8
iodepth_batch_complete=8
userspace_reap
runtime=60
[test]
numjobs=16
filename=/dev/sdc
iodepth/_low/_batch/_completenumjobsiops(read)bw(read)iops(write)bw(write)
64/16/16/161629.4k115MiB/s735528.7MiB/s
32/8/8/81629.8k117MiB/s746429.2MiB/s
32/8/8/8828.9k113MiB/s722928.2MiB/s

对比​Linux开源存储漫谈——IO性能测试利器内核nvme驱动的测试结果相同参数总体上损耗掉25%的性能

NFS性能测试

Linux内核中实现了nfs,nfs具体是用rpc来实现的,linux内核的rpc模块实现大致三个模块:一是与用户层的接口;二是逻辑控制框架;三是通信框架,其中,用户层的接口及通信框架都是可插拔可替换,nfs就是作为一个用户接口子的rpc应用,介绍完了NFS的实现原理,开始搭建NFS服务

铲除iscsi配置

虚拟机,注销iscsi session禁掉iscsi服务

root@vm-nvme:~# iscsiadm -m node --logout
root@vm-nvme:~# systemctl stop iscsi.service
root@vm-nvme:~# systemctl disable iscsi.service

宿主机,进入targetcli delete掉target 及backstores/block

# 清除iscsi target
root@nvme:~# targetcli
/> cd iscsi
/iscsi> delete iqn.2023-05.nvme.iscsi.com:nvmeiscsi
/iscsi> cd /backstores/block
/backstores/block> delete iscsi_nvme
/backstores/block> exit
root@nvme:~# 

# 停止并禁用target服务
root@nvme:~# systemctl stop target.service
root@nvme:~# systemctl disable target.service

宿主机配置NFS服务(见:Install the NFS Server on Ubuntu

# 安装nfs-server
root@nvme:~# apt install -y nfs-kernel-server

# mkfs nvme盘,并挂载至/mnt/nvme
root@nvme:~# mkdir -p /mnt/nvme
root@nvme:~# mkfs -t ext4 /dev/nvme0n1
root@nvme:~# mount -t ext4 /dev/nvme0n1 /mnt/nvme
root@nvme:~# mkdir /mnt/nvme/share
root@nvme:~# chown nobody:nogroup /mnt/nvme/share
root@nvme:~# chmod 777 /mnt/nvme/share

# /etc/exports 文件追加"/mnt/nvme/share *(rw,sync,fsid=0,crossmnt,no_subtree_check)"
root@nvme:~# cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) 
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
/mnt/nvme/share *(rw,sync,fsid=0,crossmnt,no_subtree_check)

# 启动nfs服务
root@nvme:~# systemctl start nfs-kernel-server 

虚拟机 (见:Install the NFS Server on Ubuntu

root@vm-nvme:~# apt install -y nfs-common
root@vm-nvme:~# mkdir -p /mnt/nvme
root@vm-nvme:~# mount -t nfs 192.168.2.111:/mnt/nvme/share /mnt/nvme

fio测试NFS性能

# 宿主机与虚拟机分别执行fio -name=write -rw=write -ioengine=libaio -direct=1 -iodepth=64 -numjobs=1 -size=5G

# 先在宿主机执行 

root@nvme:~# fio -name=write -rw=write -ioengine=libaio -direct=1 -iodepth=64 -numjobs=1 -size=5G -filename=/mnt/nvme/share/local-fio-5g
write: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
......
Jobs: 1 (f=1): [W(1)][100.0%][w=527MiB/s][w=135k IOPS][eta 00m:00s]
write: (groupid=0, jobs=1): err= 0: pid=2458: Sun May 14 07:05:39 2023
  write: IOPS=135k, BW=527MiB/s (553MB/s)(5120MiB/9715msec); 0 zone resets
......
Run status group 0 (all jobs):
  WRITE: bw=527MiB/s (553MB/s), 527MiB/s-527MiB/s (553MB/s-553MB/s), io=5120MiB (5369MB), run=9715-9715msec

Disk stats (read/write):
  nvme0n1: ios=0/1300604, merge=0/420, ticks=0/28956, in_queue=28957, util=98.93%
root@nvme:~#



# 切换到vm中执行
root@vm-nvme:~# fio -name=write -rw=write -ioengine=libaio -direct=1 -iodepth=64 -numjobs=1 -size=5G -filename=/mnt/nvme/nfs-fio-5g
......
Jobs: 1 (f=1): [W(1)][100.0%][w=26.8MiB/s][w=6857 IOPS][eta 00m:00s]
write: (groupid=0, jobs=1): err= 0: pid=2022: Sun May 14 07:10:07 2023
  write: IOPS=6815, BW=26.6MiB/s (27.9MB/s)(5120MiB/192325msec); 0 zone resets
......
Run status group 0 (all jobs):
  WRITE: bw=26.6MiB/s (27.9MB/s), 26.6MiB/s-26.6MiB/s (27.9MB/s-27.9MB/s), io=5120MiB (5369MB), run=192325-192325msec
root@vm-nvme:~#

可以看出,差距相当明显,iops:135k/6815,bw:527MiB/26.8MiB,再测试顺序读,差距没有顺序写那么夸张,但也很大,同时,如果你多一些测试,同时使用top、vmstat、sar等性能观测工具,你就会发现,宿主机的负载会因iowait增高而快速攀升,也就是说,如果存在资源竞争或资源有限的情况下,NFS性能问题会加剧

NFS混合随机读写(读写比例80/20)

为了排除宿主机Page Cache对测试结果的影响,每次执行fio前,先在宿主机上执行echo 3>/proc/sys/vm/drop_caches,如果宿主机不清缓存,数据会漂亮一些(1.8倍左右)

[global]
bs=4096
rw=randrw
rwmixwrite=20
ioengine=libaio
direct=1
group_reporting
iodepth=32
iodepth_batch=8
iodepth_low=8
iodepth_batch_complete=8
userspace_reap
runtime=60
[test]
numjobs=16
filename=/mnt/nvme/nfs-fio-10g
iodepth/_low/_batch/_completenumjobs

iops(read)

iscsi/nfs

bw(read)

iscsi/nfs

iops(write)

iscsi/nfs

bw(write)

iscsi/nfs

64/16/16/161629.4k/10.9k115MiB/42.6MiB7355/272828.7MiB/10.7MiB
32/8/8/81629.8k/11.2k117MiB/43.6MiB7464/279829.2MiB/10.9MiB
32/8/8/8828.9k/10.8k113MiB/42.3MiB7229/271128.2MiB/10.6MiB

相比于NFS,iscsi几乎不会引起主机负载表高,cache也几乎没什么变化,这得益于Linux-IO及Zero-Copy技术,在后续的spdk及IO 虚拟化vhost中会再次见证Zero-Copy带来性能提升

欢迎转载,请说明出处

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值