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