Bootstrap

NVME硬盘如何使用Intel VROC创建RAID&各RAID级别FIO性能测试?

一、Intel VROC(Virtual RAID on CPU)简介

® 英特尔 Virtual RAID on CPU (Intel® VROC) 是一种企业级基于CPU的虚拟化RAID技术解决方案,允许将多个NVMe盘组合成一个虚拟的RAID卷,VROC与传统的硬件RAID不同,NVMe* SSD 直接连接到 CPU,它通过与CPU紧密结合,利用计算机的处理器来实现RAID功能。VROC可以通过Intel VMD技术将多个NVMe盘分组,创建虚拟的Storage Device(VMD)卷,并提供硬件级别的RAID性能和可靠性。使用Intel VROC可以充分发挥NVMe盘的性能优势,同时提供更高的数据保护和容错能力。而传统服务器需要安装RAID(HBA)卡,才能实现这一功能,降低了成本、功耗。它能够满足对底层硬件性能要求较高的行业的需求,并为数据库等关键应用提供可靠而高效的存储解决方案。

在实现NVMe RAID功能时,确实需要使用VROC NVMe Key。这个Key是一个特殊的硬件密钥,可以激活VROC的NVMe RAID功能,使得用户可以使用软件方式对NVMe盘进行RAID管理。通过VROC NVMe Key,用户可以进行RAID配置,包括RAID级别、块大小、读写缓存等。通过利用CPU自身的计算能力和NVMe盘的高速读写能力,VROC可以提供比传统硬件RAID更高的性能和更强的容错能力。

1.1 支持的intel cpu

1.2 许可说明

 Intel®VROC (VMD NVMe* RAID)是通过平台提供商提供的许可机制在平台上启用的。使用的license SKU主要影响可用的RAID级别。以下英特尔®VROC许可sku可用:

 

二、配置介绍

1.1 环境信息

#

机型

配置

数量

备注

1

宁畅R620 G40

CPU:Intel(R) Xeon(R) Silver 4310 CPU @ 2.10GHz *1;

2

内存:HY HMA84GR7DJR4N-XN DDR4 32R 32G内存

4

主板:60WA32_U2_L_INF_UN_HT_RA4 2.0主板

1

nvme硬盘:IT SSDPF2KX038T1 3.84T 2.5-E4x4 R SSD

4

2

 intel VROC Hardware Key-VROCPREMMOD

1

#

软件名称

软件版本

用途

备注

1

OS

Centos8.9

操作系统

2

Bios

0PYH001052

4

BMC

2.35(PYH-C01-097-0000)

5

VROC KEY

7.8.0.1012

更多详细信息参考Intel官网 

英特尔® Virtual RAID on CPU (英特尔® VROC) 支持的配置 (intel.cn)

 1.2 环境搭建

1、将需要的 VROC Key 接入主板的 RAID_KEY 插槽中,VROC key为一个较小的部件4pin部件,该部件需要插入对应的标有VROC_KEY的端口,位于RISER_A和RISER_B之间,如下图

2、接入支持的硬盘设备并确保可正常识别

 二、服务器BIOS设置

1.如图 1-1 位置按 DEL 进入 setup 界面,进入 setup 界面

2.Socket configuration—>IIO Configuration,详见图 1-2

3.按下 ctrl+F11 进入高级模式,如图 1-3。

 4.进入 Intel VMD technology 配置页面

 5.启用对应 CPU 下的硬盘设备,如选择到SOCKET0,port 口与硬盘设备的对应关系可通过机器拓扑得到。如硬盘连接位置为CPU0的A至D,启用 CPU0的 VMD 控制器 IOU4 中对应 port 口,如图 1-5:

 

 6.启用热插拔功能,如图1-6

7.按下 F4 保存并退出,再次按下 DEL 进入 BIOS setup(UEFI 模式下)

三、使用VROC创建RAID

1.选择 Advanced-->Intel(R) Virtual RAID on CPU,如图2-1

 2.进入后即可查看 VROC 版本,如图 2-2

 3.选择进入 All Intel VMD Controllers 后可查看 VMD 下硬盘信息,以及组建 RAID。

4.选择Create RAID Volume 进行创建,这里以raid5为例,如图 

 

特别说明 

选项

功能

Name

对RAID 卷进行命名

RAID Level

选择组建的 RAID 等级,此处可选项与VROC key 的权限有关,本机可组建RAID 0,1,5,10

Enable RAID Spanned over VMD Controllers

允许跨 VMD 控制器组建 RAID,启用后,仅支持数据 RIAD,不支持引导

Select Disks

选择对应的硬盘

Strip Size

条带深度

Capacity

组建后的 RAID 容量

 

 

 

 

 

 

5.此处我们以 4 盘 RAID5 为例。点击YES进行确认 

6. 创建完成后,可在 VROC 内的”RAID Volume INFO”看到组建的 RAID,同时选中组建 RAID 成功的硬盘在 Non-RAID 标签下消失,

 7.系统下查看硬盘,命令lsblk,nvme0n1至nvme3n1 4块nvme盘共同组成raid5卷md126

8.查看md126信息,可看见当前raid组容量,状态为atcive,resyncing(激活,正在进行CC),同步状态为71%,及组成该RAID的盘及各盘状态, 

9.CC完成后,状态会变为clean 

四、VROC RAID降级测试

方式1:手动将一块盘移除

1.将一块盘移除后,查看VROC信息,可以看到降级,一块盘被移除

 2.此时机器服务器红色报警灯会亮起

方式2:系统下将一块盘移除 

1.将一块盘从系统下,查看VROC信息,可以看到降级,

命令如下:

mdadm -f /dev/md126 /dev/nvme2n1

2.再次查看VROC信息,nvme2n1已被remove,

命令如下:

mdadm -D /dev/md126

3.错误示范:因nvme2n1盘在/dev/md126 控制下,所以需要改为mdadm -f /dev/md126 /dev/nvme2n1

 五、VROC RAID重建

1. 将移除的硬盘插回槽位,nvme盘约10s左右即上电,机器箱耳的报警灯接除红色报警,硬盘的locate等不会出现硬raid重建的locate灯闪烁的现象

2.BIOS下查看系统VROC进入重建状态, 

 3.系统下查看VROC状态,可以看到VROC处于降级重建状态

4.系统下查看VROC状态,可以看到VROC处于降级重建状态 

5.重建完成后,VROC会处于clean状态 

 六、删除VROC RAID

1.重启进入BIOS下,选择 Advanced-->Intel(R) Virtual RAID on CPU-->RAID5卷

 3.进入后,选择Delete,点击YES进行删除即可

 4.完成后,可以看到没有任何raid信息

5.完成后,保存,重新进入系统后,会发现进入维护模式,但raid5已清除

 6.此问题是当时做raid5以后进行了挂载

7.解决方法:将/etc/fstab 文件关于raid的信息删除即可,并将/data-nvme目录删除,

 9.Reboot即可

七、FIO测试

7.1 RAID10测试

初始状态

7.1.1 随机写测试

 fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=randwrite.log --output=rand_wirte.log --rw=randwrite --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

 测试结果:

w=3215MiB/s  w=51.4k IOPS

测试结果解读:

单个进程:写带宽798Mib/s.写IOPS:12.8k

总进程:总带宽3185MiB/s,整合该组中所有线程执行的 IO=933Gib

ios:所有线程组的 IO 数56/15284542

merge:IO 调度器执行的合并次数0/0

ticks:保持磁盘忙碌的 ticks 数11/2280227

in_queue:在磁盘队列中总耗时2280238

util:磁盘利用率100%

1MiB=1.048576MB

7.1.2  顺序写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=write.log --output=wirte1.log --rw=write --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

w=3249MIB/s , w=52.0k IOPS

7.1.3 随机读测试 

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=0 --name=radnread.log --output=rand_read.log --rw=randread --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

r=2416MIB/s , r=38.7k IOPS

7.1.4 顺序读测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=0 --name=read.log --output=read1.log --rw=read --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

r=2314MIB/s , r=37.0k IOPS

 7.1.5 顺序读写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=readwrite.log --output=readwrite.log --rw=rw --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

r=1666MIB/s ,w=1668MiB/s r=26.7k IOPS w=26.7 IOPS

7.1.6  随机读写测试 

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=randwr.log --output=randreadwrite.log --rw=randrw --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

r=1955MIB/s ,w=1979MiB/s ,r=31.7k IOPS w=31.7 IOPS

7.1.8 dd测试

time dd if=/dev/md126 of=/guazai/dd.dbf bs=4k count=1000000 oflag=direct

 7.2 RAID5测试(4块nvme)

初始状态

7.2.1  随机写测试 

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=randwrite.log --output=rand_wirte.log --rw=randwrite --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

w=692MiB/s , w=11.4k IOPS

7.2.2  顺序写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=write.log --output=wirte1.log --rw=write --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

w=1168MiB/s , w=18.4k IOPS

7.2.3  随机读测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=0 --name=radnread.log --output=rand_read.log --rw=randread --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

总读:17.7GiB/s  总写IOPS:289k

测试结果:

r=17.7GiB/s , w=289k IOPS

7.2.4 顺序读测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=0 --name=read.log --output=read1.log --rw=read --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

r=17.9GiB/s , r=293k IOPS

7.2.5  顺序读写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=readwrite.log --output=readwrite.log --rw=rw --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

r=1127MiB/s , w=1124MiB/s r=18.0k IOPS w=17.0k IOPS

7.2.6 随机读写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=randwr.log --output=randreadwrite.log --rw=randrw --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

[r=747MiB/s,w=740MiB/s][r=11.0k,w=11.8k IOPS][eta 00m:00s]

 7.2.7  DD测试

time dd if=/dev/zero of=/bcd/dd.dbf bs=4k count=1000000 oflag=direct

7.3   RAID0测试

初始状态

7.3.1  随机写测试 

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=randwrite.log --output=rand_wirte.log --rw=randwrite --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

[w=11.6GiB/s][w=191k IOPS]

7.3.2  顺序写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=write.log --output=wirte1.log --rw=write --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

[w=9614MiB/s][w=154k IOPS]

 7.3.3  随机读测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=0 --name=radnread.log --output=rand_read.log --rw=randread --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

[r=2362MiB/s][r=37.8k IOPS]

7.3.4  顺序读测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=0 --name=read.log --output=read1.log --rw=read --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

[r=1829MiB/s][r=29.3k IOPS]

7.3.5 顺序读写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=readwrite.log --output=readwrite.log --rw=rw --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

[r=1728MiB/s,w=1698MiB/s][r=27.7k,w=27.2k IOPS]

7.3.6 随机读写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=randwr.log --output=randreadwrite.log --rw=randrw --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

[r=1911MiB/s,w=1939MiB/s][r=30.6k,w=31.0k IOPS]

7.3.7  DD测试

time dd if=/dev/md126 of=/guazai/dd.dbf bs=4k count=1000000 oflag=direct

7.4 RAID1测试

初始状态

7.4.1  随机写测试 

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=randwrite.log --output=rand_wirte.log --rw=randwrite --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

[w=3375MiB/s][w=53.0k IOPS]

7.4.2 顺序写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=write.log --output=wirte1.log --rw=write --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

[w=1276MiB/s][w=20.4k IOPS]

7.4.3 随机读测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=0 --name=radnread.log --output=rand_read.log --rw=randread --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

测试结果:

[r=2325MiB/s][r=37.2k IOPS]

7.4.4  顺序读测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=0 --name=read.log --output=read1.log --rw=read --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

[r=4731MiB/s][r=75.7k IOPS]

7.4.5  顺序读写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=readwrite.log --output=readwrite.log --rw=rw --bs=64k --numjobs=4 --iodepth=2 -runtime=300

测试结果:

[r=1442MiB/s,w=1448MiB/s][r=23.1k,w=23.2k IOPS]

7.4.6  随机读写测试

fio --ioengine=libaio --direct=1 --thread=1 --filename=/dev/md126 -allow_mounted_write=1 --name=randwr.log --output=randreadwrite.log --rw=randrw --bs=64k --numjobs=4 --iodepth=2 -runtime=300 

 测试结果:

[r=1335MiB/s,w=1327MiB/s][r=21.4k,w=21.2k IOPS]

7.4.7 DD测试

time dd if=/dev/md126 of=/bcd/dd.dbf bs=4k count=1000000 oflag=direct

 

;