用mellanox DPU实现裸金属服务器

2022-04-28 17:51:35 浏览数 (1)

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

0 人点赞