DPU实现裸金属
DPU就是在cx6的基础上加上了arm cpu,arm可以运行原来计算节点上那些组件。好处就是可以给裸金属动态添加/删除网卡和硬盘,网卡能接入vxlan vpc,硬盘能对接后端ceph,而且能统一虚拟机和裸金属,DPU就是一台计算节点,DPU就是hypervisor,能最大程度复用虚拟机流程,并且比ironic简单很多。
概念
- InfiniBand和Ethernet
两种传输协议,mellanox的卡即可以工作于InfiniBand模式也可以工作于Ethernet模式。
- RDMA
一种传输协议,可以基于InfiniBand,也可以基于Ethernet,也就是RCOE(RDMA over Converged Ethernet)
- NVMe-oF
nvme是一种存储协议,over Fabrics就是nvme不在本地存在,需要在fabric上传输,fabric可以是TCP也可以是RDMA
- PF/VF/SF
https://github.com/Mellanox/scalablefunctions/wiki
https://docs.nvidia.com/doca/sdk/scalable-functions/index.html
- representor
https://docs.nvidia.com/doca/sdk/vswitch-and-representors-model/index.html
PCI模拟和HOTPLUG
从裸金属上看DPU给裸金属模拟了很多pci bridge,然后再模拟出pci device (网卡和硬盘)hotplug到bridge下的bus。
DPU工作于ECPF模式,裸金属上能看到两个ConnectX-6 Dx网卡。
virtio-net网卡DPU上服务virtio-net-controller负责模拟。
virtio-blk和nvme由DPU上服务mlnx-snap负责模拟,snap有manager的概念,mlx5_0能模拟virtio_blk和nvme,mlx5_1/mlx5_2/mlx5_3只能模拟nvme。
如果在DPU卡用rdma dev看一下就会发现,一个rdam device就是一个emulation manager。
用其中一个emulation manager模拟一个pci device
裸金属上立马感知到64:00.0 hotplug
从DPU看PCI结构是这样的。
tmfifo_net0用于和裸金属通信。
oob_net0是带外管理。
p0和p1是两个representor,对应着DPU上看到的两个connectx-6 Dx,用于uplink连接交换机。
pf0hpf和pf0hpf是两个representor,对应着裸金属上看到的两个connectx-6 Dx卡。
p0m0和p1m0是配置文件/etc/mellanox/mlnx-sf.conf生成的两个sub function,支持RDMA,模拟nvme full offload,pf0sf0和pf1sf0是这两个subfunction的representor。
网络
virtio-net
在DPU上可以灵活给裸添加和删除virtio-net类型的网卡。 #添加一个virtio-net网卡,生成一个representor,把representor加到ovs桥上 virtnet hotplug -i mlx5_0 -f 0x0 -m 0C:C4:7A:FF:22:93 -t 1500 -n 3 -s 1024
裸金属上就多了一个virtio-net类型的网卡,裸金属上内核参数要配置pci=realloc,否则virtio-net内核模块识别不了这个网卡,镜像中得配置这个参数。
最后把这个representor加到ovs桥上,打开ovs offload功能,如果硬件流表命中,裸金属的流量就出DPU不经过arm,否则通过representor上送到arm,由arm软件转发,这就是ASAP技术。
pf和vf
DPU上执行如下命令,让裸金属能看到PF,这个PF并具有SRIOV功能,镜像中内置脚本打SRIOV功能打开。
mlxconfig -d /dev/mst/mt41686_pciconf0 s NUM_Of_PF=1
mlxconfig -d /dev/mst/mt41686_pciconf0 s SRIOV_EN=1
mlxconfig -d /dev/mst/mt41686_pciconf0 s NUM_OF_VFS=16
在DPU上通过目录/sys/class/net/p0/smart_nic/下pf和vf0等给pf和vf配置mac和qos限速等。
裸金属上pf和vf在DPU上分别有自己的representor,那就是pf0hpf和pf0vf0,需要把representor加到br-int桥,下vlan和vxlan的转换流表。
另一种选择就是不支持SRIOV,用户只有两个PF,估计也够用。
最佳选择
不用virtio-net,裸金属上能看到两个pf,这两个pf具有sriov功能,用户可以开启vf功能,和connetx-5给虚拟机用vf保持一致。
存储
SNAP是mellanox开发的DPU上的存储解决方案。
SNAP有Non-offload Mode和Full Offload Mode,offload就是硬件加速,存储不经过arm,Non-offload Mode支持virtio-blk和nvme,Full Offload Mode只支持nvme。
SNAP有有两个非常重要的概念controller和backend,类似于物理机器,一个或者少数几个controller,很多槽位可以插入很多硬盘,backend就是硬盘,
controller是处理存储协议的,backend是真正存入数据的,DPU上backend不是硬盘,是SPDK上抽象出来的bdev,在SPDK上创建bdev就相当于物理机理硬盘槽位上插入硬盘,
数据到了SPDK的bdev,再通过SPDK的driver落的本地或者远端真正的硬件上。
Non-offload Mode
nvme
#创建一个nvme device
snap_rpc.py emulation_device_attach mlx5_0 nvme
#创建一个nvme subsystem
snap_rpc.py subsystem_nvme_create nqn.2020-12.mlnx.snap "Mellanox_NVMe_SNAP" "Mellanox NVMe SNAP Controller"
#创建一个nvme controller snap_rpc.py controller_nvme_create nqn.2020-12.mlnx.snap mlx5_0 --pci_bdf 62:00.0 --nr_io_queues 32 --mdts 4
#创建一个spdk bdev
spdk_rpc.py bdev_null_create Snap1 200000 512
#把这个nvme controller和SPDK关联起来,执行这一步之后 裸金属写到硬盘里的数据就能被SPDK收到,并给这个nvme创建一个namespace
snap_rpc.py controller_nvme_namespace_attach -c NvmeEmu0pf1 spdk Snap1 1
#搞完这一切,host上就应该能看到一个nvme盘,并且有一个namespace。
virtio-blk
#spdk创建bdev Snap0
spdk_rpc.py bdev_null_create Snap0 100000 512
#创建一个device
snap_rpc.py emulation_device_attach --bdev_type spdk --bdev Snap0 mlx5_0 virtio_blk
#创建controller,把device加到这个controller上
snap_rpc.py controller_virtio_blk_create -d 61:00.0 --bdev_type spdk --bdev Snap0 mlx5_0
#此时裸金属上就能看到一个virtio-blk类型的硬盘
Full Offload Mode
只支持nvme-over-rdma-over-ethernet。只有控制经过arm,存储数据不经过arm,省CPU,软件只需要创建nvme subsystem和controller,并不需要再attach到bdev,
由硬件自动连接backend,需要把backend写到SNAP的配置文件中,保有后两个sf代表的emulation manager(mlx5_2和mlx5_3)才支持RDMA。
最佳选择
virtio-blk采用的协议不如nvme,而且DPU模拟的问题很多,优先选择nvme,选择offload不转换协议对接ceph,如果ceph不支持nvme转成iSCSI。
Full Offload Mode需要研究SPDK怎么对接ceph,硬件对nvme-over-rdma-over-ethernet怎么offload,ceph能不能搞定nvme协议。
Non-offloads Mode需要研究SPDK能不能把nvme转换成iSCSI对接ceph,ceph支持iSCSI,如何把nvme转换成iSCSI用spdk加librbd对接ceph。
最终要这这两种模型中选一种。
开发和部署工作
DPU DRIVER
开发DPU driver,作为nova-compute的一个driver,具有IPMI管理功能,比如收集硬件信息,修改启动项,开关机,vnc显示,如果后继DPU通过其它硬件手段能干这些事就不再需要IPMI。
DPU driver还能从neutron那儿获取到port信息,给裸金属添加/删除网卡。调用DPU上的virtio-net-controller生成virtio-net,一个virtio-net有一个对应的representor,nova-compute会把这个representor加到DPU上运行的OVS桥上,ovs-agent要能识别出这个representor,下vlan和vxlan的转换流表offload到硬件上,和CX5上一样。
DPU driver还要能从cinder那儿获取到volume信息,给裸金属添加/删除硬盘。调用SNAP生成模拟的virtio-blk或者nvme硬盘,然后配置SPDK,最后通过IPMI修改配置让裸金属从挂载的这个硬盘启动,这个盘是系统盘。
DPU上架和部署
通过OOB pxe给DPU安装操作系统,OOB上配置IP和控制节点通。两个cx6 bond4作变uplink,配合交换机smlag运行,分配一个ip作为vxlan vtep ip。
OOB和bond4可以合并,只用一个,就像bjzdt和bjpdc那样。
用kolla给DPU上部署openstack组件nova-compute/neutron-dhcp-agent/neutron-ovs-agent/neutron-l3-agent。
参考文档
《NVIDIA BlueField SNAP and virtio-blk SNAP Documentation》
https://docs.mellanox.com/display/MLNXOFEDv541030/NVIDIA MLNX_OFED Documentation Rev 5.4-1.0.3.0
https://docs.mellanox.com/display/BlueFieldDPUOSv370/NVIDIA BLUEFIELD DPU OPERATING SYSTEM v3.7 PLATFORM DOCUMENTATION