DPDK¶
介绍¶
Open vSwitch (ovs) 是一个开源软件虚拟交换机,通过 openvswitch.org 开发和发布。数据平面开发工具包 (dpdk) 是一组用户空间库和工具,可促进高性能用户空间网络应用程序的开发。
自 ovs 2.2 版本发布以来,ovs netdev 数据路径已支持与 dpdk 集成,以加速用户空间网络。自 kolla pike 版本发布以来,kolla ansible 中已添加了部署带有 dpdk 的 ovs (ovs-dpdk) 的支持。在 pike 版本中引入的 ovs-dpdk 角色已经在 centos 7 和 ubuntu 16.04 主机上进行了测试,但是,由于 centos 7 默认 systemd 版本创建的 cgroup 配置冲突,建议使用 ubuntu。
先决条件¶
DPDK 是一个高性能用户空间网络库,因此它具有一些正确运行的要求,这些要求在使用不带 dpdk 的 ovs 部署时不需要。
为了有效地工作,dpdk 使用的机制之一是利用内核 hugepages 来加速内存访问。使用 hugepage 内存可以最大限度地减少在将虚拟内存转换为物理内存时发生转换后备缓冲器 (TLB) 未命中的可能性,因为它增加了可以通过 TLB 缓存的总寻址内存量。Hugepage 内存页是通常大小为 2MiB 或 1GiB 的不可交换的连续内存块,可用于促进客户机和 vSwitch 之间或物理网卡和用户空间 ovs 数据路径之间的 DMA 映射之间的有效内存共享。
要在平台上部署 ovs-dpdk,应分配一部分系统内存作为 hugepages。虽然可以在运行时分配 hugepages,但建议通过内核命令行分配它们,以防止内存碎片。可以通过将以下内容添加到 grub 配置并重新生成 grub 文件来实现。
default_hugepagesz=2M hugepagesz=2M hugepages=25000
由于 dpdk 是一个用户空间网络库,因此它需要与用户空间兼容的驱动程序才能控制平台上的物理接口。dpdk 技术上支持 3 个内核驱动程序 igb_uio、uio_pci_generic 和 vfio_pci。虽然从技术上讲可以使用全部 3 个,但仅推荐 uio_pci_generic 和 vfio_pci 与 kolla 一起使用。igb_uio 采用 BSD 许可,并作为 dpdk 库的一部分分发。虽然它比 uio_pci_generic 具有一些优势,但加载 igb_uio 模块会污染内核并可能使发行版支持失效。要成功部署 ovs-dpdk,平台必须存在 vfio_pci 或 uio_pci_generic 内核模块。大多数发行版都将 vfio_pci 或 uio_pci_generic 作为默认内核的一部分包含在内,但在某些发行版上,您可能需要在运行 kolla-ansible deploy 之前安装 kernel-modules-extra 或发行版等效项。
安装¶
要启用 ovs-dpdk,请将以下配置添加到 /etc/kolla/globals.yml 文件
ovs_datapath: "netdev"
enable_ovs_dpdk: yes
enable_openvswitch: yes
tunnel_interface: "dpdk_bridge"
neutron_bridge_name: "dpdk_bridge"
注意
Kolla 不支持基于 RHEL 的发行版的 ovs-dpdk,因为缺少合适的软件包。
与标准的 Open vSwitch 部署不同,由 neutron_external_interface 指定的接口应分配一个 IP 地址。neutron_external_interface 分配的 IP 地址将在部署操作期间移动到“dpdk_bridge”。在使用 ovs-dpdk 时,tunnel_interface 必须是一个带有连接的物理接口的 ovs 桥接,以便通过 dpdk 加速隧道流量。请注意,由于 ansible 变量名称的限制,该限制排除了在变量名称中使用 -,因此无法将默认 br-ex 名称用于 neutron_bridge_name 或 tunnel_interface。
目前,隧道接口 IP 在 ubuntu 上使用 network manager,在 centos 系列操作系统上使用 systemd 进行配置。systemd 用于解决 centos network manager 实现的一个限制,该限制未将 ovs 桥接的创建视为热插拔事件。将来,将引入一个新的配置选项,允许在所有主机发行版上使用 systemd,供那些不想在 ubuntu 上启用 network manager 服务的人使用。
限制¶
从内核 ovs 重新配置到 ovs dpdk 目前不受支持。更改已部署节点上的 ovs 数据路径需要更改所有正在运行的实例的 neutron 配置和 libvirt xml 配置,包括虚拟机硬重启。
升级 ovs-dpdk 时,应注意这始终涉及数据平面中断。与内核 OVS 不同,ovs-dpdk 的数据平面在 ovs-vswitchd 进程中执行。这意味着 dpdk 数据平面的生命周期与 ovsdpdk_vswitchd 容器的生命周期相关联。因此,建议在升级之前从运行 ovs-dpdk 的节点上移出所有虚拟机工作负载。
在 ubuntu 上,隧道网络需要 network manager。此要求将在未来删除。