注意

本文档适用于 Ceph 开发版本。

Ceph信使DPDKStack

编译 DPDKStack

Ceph dpdkstack 默认不编译。因此,您需要重新编译并启用 DPDKstack 组件。dpdk-develdpdk-dev在预编译 DPDK 软包的发行版上,并编译

do_cmake.sh -DWITH_DPDK=ON

设置 DPDK 网络适配器

大多数主流网卡支持 SR-IOV,并且可以被虚拟化为多个 VF 网卡。每个 OSD 通过 DPDK 使用一些专用网卡。mon、mgr 和客户端通过 POSIX 协议栈使用 PF 网卡。

加载 DPDK 依赖的驱动程序:

modprobe vfio
modprobe vfio_pci

通过编辑配置 Hugepage:/etc/sysctl.conf

vm.nr_hugepages = xxx

根据 OSD 的数量配置 VFs 数量:

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 权限来访问系统中的各种资源。为了授予用户 root 访问权限:ceph用户:

usermod -G root ceph

OSD 使用ms_dpdk_devs_allowlist:

  1. 配置单个网卡。

    ms_dpdk_devs_allowlist=-a 0000:7d:010
    

    ms_dpdk_devs_allowlist=--allow=0000:7d:010
    
  2. 配置 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"

如果 throttling 超过阈值,增加 throttling 阈值或禁用 throttling。

检查网络适配器是否故障或异常。运行以下命令获取网络适配器状态和统计信息:

ceph daemon osd.$i show_pmd_stats
ceph daemon osd.$i show_pmd_xstats

一些 DPDK 版本(例如 dpdk-20.11-3.e18.aarch64)或网卡 TSO 异常,尝试禁用 tso:

ms_dpdk_enable_tso=false

如果 VF 网卡支持多个队列,可以为单个核心分配更多网卡队列以提高性能:

ms_dpdk_hw_queues_per_qp=4

状态和未来工作

与 POSIX 协议栈相比,在多并发测试中,DPDKStack 具有相同的 4K 随机写入性能,8K 随机写入性能提高了 28%,1 MB 数据包不稳定。在单延迟测试中,4K 和 8K 随机写入延迟降低了 15%(延迟越低越好)。

从高层次来看,我们的未来工作计划是:

OSD 多网络支持(公共网络和集群网络)

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.