一、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