用mellanox DPU实现裸金属服务器

2021-08-10 12:13:22 浏览数 (1)

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

0 人点赞