目录
文章目录
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
- 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
。