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

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