https://cloud.tencent.com/developer/article/1989613
概念
- 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
DPU实现裸金属
DPU就是在cx6的基础上加上了arm cpu,arm可以运行原来计算节点上那些组件,DPU工作于Restricted模式,裸金属上看不任何关系bluefield2的信息,这样祼金属的用户就不知道DPU的存在。好处就是可以给裸金属动态添加/删除网卡和硬盘,网卡能接入vxlan vpc,硬盘能对接后端ceph,而且能统一虚拟机和裸金属,DPU就是一台计算节点,DPU就是hypervisor,能最大程度复用虚拟机流程,并且比ironic简单很多。
DPU上架和部署
通过OOB pxe给DPU安装操作系统,OOB上配置IP和控制节点通。两个cx6 bond4作变uplink,配合交换机smlag运行,分配一个ip作为vxlan vtep ip。用kolla给DPU上部署openstack组件nova-compute/neutron-dhcp-agent/neutron-ovs-agent/neutron-l3-agent。
DPU DRIVER
开发DPU driver,作为nova-compute的一个driver,能从neutron那儿获取到port信息,能从cinder那儿获取到volume信息。同时具有IPMI管理功能,收集硬件信息,修改启动项,开关机。如果后继DPU通过其它硬件手段能干这些事就不再需要IPMI。
PCI模拟和HOTPLUG
从裸金属上看DPU给裸金属模拟了很多pci bridge,然后再模拟出pci device (网卡和硬盘)hotplug到bridge下的bus。
DPU工作于ECPF模式,裸金属上能看到两个ConnectX-6 Dx网卡,同时有一个PCI设备都让裸金属配置DPU卡,用户真正用时需要去掉。
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。
用其中一个emulation manager模拟一个pci device,pci编号是64:00.0
裸金属上立马感知到64:00.0 hotplug
从DPU看PCI结构是这样的。
tmfifo_net0用于和裸金属通信,oob_net0是带多管理,p0和p1对应两个connectx-6 Dx,pf0hpf和pf0hpf应该就是mlx5_0和mlx5_1 emulation manager,pf0sf0和pf1sf0是两个subfunction,p0m0和p1m0是配置文件/etc/mellanox/mlnx-sf.conf生成的两个sub function,也就是mlx5_2和mlx5_3 emulation manager,支持RDMA,模拟nvme full offload。
网络
DPU上运行nova-compute,加载DPU driver,生成virtio-net,一个virtio-net有一个对应的representor,nova-compute会把这个representor加到DPU上运行的OVS桥上。ovs-agent要能识别出这个representor,下vlan和vxlan的转换流表offload到硬件上,和CX5上一样,这点要复用。
#添加一个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技术。
存储
DPU driver调用SNAP生成模拟的virtio-blk或者nvme硬盘,然后配置SPDK,最后通过IPMI修改配置让裸金属从挂载的这个硬盘启动,这个盘是系统盘。
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转换成spdk加librbd对接ceph。
问题
- 裸金属的security group/QOS/neutron-l3-agent问题。
security group估计能offload
QOS实现
https://docs.mellanox.com/display/BlueFieldDPUOSv370/QoS Configuration
neutron-l3-agent实现了路由和nat,nat可以offload,路由不行,需要把路由转换成ovs openflow,类似于ovn那样。
- DPU上用了bond4和smlag就不能再offload
要用ovs bond,不能用内核bond,没有双发arp也就不能配合交换机进行smlag。
- IPMI只重启祼金属不重启DPU,DPU需要单独供电,最好DPU能提供硬件机制开机和关机裸金属。
需要定制
- DPU导致裸金属执行reboot挂住
- virtnet hotplug failed
- virtio-blk hotplug failed
ERR::virtio_blk_controller.c:657:: Cannot attach bdev while host driver is up
参考文档
《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