注意
本文档适用于 Ceph 的开发版本。
Ceph messenger DPDKStack
编译 DPDKStack
Ceph dpdkstack 默认不编译。因此,您需要重新编译并启用 DPDKstack 组件。可选地,在具有预编译 DPDK 包的发行版上安装 dpdk-devel 或 dpdk-dev,然后编译
do_cmake.sh -DWITH_DPDK=ON
设置 DPDK 网卡
大多数主流网卡支持 SR-IOV,可以虚拟化为多个 VF 网卡。每个 OSD 通过 DPDK 使用一些专用的网卡。mon、mgr 和客户端通过 POSIX 协议栈使用 PF 网卡。
加载 DPDK 依赖的驱动
modprobe vfio
modprobe vfio_pci
通过编辑 /etc/sysctl.conf 配置 Hugepage
vm.nr_hugepages = xxx
根据 OSD 数量配置 VF 数量
echo $numvfs > /sys/class/net/$port/device/sriov_numvfs
将网卡绑定到 DPDK 应用程序
dpdk-devbind.py -b vfio-pci 0000:xx:yy.z
配置 OSD DPDKStack
默认情况下,DPDK RTE 初始化过程需要 root 权限才能访问系统中的各种资源。要授予 ceph 用户 root 访问权限
usermod -G root ceph
OSD 使用 ms_dpdk_devs_allowlist 选择网卡
配置单个网卡。
ms_dpdk_devs_allowlist=-a 0000:7d:010
或
ms_dpdk_devs_allowlist=--allow=0000:7d:010
配置 Bond 网卡
ms_dpdk_devs_allowlist=--allow=0000:7d:01.0 --allow=0000:7d:02.6 --vdev=net_bonding0,mode=2,slave=0000:7d:01.0,slave=0000:7d:02.6
DPDK 相关配置项如下
[osd]
ms_type=async+dpdk
ms_async_op_threads=1
ms_dpdk_port_id=0
ms_dpdk_gateway_ipv4_addr=172.19.36.1
ms_dpdk_netmask_ipv4_addr=255.255.255.0
ms_dpdk_hugepages=/dev/hugepages
ms_dpdk_hw_flow_control=false
ms_dpdk_lro=false
ms_dpdk_enable_tso=false
ms_dpdk_hw_queue_weight=1
ms_dpdk_memory_channel=2
ms_dpdk_debug_allow_loopback = true
[osd.x]
ms_dpdk_coremask=0xf0
ms_dpdk_host_ipv4_addr=172.19.36.51
public_addr=172.19.36.51
cluster_addr=172.19.36.51
ms_dpdk_devs_allowlist=--allow=0000:7d:01.1
调试和优化
根据日志定位故障并将日志调整到适当级别
debug_dpdk=xx
debug_ms=xx
如果日志包含大量重传消息,请减小 ms_dpdk_tcp_wmem 的值。
运行 perf dump 命令查看 DPDKStack 统计信息
ceph daemon osd.$i perf dump | grep dpdk
如果 dpdk_device_receive_nombuf_errors 不断增加,检查节流是否超过限制
ceph daemon osd.$i perf dump | grep throttle-osd_client -A 7 | grep "get_or_fail_fail"
ceph daemon osd.$i perf dump | grep throttle-msgr_dispatch_throttler -A 7 | grep "get_or_fail_fail"
如果节流超过阈值,增加节流阈值或禁用节流。
检查网卡是否故障或异常。运行以下命令获取网卡状态和统计信息
ceph daemon osd.$i show_pmd_stats
ceph daemon osd.$i show_pmd_xstats
某些 DPDK 版本(例如 dpdk-20.11-3.e18.aarch64)或 NIC TSO 异常,尝试禁用 tso
ms_dpdk_enable_tso=false
如果 VF 网卡支持多个队列,可以为单个核心分配更多网卡队列以提高性能
ms_dpdk_hw_queues_per_qp=4
状态和未来工作
与 POSIX Stack 相比,在多并发测试中,DPDKStack 具有相同的 4K 随机写入性能,8K 随机写入性能提高了 28%,1 MB 数据包不稳定。在单延迟测试中,4K 和 8K 随机写入延迟降低了 15%(延迟越低越好)。
在较高层面,我们未来的工作计划是
OSD 多网络支持(公共网络和集群网络)可以配置公共和集群网卡。连接或侦听时,可以根据 IP 地址选择公共或集群网卡。在 msgr-work 初始化期间,初始化公共和集群网卡并创建两个 DPDKQueuePairs。