DPDK — DPDK APP 的指令行参数

目录

Lcore-related options(逻辑线程相关参数)

  • -c <coremask>:选项参数可以使用指定的 lcore 来运行 DPDK 应用程序,是一个十六进制的掩码,掩码的每个位对应于 Linux 提供的 lcore ID。例如:-c 3,3 的十六进制为 0x03、二进制为 11,假设有 8 个 Core,那么二进制 00000011,从右到左依次代表核 0-7,使用 0、1 号核。

  • --lcores <lcores[@cpus]>[<,lcores[@cpus]>...]:EAL Thread 的 CPU 亲和性。

--lcores='(0,4,5)@2,1@3,2@4,3@5'

# lcores 0,4,5 绑定在 CPU2
# lcore 1 绑定在 CPU3
# lcore 2 绑定在 CPU4
# lcore 3 绑定在 CPU5
  • -l <core list>
  • --master-lcore <core ID>:Master Core 的 CPU 亲和性。
  • -s <service core mask>:Slave Core 的 CPU 亲和性。

在指定 lcpu mask 参数之前,需要了解平台的 CPU 布局,可以通过 hwloc 来查看:

yum install hwloc -y

在这里插入图片描述
如果没有图形化界面则使用指令:

$ lstopo-no-graphics
Machine (9835MB)
  Package L#0 + L3 L#0 (16MB) + L2 L#0 (4096KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 + PU L#0 (P#0)
  Package L#1 + L3 L#1 (16MB) + L2 L#1 (4096KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 + PU L#1 (P#1)
  Package L#2 + L3 L#2 (16MB) + L2 L#2 (4096KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2 + PU L#2 (P#2)
  Package L#3 + L3 L#3 (16MB) + L2 L#3 (4096KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3 + PU L#3 (P#3)
  Package L#4 + L3 L#4 (16MB) + L2 L#4 (4096KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4 + PU L#4 (P#4)
  Package L#5 + L3 L#5 (16MB) + L2 L#5 (4096KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5 + PU L#5 (P#5)
  Misc(MemoryModule)
  HostBridge L#0
    PCI 8086:7010
    PCI 1013:00b8
    PCI 1af4:1000
    PCI 1af4:1001
    3 x { PCI 15b3:1018 }

也可以使用 DPDK 自带的 CPU layout 工具:

$ cd ${RTE_SDK}/usertools/

$ ./cpu_layout.py
======================================================================
Core and Socket Information (as reported by '/sys/devices/system/cpu')
======================================================================

cores =  [0]
sockets =  [0, 1, 2, 3, 4, 5]

       Socket 0    Socket 1    Socket 2    Socket 3    Socket 4    Socket 5
       --------    --------    --------    --------    --------    --------
Core 0 [0]         [1]         [2]         [3]         [4]         [5]

Device-related options(设备相关参数)

  • -b, --pci-blacklist <[domain:]bus:devid.func>:PCI 设备黑名单,避免 EAL 使用指定的 PCI 设备。可以使用多次。
  • -w, --pci-whitelist <[domain:]bus:devid.func>:PCI 设备白名单,可以使用多次。
  • --use-device [domain:]bus:devid.func:仅使用指定的以太网设备。使用逗号分隔,不能与 -b 选项一起使用。

注:黑白名单是互斥的。

  • --vdev <driver><id>[,key=val, ...]:添加一个虚拟设备,e.g. --vdev 'net_pcap0,rx_pcap=input.pcap,tx_pcap=output.pcap'
  • –vfio-intr <legacy|msi|msix>:为绑定到 VFIO 内核驱动的设备指定中断模式(如果不支持 VFIO,则配置无效)。
  • –create-uio-dev:为设备创建 /dev/uioX 文件并绑定指定的 igb_uio 内核驱动。
  • -d <path to shared object or directory>:加载额外驱动,参数可以是一个驱动文件或是包含了多个驱动文件的文件夹。可以使用多次。
  • –no-hpet:禁止使用 HPET 定时器。
  • –no-pci:禁止 PCI 总线。
  • –vmware-tsc-map:使用 VMware TSC 映射而不是本地 RDTSC。

Multiprocessing-related options(多进程相关参数)

  • --file-prefix <prefix name>:用于 hugepage 文件名的前缀文本,为一个 DPDK App 设置一个不同的共享文件前缀。使用多个不同的前缀文件允许运行多个独立的 DPDK 进程组。DPDK 支持多进程协同完成工作,多进程使用相同的共享文件组成进程组(进程组里的进程分为 primary 和 secondary)。e.g.
# --file-prefix=vhost-1
/dev/hugepages/vhost-1map_12
/dev/hugepages/vhost-1map_11
/dev/hugepages/vhost-1map_10
  • --proc-type <primary|secondary|auto>:设置当前的进程类型。
  • --base-virtaddr <address>:指定基本虚拟地址。DPDK 的 primary 进程尝试使用一个不同的内存映射开始地址。对于因为地址映射冲突而不能启动的 secondary 进程非常有用。

Memory-related options(存储相关参数)

  • --socket-mem <amounts of memory per socket>:从特定的处理器 Socket 上的 hugepage 分配内存,参数用逗号分隔列表值。建议使用。
# 在 Socket 0 上预分配1024M,在 Socket 1 上分配 2048M。
--socket-mem 1024,2048
  • --socket-limit <amounts of memory per socket>:设置每个 Socket 的内存上限(仅仅是非传统存储模式),0 代表关闭限制。

  • --huge-dir <path to hugetlbfs directory>:使用指定的 hugetlbfs 目录,而不是自动检测的。hugetlbfs 是大页使用目录。e.g. --huge-dir /dev/hugepages

  • -n <number of channels>:设置每个 Socket 的内存通道数。

  • -r <number of ranks>:设置内存 Ranks 数,默认为自动检测。

  • -m <megabytes>:从 hugepage 分配内存,不考虑处理器 Socket。不建议使用。

  • –single-file-segments:在 hugetlbfs 中创建少量的文件(仅仅是非传统存储模式)。

  • –huge-unlink:创建大页文件后 Unlink (暗指不支持多进程)。

  • –match-allocations:释放 hugepages 回到系统完全像他们最初分配前一样。

  • –in-memory:不要创建任何共享数据结构,完全运行在存储中。暗指 --no-shconf 和 --huge-unlink。

  • –iova-mode <pa|va>:强制设置 IOVA 模式为指定值。

  • –no-shconf:不创建共享文件。暗指不支持多进程。

  • –no-huge:使用匿名存储而不是大页。暗指不支持多进程。

  • –legacy-mem:使用传统 DPDK 存储分配模式。

Debugging options

  • --log-level <type:val>:为一个特定的组件指定日志级别,e.g. --log-level eal:8,可以使用多次。
  • --syslog <syslog facility>:设置日志设备,有效的日志设备如下:
    • auth
    • cron
    • daemon
    • ftp
    • kern
    • lpr
    • mail
    • news
    • syslog
    • user
    • uucp
    • local0
    • local1
    • local2
    • local3
    • local4
    • local5
    • local6
    • local7

指定 DPDK App 使用的大页内存

建议使用 --socket-mem 选项指定 DPDK App 使用的大页内存与预留的 hugepage 内存一致。例如:–socket-mem=0,512 指定在 Socket0(一般就是 NUMA0)上预留 512MB 内存(从 Socket1 上预留的大页内存中分配)。

如果没有指定,则由 DPDK App 在启动时自动完成确定。如果指定的内存大小超出了预留值,则 DPDK App 启动失败。如果指定的内存大小小于预留值,也可能会导致 DPDK App 启动失败,尤其是在使用 -m(不建议使用)选项的时候,这里需要注意。

隔离 DPDK App 使用 lcore

虽然 DPDK App 已经是绑定核心的,但 Linux 调度程序仍然会使用这些 lcore 来运行其他的任务,所以为了防止在这些核上运行额外的工作负载,可以使用 isolcpus Linux 内核参数来将其与通用的 Linux 调度程序隔离开来。

isolcpus=2,4,6

使用基于 Intel VT-d 的 Linux IOMMU Pass-Through 来运行 DPDK App

要在 Linux 内核中启用 Intel VT-d 硬件辅助的 IO 技术,必须配置一系列内核选项,包括:

  • IOMMU_SUPPORT
  • IOMMU_API
  • INTEL_IOMMU

要使用 Intel VT-d 来运行 DPDK App,在使用 igb_uio 驱动时,Grub 参数必须携带 iommu=pt 参数。 这使得主机可以直接通过 DMA 重映射查找网卡的存储空间。另外,如果内核中没有设置 INTEL_IOMMU_DEFAULT_ON 参数,那么还必须要使用到 intel_iommu=on 参数。这可以确保 Intel IOMMU 被正确初始化。而在使用 vfio-pci 驱动程序时,则直接同时使用 iommu=pt intel_iommu=on

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章