DPDK快速上手指南(18.02)

DPDK快速上手(linux)



   本文檔主要來自linux_gsg-18.02.pdf的翻譯,翻譯肯定有不妥之處,請批評指正,我會隨後修改,不勝感激。

1. 介紹

   本文檔包含有關DPDK(Data Plane Development Kit的縮寫)軟件的安裝和配置的說明,目的就是讓用戶快速用起來。本文檔描述怎樣在linux應用環境下編譯和運行一個DPDK應用程序,而不過多深入細節。

1.1文檔路線圖

   以下是針對所有DPDK文檔建議的閱讀順序:
  • 發佈說明(Release Notes):
    提供具體的發佈信息,包括支持特性、限制、問題改進、問題報告等等。也提供以FAQ形式的常見問題的回答。

  • 快速上手指南(Getting Started Guide),即本文檔:
    描述在不同的操作系統上如何安裝和配置DPDK軟件;幫助用戶快速用起來。

  • 編程者指南(programmer's guide):
    描述:

    • 軟件架構和怎麼用它(通過例子),特別是在linux應用環境下。
    • DPDK的內容,系統構建(包括用在DPDK根目錄 Makefile中的命令,用來構建開發工具包和應用程序)以及移植應用程序的準則。
    • 軟件中使用的優化以及新開發應考慮的優化。

    還提供術語表。

  • API參考(API Reference):
    提供有關DPDK函數、數據結構和其它編程結構的詳細信息。

  • 示例應用程序用戶指南(sample applications user guides):
    介紹一組示例應用程序。 每章描述了一個示例應用程序,該應用程序展示了特定的功能並提供了關於如何編譯、運行和使用示例應用程序的說明。


2. 系統要求

 本章介紹編譯DPDK所需的軟件包。

注意:
如果DPDK用在Intel®通信芯片組89xx系列的平臺,請參閱“Intel®通信芯片組89xx系列軟件Linux版上手指南”。

2.1 x86上BIOS設置的先決條件

   對於大多數平臺,不需要特殊的BIOS設置即可使用基本的DPDK功能。 但是,對於額外的HPET定時器(譯者注:High Precision Event Timer高精度定時器)和電源管理功能以及小包的高性能,可能需要更改BIOS設置。 有關所需更改的更多信息,請參閱“啓用附加功能”部分。

注意:
如果啓用UEFI(譯者注:Unified Extensible Firmware Interface 統一的可擴展固件接口)安全引導,則Linux內核可能會禁止在系統上使用UIO。 因此,由DPDK使用的設備應綁定到vfio-pci內核模塊,而不是igb_uio或uio_pci_generic。 有關更多詳細信息,請參閱“從內核模塊綁定和解除綁定網絡端口”部分。

2.2 編譯DPDK所需

所需的工具和庫:


注意:
各種系統所需的安裝命令和安裝軟件包可能會有所不同。 有關Linux發行版和測試版本的詳細信息,請參閱DPDK發佈說明(Release Notes)。

  • GNU
    make
  • coreutils
    cmp、sed、grep、arch,等等。
  • gcc
    推薦所有平臺使用4.9或更高版本。 在某些發行版中,默認情況下會啓用某些特定的編譯器標誌和鏈接器標誌,並影響性能(例如,-fstack-protector)。 請參閱您的發行版文檔以及gcc -dumpspecs。
  • libc頭文件
    通常打包爲gcc-multilib(glibc-devel.i686/libc6-dev-i386; glibc-devel.x86_64/libc6-dev用於Intel架構上的64位編譯;glibc-devel.ppc64用於IBM Power架構上的64位編譯)
  • 構建內核模塊所需的Linux內核頭文件或源代碼(kernel-devel.x86_64; kernel-devel.ppc64)
  • 在64位系統上進行32位編譯所需的其它軟件包:
    • 針對Intel i686/x86_64的glibc.i686、libgcc.i686、libstdc++.i686和glibc-devel.i686;
    • 針對IBM ppc_64的glibc.ppc64、libgcc.ppc64、libstdc++.ppc64和glibc-devel.ppc64;

注意:
x86_x32 ABI目前僅支持在高於13.10的Ubuntu或最近的Debian發行版的發行包。 唯一支持的編譯器是gcc 4.9+。

  • libnuma-devel
    用於處理NUMA(非一致內存訪問)的庫。
  • Python 2.7+或3.2+版本
    可以使用DPDK包中包含的各種幫助程序腳本。

可選的工具:

  • Intel®C++編譯器(icc)。
    對於其安裝,可能需要額外的庫。 請參閱icc編譯器安裝文檔目錄中的安裝指南。
  • IBM®高級工具鏈,針對Powerlinux。
    這是一套開源開發工具和實時運行庫,它允許用戶在Linux上獲得IBM最新POWER硬件功能的領先優勢。 要安裝它,請參閱IBM官方安裝文檔。
  • libpcap頭文件和庫(libpcap-devel)
    用於編譯並使用基於libpcap的輪詢模式驅動程序。 該驅動程序默認是禁用的,可以通過在編譯時配置文件中設置 CONFIG_RTE_LIBRTE_PMD_PCAP=y 來啓用。
  • libarchive頭文件和庫
    是使用tar獲取資源的一些單元測試所必需的。

2.3 運行DPDK應用程序所需

 要運行DPDK應用程序,目標機器上可能需要做一些定製化。

2.3.1 系統軟件

所需:

  • 內核版本>= 3.2
    所需的內核版本基於當開發DPDK版本時在kernel.org上提供的最老的長期穩定內核。正在使用的內核版本可以使用以下命令進行檢查:uname -r
  • glibc> = 2.7(用於與cpuset相關的特性)
    該版本可以使用ldd --version命令進行檢查。
  • 內核配置
    在Fedora OS和其它常見發行版(如Ubuntu或Red Hat Enterprise Linux)中,供應商提供的內核配置可用於運行大多數DPDK應用程序。
    對於其它內核版本,應該爲DPDK啓用的選項包括:
    • hugetlbfs
    • PROC_PAGE_MONITOR支持
    • 如果需要HPET支持,則還應啓用HPET和HPET_MMAP配置選項。有關更多詳細信息,請參閱“高精度事件定時器(HPET)功能”部分。

2.3.2 在Linux環境中使用巨頁(Hugepages)

    用於數據包緩衝區的大內存池分配需要Hugepage支持(必須在正在運行的內核中啓用HUGETLBFS選項,如前一部分所示)。 通過使用Hugepage分配,需要更少的頁面而使性能得以提高,因此減少了TLB(即轉換檢測緩衝區,高速轉換緩存),這減少了將虛擬頁面地址轉換爲物理頁面地址所需的時間。 沒有Hugepage,TLB發生高缺失率伴隨着標準4k頁面大小,從而導致性能下降。
2.3.2.1 爲DPDK的使用預留Hugepages
   應該在引導時或在系統引導後儘快完成Hugepages的分配,以防止內存在物理內存中被碎片化。 要在引導時預留Hugepages,一個參數將在內核命令行上傳遞給Linux內核。
   對於2 MB頁面,只需將hugepages選項傳遞給內核即可。 例如,要預留2 MB的1024頁,使用:
hugepages=1024
   其它hugepage尺寸,例如1G頁面大小必須明確指定,也可以可選擇的設置爲系統的默認hugepage大小。例如,在四個1G頁面的形式預留4G的hugepage內存,下面的選項應該傳遞給內核:
default_hugepagesz=1G hugepagesz=1G hugepages=4

注意:
CPU支持的hugepage大小可以通過Intel架構上的CPU標誌確定。 如果存在pse,則支持2M的hugepages; 如果存在pdpe1gb,則支持1G的hugepages。 在IBM Power架構上,支持的hugepage大小爲16MB和16GB。

注意:
對於64位應用程序,如果平臺支持它,則建議使用1GB的hugepages。

 對於雙socket NUMA系統,在引導時預留的hugepages的數目通常在兩個socket之間平均分配(假設兩個socket上都有足夠的內存)。
 有關這些和其它內核選項的更多詳細信息,請參閱Linux源代碼樹中的Documentation/kernel-parameters.txt文件。

#####替代方案:
對於2MB頁面,系統啓動後還可以選擇分配hugepages。 這是通過echo /sys/devices/目錄中的nr_hugepages文件所需的hugepages數目來完成的。 對於單節點系統,使用的命令如下(假定需要1024頁):

echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
 在NUMA機器上,應該在單獨的節點上明確分配頁面:
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

注意:
對於1G頁面,系統啓動後無法預留hugepage內存。
在IBM POWER系統上,應將nr_overcommit_hugepages設置爲與nr_hugepages相同的值。 例如,如果所需的頁數是128,則使用以下命令:

echo 128 > /sys/kernel/mm/hugepages/hugepages-16384kB/nr_hugepages
echo 128 > /sys/kernel/mm/hugepages/hugepages-16384kB/nr_overcommit_hugepages

2.3.3 在DPDK中使用Hugepages

    一旦預留了hugepage內存,爲了使內存可用於DPDK,請執行以下步驟:
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
   通過將以下行添加到/etc/fstab文件,可以在重新啓動後使掛載點永久保存:
nodev /mnt/huge hugetlbfs defaults 0 0
   對於1GB頁面,頁面大小必須指定爲掛載(mount)選項:    
nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0


3. 從源碼編譯DPDK目標(target)


注意:
此過程的一部分也可以使用本文檔的“快速上手安裝腳本”部分中介紹的安裝腳本來完成。

3.1 安裝DPDK和瀏覽源碼

 首先,解壓縮並切入解壓縮後的DPDK源碼目錄:
tar xJf dpdk-<version>.tar.xz
cd dpdk-<version>

DPDK由幾個目錄組成:

  • lib:DPDK庫的源代碼
  • drivers:DPDK輪詢模式驅動程序的源代碼
  • app:DPDK應用程序的源代碼(自動測試)
  • examples:DPDK應用程序示例的源代碼
  • config,buildtools,mk:與框架相關的makefile,腳本和配置

3.2 安裝DPDK目標環境

 DPDK目標的格式: ARCH-MACHINE-EXECENV-TOOLCHAIN

這裏:

  • ARCH可以是:i686、x86_64、ppc_64、arm64
  • MACHINE可以是:native、power8、armv8a
  • EXECENV可以是:linuxapp、bsdapp
  • TOOLCHAIN可以是: gcc、icc
    要安裝的目標取決於安裝在主機上的32位和/或64位軟件包和編譯器。 可用的目標可以在DPDK/config目錄中找到。 不應該使用defconfig_前綴。

注意:
配置文件隨RTE_MACHINE優化級別集(optimization level set)一起提供。 在配置文件中,RTE_MACHINE配置值被設置爲native,這意味着已編譯的軟件已針對其所構建的平臺進行了調整。 有關此設置的更多信息及其可能值,請參閱“DPDK程序員指南(Programmers Guide)”。

   使用Intel®C++編譯器(icc)時,應分別調用以下命令之一,以分別使用64位或32位。 請注意,shell腳本更新$PATH變量,因此不應在同一個會話中執行。 另外,請覈實編譯器的安裝目錄,因爲路徑可能會不同:
source /opt/intel/bin/iccvars.sh intel64
source /opt/intel/bin/iccvars.sh ia32
   要安裝和製作目標,請在頂級DPDK目錄中使用 make install T=<target> 命令。
    例如,要使用icc編譯64位目標,請運行:
make install T=x86_64-native-linuxapp-icc

     要使用gcc編譯32位版本,make命令應該是:
make install T=i686-native-linuxapp-gcc
 如果要在目標構建之前預處理它,請使用 make config T=<target> 命令, 例如在編譯之前需要進行配置更改:
make config T=x86_64-native-linuxapp-gcc

警告:
任何要使用的內核模塊,例如 igb_uio,kni,必須使用與目標上運行的相同的內核下進行編譯。 如果DPDK未在目標機器上構建,則應使用RTE_KERNELDIR環境變量將編譯指向要在目標機器上使用的內核版本的拷貝。

    一旦目標環境被創建,用戶可以切到目標環境目錄並繼續進行代碼更改和重新編譯。 用戶也可以通過編輯構建(build)目錄中的.config文件來修改編譯時DPDK配置。 (這是來自頂層config目錄的defconfig文件的一個用來構建本地的拷貝)。
cd x86_64-native-linuxapp-gcc
vi .config
make
   另外,make clean命令可以用於刪除任何已存在的編譯文件,以便後續的全面乾淨重新構建代碼。

3.3 瀏覽已安裝的DPDK環境目標

   創建目標後,它將包含所有庫,包括用於構建客戶應用程序所需的DPDK環境的輪詢模式驅動程序和頭文件。 另外,test和testpmd應用程序是在 build/app 目錄下構建的,可用於測試。 kmod目錄也存在,其中包含可能需要加載的內核模塊。


4. Linux驅動程序

   爲了正常工作,不同的PMD(譯者注:物理介質關聯層接口)可能需要不同的內核驅動程序。 取決於正在使用的PMD,相應的內核驅動程序應該加載並綁定到網絡端口。

4.1 UIO

   一個用於設置設備的小的內核模塊,將設備內存映射到用戶空間並註冊中斷。 在許多情況下,Linux內核中包含的標準uio_pci_generic模塊可以提供uio功能。 該模塊可以使用以下命令加載:
sudo modprobe uio_pci_generic

注意:
uio_pci_generic模塊不支持虛擬功能(virtual functions)的創建。

  作爲uio_pci_generic的替代方案,DPDK還包含igb_uio模塊,該模塊可以在上面提到的kmod子目錄中找到。 它可以如下所示加載:
sudo modprobe uio
sudo insmod kmod/igb_uio.ko

注意:
對於一些不支持傳統中斷的設備,例如 虛擬功能(VF)設備,可能需要使用igb_uio模塊來代替uio_pci_generic。

注意:
如果啓用UEFI安全引導,則Linux內核可能會禁止在系統上使用UIO。 因此,由DPDK使用的設備應綁定到vfio-pci內核模塊,而不是igb_uio或uio_pci_generic。 有關更多詳細信息,請參閱下面的“與內核模塊綁定和解除綁定網絡端口”。

  DPDK 1.7以上版本提供了VFIO支持,因此對於支持使用VFIO的平臺,使用UIO是可選的。

4.2 VFIO

  依靠IOMMU保護,與UIO相比,它是更強大、更安全的驅動程序。 要使用VFIO,必須加載vfio-pci模塊:
sudo modprobe vfio-pci
  請注意,爲了使用VFIO,您的內核必須支持它。 VFIO內核模塊自Linux內核3.6.0版以來已包含在內核中,通常是默認存在的,但請查閱您的發行版文檔以確保是這樣的。
  此外,要使用VFIO,內核和BIOS必須支持並配置爲使用IO虛擬化(如Intel®VT-d)。

注意:
vfio-pci模塊不支持虛擬功能(virtual functions)的創建。

  爲了在作爲非特權用戶運行DPDK應用程序時正確操作VFIO,還應該設置正確的權限。 這個可以通過使用DPDK設置腳本(調用位於usertools目錄下的腳本dpdk-setup.sh)來完成。

注意:
VFIO可以在沒有IOMMU的情況下使用。 雖然這與使用UIO一樣不安全,但它確實使用戶能夠在IOMMU不可用的情況下保持VFIO具有的設備訪問和編程的程度。

4.3 分叉驅動程序(Bifurcated Driver )

  使用分叉驅動程序的PMD與設備內核驅動程序共存。 在這種模式下,NIC由內核控制,而數據路徑則由PMD直接在設備上執行。

這種模式具有以下優點:

  • 內存管理和隔離是由內核完成的,因此它是安全和強大的。
  • 它使用戶能夠在相同的網絡端口上運行DPDK應用程序時使用傳統的Linux工具,例如ethtool或ifconfig。
  • 它使DPDK應用程序只能過濾部分流量,而其餘部分將由內核驅動程序定向和處理。

    關於分叉驅動程序的更多信息可以在“Mellanox Bifurcated DPDK PMD”中找到。

4.4 與內核模塊綁定和解除綁定網絡端口


注意:
使用分叉驅動程序的PMD不應從其內核驅動程序中解除綁定。 本部分適用於使用UIO或VFIO驅動程序的PMD。

   從版本1.4開始,DPDK應用程序不再自動解除所有支持的網絡端口與正在使用的內核驅動程序的綁定。 相反,如果正在使用的PMD使用UIO或VFIO驅動程序,那麼DPDK應用程序要使用的所有端口都必須在應用程序運行之前綁定到uio_pci_generic、igb_uio或vfio-pci模塊。 對於此類PMD,Linux* 控制下的任何網絡端口都將被忽略,並且不能被應用程序使用。
   要將端口綁定到uio_pci_generic、igb_uio或vfio-pci模塊以使用DPDK,然後將端口返回到Linux* 控制,則在usertools子目錄中提供了名爲dpdk-devbind.py的應用程序腳本。 此應用可用於提供系統上網絡端口當前狀態的視圖,以及從不同內核模塊(包括uio和vfio模塊)綁定和取消綁定這些端口。 以下是腳本如何使用的一些示例。 腳本及其參數的完整描述可以通過使用--help或--usage選項調用腳本來獲得。 請注意,在運行dpdk-devbind.py腳本之前,應將要使用的uio或vfio內核模塊加載到內核中。

警告:

    由於VFIO的工作方式,VFIO可以使用哪些設備有一定的限制。 主要歸結爲IOMMU組的工作方式。 任何虛擬功能設備都可以與VFIO一起使用,但物理設備也將需要綁定到VFIO的所有端口,或者其中一些虛擬功能設備綁定到VFIO,而其他虛擬功能設備則不需要任何綁定。
    如果您的設備位於PCI-to-PCI橋之後,則該橋將成爲您的設備所在的IOMMU組的一部分。因此,橋驅動程序也應該從橋PCI設備解除綁定,以便VFIO與在橋後面的設備一起工作。

警告:

    雖然任何用戶都可以運行dpdk-devbind.py腳本來查看網絡端口的狀態,但綁定或解除綁定網絡端口需要root權限。

    要查看系統中所有網絡端口的狀態,請執行以下操作:
./usertools/dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
0000:82:00.0 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe
0000:82:00.1 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe

Network devices using kernel driver
===================================
0000:04:00.0 'I350 1-GbE NIC' if=em0  drv=igb unused=uio_pci_generic *Active*
0000:04:00.1 'I350 1-GbE NIC' if=eth1 drv=igb unused=uio_pci_generic
0000:04:00.2 'I350 1-GbE NIC' if=eth2 drv=igb unused=uio_pci_generic
0000:04:00.3 'I350 1-GbE NIC' if=eth3 drv=igb unused=uio_pci_generic

Other network devices
=====================
<none>
  要將設備eth1,“04:00.1”綁定到uio_pci_generic驅動程序:
./usertools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1
或者可選地,
./usertools/dpdk-devbind.py --bind=uio_pci_generic eth1
  要將設備82:00.0恢復到其原來的內核綁定:
./usertools/dpdk-devbind.py --bind=ixgbe 82:00.0


5. 編譯和運行示例應用程序

     本章介紹如何在DPDK環境中編譯和運行應用程序。 它還提供了一個指向示例應用程序存儲位置的指針。

注意:
此過程的一部分也可以使用本文檔中“快速上手安裝腳本”部分所述的安裝腳本來完成。

5.1 編譯一個示例應用程序

     一旦創建了DPDK目標環境目錄(例如x86_64-native-linuxapp-gcc),它將包含構建應用程序所需的所有庫和頭文件。

     在DPDK上編譯Linux* 環境中的應用程序時,必須導出(原文:export)以下變量:
  • RTE_SDK - 指向DPDK安裝目錄。
  • RTE_TARGET - 指向DPDK目標環境目錄。

     以下是創建在DPDK Linux環境中運行的helloworld應用程序的示例。 這個例子可以在${RTE_SDK}/examples目錄中找到。
     該目錄包含main.c文件。 該文件與DPDK目標環境中的庫結合使用時,會調用各種函數來初始化DPDK環境,然後爲要使用的每個核(原文:core)啓動入口點(調度應用程序)。 默認情況下,該二進制文件在構建目錄中生成。
cd examples/helloworld/
export RTE_SDK=$HOME/DPDK
export RTE_TARGET=x86_64-native-linuxapp-gcc

make
    CC main.o
    LD helloworld
    INSTALL-APP helloworld
    INSTALL-MAP helloworld.map

ls build/app
    helloworld helloworld.map

注意:
在上面的例子中,helloworld位於DPDK的目錄結構中。 但是,它可能位於目錄結構之外,以保持DPDK結構不變。 在以下情況下,helloworld應用程序將作爲新的起點複製到新目錄。

export RTE_SDK=/home/user/DPDK
cp -r $(RTE_SDK)/examples/helloworld my_rte_app
cd my_rte_app/
export RTE_TARGET=x86_64-native-linuxapp-gcc

make
  CC main.o
  LD helloworld
  INSTALL-APP helloworld
  INSTALL-MAP helloworld.map  

5.2 運行一個示例應用程序


警告:

    在運行應用程序之前,請確保:
  • Hugepages設置完成。
  • 用到的任何內核驅動程序已加載。
  • 在需要的情況下,應用程序使用的端口應該綁定到相應的內核驅動程序。

    請參閱“Linux驅動程序”部分了解詳情。

    該應用程序與DPDK目標環境的環境抽象層(EAL)庫鏈接,該庫提供了一些通用於每個DPDK應用程序的選項。
    
    以下是可以提供給EAL的選項列表:

./rte-app [-c COREMASK | -l CORELIST] [-n NUM] [-b <domain:bus:devid.func>] \
[--socket-mem=MB,...] [-d LIB.so|DIR] [-m MB] [-r NUM] [-v] [--file-prefix] \
[--proc-type <primary|secondary|auto>]


EAL選項如下:

- -c COREMASK或-l CORELIST:要運行的核的十六進制位掩碼(譯者注:COREMASK)。請注意,覈編號可能會在平臺之間發生變化,應事先確定。核列表(譯者注:CORELIST)是一組核數字而不是位圖核掩碼。
- -n NUM:每個處理器socket的內存通道數量。
- -b <domain:bus:devid.func>:端口的黑名單;阻止EAL使用指定的PCI設備(允許使用多個-b選項)。
- --use-device:僅使用指定的以太網設備。使用逗號分隔[domain:] bus:devid.func值。不能與-b選項一起使用。
- --socket-mem:內存從socket上的hugepages分配。
- -d:添加要加載的驅動程序或驅動程序目錄。 應用程序應該使用此選項來加載構建爲共享庫的pmd驅動程序。  
- -m MB:無論處理器socket如何,都可以從hugepages分配內存。 建議使用--socket-mem來代替這個選項。
- -r NUM:內存排名(原文:rank)的數量。
- -v:啓動時顯示的版本信息。
- --huge-dir:掛載(原文:mount)hugetlbfs的目錄。
- mbuf-pool-ops-name:池操作使用的mbuf名稱。
- --file-prefix:用於hugepages文件名的前綴文本。
- --proc-type:進程實例(原文:process instance)的類型
- --vmware-tsc-map:使用VMware TSC地圖(???原文:map)而不是本地RDTSC。
- --base-virtaddr:指定虛擬地址基地址(???原文:base virtual address)。
- --vfio-intr:指定VFIO要使用的中斷類型(如果不使用VFIO,則不起作用)。

-c或-l和選項是必需的; 其它都是可選的。

      將DPDK應用程序二進制文件複製到您的目標(原文:target),然後按如下方式運行應用程序(假設平臺每個處理器socket有四個內存通道,並且核0-3存在並將用於運行應用程序):

./helloworld -l 0-3 -n 4

----------------------------------
**注意:**  
     --proc-type和--file-prefix EAL選項用於運行多個DPDK進程。 有關更多詳細信息,請參閱“DPDK示例應用程序用戶指南”的“多進程示例應用程序”一章和“DPDK程序員指南”。
----------------------------------
#### 5.2.1 應用程序的邏輯核使用(原文:Logical Core Use by Applications)
       對於DPDK應用程序,核掩碼(-c 0x0f)或核列表(-l 0-3)參數始終是必需的。掩碼的每一位對應於Linux報告的等效邏輯覈編號。首選用corelist選項,它是定義要使用的核的更清晰的方法。由於這些邏輯核心編號及其映射到的在特定NUMA套接字上特定的核可能因平臺而異,因此建議在選擇每種情況下使用的核掩碼/核列表時,應考慮每個平臺的核佈局。
       在DPDK應用程序初始化EAL層時,將顯示要使用的邏輯核及其socket位置。也可以通過檢查/proc/cpuinfo文件(例如,通過運行cat /proc/cpuinfo)爲系統上的所有核確定此信息。爲每個處理器列出的物理ID屬性指示它所屬的CPU socket。當使用其它處理器來理解邏輯核到socket的映射時,這會很有用。

----------------------------------
**注意:**  

       使用Linux應用程序lstopo可以獲得邏輯核佈局的更多圖形視圖。 在Fedora Linux上,可以使用以下命令安裝並運行:

sudo yum install hwloc
./lstopo

----------------------------------
**警告:**    

       邏輯核佈局可以在不同的板佈局之間切換,並且應在選擇應用程序核掩碼/核列表之前進行檢查。
----------------------------------
#### 5.2.2 應用程序的巨頁(原文:Hugepage)內存使用
       運行應用程序時,建議使用與分配給巨頁相同數量的內存。 這是DPDK應用程序在啓動時自動完成的,如果在運行時沒有-m或--socket-mem參數傳遞給它。
       如果通過顯式傳遞-m或--socket-mem值來請求更多內存,則應用程序將失敗。 但是,如果用戶請求的內存少於巨大頁內存的預留量,那麼應用程序本身也可能失敗,特別是在使用-m選項時。 原因如下。 假設系統在socket0中有1024個預留的2MB頁面和在socket1中有1024個。如果用戶請求128MB內存,則64個頁面可能與約束(原文:constraint)不匹配:

- 僅由socket1中的內核給予應用程序的巨頁內存。 在這種情況下,如果應用程序嘗試創建一個對象(例如socket0中的環形或內存池),則會失敗。 爲避免此問題,建議使用--socket-mem選項代替-m選項。
- 這些頁面可以位於物理內存中的任何位置,儘管DPDK EAL會嘗試在連續的塊中分配內存,但頁面可能不會連續。 在這種情況下,應用程序無法分配大內存池。

        socket-mem選項可用於爲特定socket請求特定數量的內存。 這是通過提供--socket-mem標誌後跟在每個socket上請求的內存量來實現的,例如,supply --socket-mem=0,512試圖爲socket1預留512MB。 同樣,在一個四socket系統上,爲了在socket0和2上每個分配1GB的內存,可以使用參數--socket-mem=1024,0,1024。 在沒有明確涉及的任何CPUsocket上不會預留內存,例如在這種情況下的socket3。 如果DPDK無法在每個socket上分配足夠的內存,則EAL初始化失敗。

### 5.3 其它示例應用程序
        其它示例應用程序包含在${RTE_SDK}/examples目錄中。這些示例應用程序可以按照本手冊前面部分所述的方式構建和運行。另外,請參閱“DPDK示例應用程序用戶指南”以獲取應用程序的描述,編譯和執行的特定說明以及代碼的一些解釋。

### 5.4 其它的測試應用程序
        另外,還有兩個其它應用程序是在創建庫時構建的。這些源文件位於DPDK/app目錄中,稱爲test和testpmd。一旦創建了這些庫,就可以在build/app目錄中找到它們。

        測試應用程序爲DPDK中的各種功能提供了各種特定的測試。
        應用程序testpmd提供了許多不同的數據包吞吐量測試和功能示例,例如如何使用Intel®82599萬兆以太網控制器中的Flow Director。
--------------------------------------------------
--------------------------------------------------
## 6. 啓用附加功能 
### 6.1 高精度事件定時器(HPET)功能
#### 6.1.1 BIOS支持
       如果要使用HPET,則必須在平臺BIOS中啓用高精度定時器(HPET)。 否則,默認使用時間戳計數器(TSC)。 通常在平臺啓動時按F2鍵來訪問BIOS。 用戶然後可以導航到HPET選項。 在Crystal Forest平臺的BIOS中,路徑爲:Advanced -> PCH-IO Configuration -> High Precision Timer ->(如果需要,從禁用更改爲啓用)。

      在已經啓動完的系統上,可以發出以下命令來檢查HPET是否已啓用:

grep hpet / proc / timer_list

      如果沒有條目返回,則必須在BIOS中啓用HPET(按照上述說明)並重啓系統。
#### 6.1.2 Linux內核支持
      DPDK通過將定時器計數器映射到進程地址空間來利用平臺HPET定時器,因此要求啓用HPET_MMAP內核配置選項。
----------------------------------
**警告:**    

      在Fedora以及其他常見發行版(如Ubuntu)中,缺省情況下未啓用HPET_MMAP內核選項。 要在啓用此選項的情況下重新編譯Linux內核,請從發佈文檔查閱相關說明。
----------------------------------     

#### 6.1.3 在DPDK中啓用HPET
      默認情況下,DPDK的構建配置文件中禁用HPET。要使用HP​​ET,應將CONFIG_RTE_LIBEAL_USE_HPET設置更改爲y,這將在編譯時啓用HPET設置。
     對於應用程序使用rte_get_hpet_cycles()和rte_get_hpet_hz()的API調用,並且可選地將HPET設置爲rte_timer庫的默認時間源,應在應用程序初始化時調用新的rte_eal_hpet_init()API調用。此API調用將確定HPET是可訪問的,如果不是,則會嚮應用程序返回錯誤,例如,如果HPET_MMAP未在內核中啓用。然後,應用程序可以確定在運行時HPET不可用時要採取的操作(如果有的話)。
----------------------------------
**注意:**  
       對於需要計時API的應用程序,特別是不需要HPET計時器,建議使用rte_get_timer_cycles()和rte_get_timer_hz()API調用代替HPET特定的API。這些通用API可以與TSC或HPET時間源一起使用,具體取決於應用程序對rte_eal_hpet_init()的請求(如果有)以及系統在運行時可用的東西。
----------------------------------

### 6.2 運行沒有Root權限的DPDK應用程序
----------------------------------
**注意:**  
       下面的說明將允許在較早的Linux內核版本中非root用戶運行DPDK。但是,從版本4.0開始,內核不允許非特權進程從頁面映射文件中讀取物理地址信息,從而使這些進程無法使用需要物理地址的硬件(原文:HW)設備。
----------------------------------
       雖然使用DPDK的應用程序直接使用網絡端口和其他硬件資源,但通過一些小的權限調整,可以以“root”以外的用戶身份運行這些應用程序。爲此,應調整以下Linux文件系統對象的所有權或權限,以確保用於運行DPDK應用程序的Linux用戶帳戶可以訪問它們:
- 所有用作巨頁掛載點的目錄,例如/mnt/huge
- /dev中的userspace-io(譯者注:UIO)設備文件,例如/dev/uio0,/dev/uio1等
- userspace-io sysfs配置和資源文件,例如uio0:
/sys/class/uio/uio0/device/config  
/sys/class/uio/uio0/device/resource*
- 如果要使用HP​​ET,/dev/hpet
----------------------------------
**注意:**  
       在某些Linux安裝中,/dev/hugepages也是默認創建的一個巨頁掛載點。
----------------------------------

### 6.3 電源管理和省電功能
      如果要使用DPDK的電源管理功能,必須在平臺BIOS中啓用增強型Intel SpeedStep®技術(Enhanced Intel SpeedStep® Technology)。 否則,sys文件文件夾/sys/devices/system/cpu/cpu0/cpufreq將不存在,並且不能使用基於CPU頻率的電源管理。 請參閱相關BIOS文檔以確定如何訪問這些設置。

      例如,在某些Intel參考平臺BIOS變體上,增強型Intel SpeedStep®技術的路徑是:

Advanced
-> Processor Configuration
-> Enhanced Intel SpeedStep® Tech


     另外,還應該啓用C3和C6以進行電源管理。 C3和C6在同一個平臺BIOS上的路徑是:

Advanced
-> Processor Configuration
-> Processor C3 Advanced
-> Processor Configuration
-> Processor C6


### 6.4 使用Linux核隔離(原文:Linux Core Isolation)來減少上下文切換
        雖然DPDK應用程序使用的線程固定在系統上的邏輯核中,但Linux調度程序也可以在這些核上運行其它任務。 爲了防止在這些核上運行額外的工作負載,可以使用Linux內核參數isolcpus將它們與常規Linux調度程序隔離。

        例如,如果要在邏輯核2,4和6上運行DPDK應用程序,則應將以下內容添加到內核參數列表中:

isolcpus=2,4,6


### 6.5 加載DPDK KNI內核模塊
       要運行DPDK 內核NIC接口(KNI)的示例應用程序,必須將一個額外的內核模塊(kni模塊)加載到正在運行的內核中。 該模塊位於DPDK目標目錄的kmod子目錄中。 與加載igb_uio模塊類似,應該使用insmod命令加載該模塊,如下所示(假定當前目錄是DPDK目標目錄):

insmod kmod/rte_kni.ko

----------------------------------
**注意:**  
      有關更多詳細信息,請參閱“DPDK示例應用程序用戶指南”中的“內核NIC接口示例應用程序”一章。
----------------------------------

### 6.6 使用Linux IOMMU Pass-Through(譯者注:透傳)通過Intel® VT-d運行DPDK
         要在Linux內核中啓用Intel® VT-d,必須設置許多內核配置選項。這些包括:

- IOMMU_SUPPORT
- IOMMU_API
- INTEL_IOMMU

         另外,要使用Intel® VT-d運行DPDK,使用igb_uio驅動程序時必須使用內核參數iommu=pt。 這會導致主機中的DMAR(DMA重新映射)查找的透傳。 另外,如果INTEL_IOMMU_DEFAULT_ON未在內核中設置,則必須使用內核參數intel_iommu=on。 這可確保Intel IOMMU按預期進行初始化。

        請注意,雖然使用iommu=pt對於igb_uio驅動程序是強制性的,但vfio-pci驅動程序實際上可以使用iommu=pt和iommu=on兩者一起工作。
--------------------------------------------------
--------------------------------------------------

## 7. 快速上手安裝腳本
        在usertools子目錄中找到的dpdk-setup.sh腳本,允許用戶執行以下任務:
- 構建DPDK庫
- 插入和移除DPDK IGB_UIO內核模塊
- 插入和刪除VFIO內核模塊
- 插入和移除DPDK KNI內核模塊
- 爲NUMA和非NUMA的場景創建和刪除巨頁
- 查看網絡端口狀態和爲DPDK應用程序使用預留端口
- 設置使用VFIO作爲非特權用戶的權限
- 運行測試和testpmd應用程序
- 看看meminfo中的巨頁
- 在/mnt/huge列出巨頁
- 刪除已構建的DPDK庫

       一旦EAL目標之一完成了這些步驟,用戶就可以編譯自己的應用程序,鏈接到EAL庫中以創建DPDK鏡像(原文:image)。

### 7.1 腳本的組織結構
      dpdk-setup.sh腳本在邏輯上組織成用戶按順序執行的一系列步驟。每個步驟都提供了許多指導用戶完成所需任務的選項。以下是每個步驟的簡要說明。
#### 第1步:構建DPDK庫
     最初,用戶必須選擇一個DPDK目標,以便在構建庫時選擇正確的目標類型和編譯器選項。
     正如本上手指南前面的章節所述,用戶必須先在系統中安裝所有庫、模塊、更新和編譯器。
#### 第2步:安裝環境
      用戶配置Linux* 環境以支持DPDK應用程序的運行。可以爲NUMA或非NUMA系統設置巨頁。 任何現有的巨頁將被刪除。所需的DPDK內核模塊也可以在此步驟中插入,網絡端口可以綁定到此模塊以供DPDK應用程序使用。
#### 第3步:運行應用程序
     一旦執行了其它步驟,用戶可以運行測試應用程序。 測試應用程序允許用戶爲DPDK運行一系列功能測試。 testpmd應用程序支持數據包的接收和發送,也可以運行。
#### 第4步:檢查系統
     這一步提供了一些工具來檢查巨頁映射的狀態。
#### 第5步:系統清理
     最後一步有將系統恢復到原始狀態的選項。

### 7.2 用例
        以下是如何使用dpdk-setup.sh腳本的一些示例。 該腳本應該使用source命令運行。 繼續之前,腳本中的某些選項會提示用戶輸入更多數據。
----------------------------------
**警告:**    
      dpdk-setup.sh腳本應該以root權限運行。
----------------------------------          

source usertools/dpdk-setup.sh


RTE_SDK exported as /home/user/rte


Step 1: Select the DPDK environment to build


[1] i686-native-linuxapp-gcc

[2] i686-native-linuxapp-icc

[3] ppc_64-power8-linuxapp-gcc

[4] x86_64-native-bsdapp-clang

[5] x86_64-native-bsdapp-gcc

[6] x86_64-native-linuxapp-clang

[7] x86_64-native-linuxapp-gcc

[8] x86_64-native-linuxapp-icc


Step 2: Setup linuxapp environment


[11] Insert IGB UIO module

[12] Insert VFIO module

[13] Insert KNI module

[14] Setup hugepage mappings for non-NUMA systems

[15] Setup hugepage mappings for NUMA systems

[16] Display current Ethernet device settings

[17] Bind Ethernet device to IGB UIO module

[18] Bind Ethernet device to VFIO module

[19] Setup VFIO permissions


Step 3: Run test application for linuxapp environment


[20] Run test application ($RTE_TARGET/app/test)

[21] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)


Step 4: Other tools


[22] List hugepage info from /proc/meminfo


Step 5: Uninstall and system cleanup


[23] Uninstall all targets

[24] Unbind NICs from IGB UIO driver

[25] Remove IGB UIO module

[26] Remove VFIO module

[27] Remove KNI module

[28] Remove hugepage mappings

[29] Exit Script

-----------------------------

Option:

以下選擇演示了創建x86_64-native-linuxapp-gcc DPDK庫。

Option: 9

================== Installing x86_64-native-linuxapp-gcc

Configuration done
== Build lib
...
Build complete
RTE_TARGET exported as x86_64-native-linuxapp-gcc


以下選項演示了DPDK UIO驅動程序的啓動。

Option: 25

Unloading any existing DPDK UIO module
Loading DPDK UIO module


以下選擇演示了在NUMA系統中創建巨頁的過程。 1024個2 MByte頁面分配給每個節點。 結果是應用程序應該使用-m 4096來啓動應用程序來訪問兩個存儲區(如果未提供-m選項,這將自動完成)。

----------------------------------
**注意:**  
      如果顯示提示以刪除臨時文件,請鍵入'y'。
----------------------------------

Option: 15

Removing currently reserved hugepages
mounting /mnt/huge and removing directory
Input the number of 2MB pages for each node
Example: to have 128MB of hugepages available per node,
enter '64' to reserve 64 * 2MB pages on each node
Number of pages for node0: 1024
Number of pages for node1: 1024
Reserving hugepages
Creating /mnt/huge and mounting as hugetlbfs


以下選擇演示了測試應用程序在單核上運行的啓動。

Option: 20

Enter hex bitmask of cores to execute test app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0x01
Launching app
EAL: coremask set to 1
EAL: Detected lcore 0 on socket 0
...
EAL: Master core 0 is ready (tid=1b2ad720)
RTE>>


### 7.3 應用程序
       一旦用戶運行了dpdk-setup.sh腳本,構建了一個EAL目標並設置了巨頁(如果使用其中一個Linux EAL目標),用戶就可以繼續構建並運行他們的應用程序或其中一個提供的例子。

      /examples目錄中的示例爲理解DPDK的操作提供了一個很好的起點。 以下命令序列顯示了helloworld示例應用程序怎樣構建和運行。 正如第4.2.1節“應用程序的邏輯核使用”中所建議的那樣,應在選擇用於應用程序的核掩碼時確定平臺的邏輯核佈局。

cd helloworld/
make
CC main.o
LD helloworld
INSTALL-APP helloworld
INSTALL-MAP helloworld.map

sudo ./build/app/helloworld -l 0-3 -n 3
[sudo] password for rte:

EAL: coremask set to f
EAL: Detected lcore 0 as core 0 on socket 0
EAL: Detected lcore 1 as core 0 on socket 1
EAL: Detected lcore 2 as core 1 on socket 0
EAL: Detected lcore 3 as core 1 on socket 1
EAL: Setting up hugepage memory...
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0add800000 (size = 0x200000)
EAL: Ask a virtual area of 0x3d400000 bytes
EAL: Virtual area found at 0x7f0aa0200000 (size = 0x3d400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9fc00000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9f600000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9f000000 (size = 0x400000)
EAL: Ask a virtual area of 0x800000 bytes
EAL: Virtual area found at 0x7f0a9e600000 (size = 0x800000)
EAL: Ask a virtual area of 0x800000 bytes
EAL: Virtual area found at 0x7f0a9dc00000 (size = 0x800000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9d600000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9d000000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9ca00000 (size = 0x400000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0a9c600000 (size = 0x200000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0a9c200000 (size = 0x200000)
EAL: Ask a virtual area of 0x3fc00000 bytes
EAL: Virtual area found at 0x7f0a5c400000 (size = 0x3fc00000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0a5c000000 (size = 0x200000)
EAL: Requesting 1024 pages of size 2MB from socket 0
EAL: Requesting 1024 pages of size 2MB from socket 1
EAL: Master core 0 is ready (tid=de25b700)
EAL: Core 1 is ready (tid=5b7fe700)
EAL: Core 3 is ready (tid=5a7fc700)
EAL: Core 2 is ready (tid=5affd700)
hello from core 1
hello from core 2
hello from core 3
hello from core 0

--------------------------------------------------
--------------------------------------------------

## 8. 如何使Intel平臺上的NIC獲得最佳性能
     本部分文檔是在Intel平臺上DPDK應用程序獲得高性能的分步指南。

### 8.1 硬件和內存要求
         爲了獲得最佳性能,請使用Intel Xeon類服務器系統,如Ivy Bridge,Haswell或更新的。
         確保每個內存通道至少插入一個內存DIMM(譯者注:Dual-Inline-Memory-Modules 雙列直插式存儲模塊),並且每個內存的內存大小至少爲4GB。 注意:這對性能有最直接的影響。

         您可以使用dmidecode檢查內存配置,如下所示:

dmidecode -t memory | grep Locator

Locator: DIMM_A1
Bank Locator: NODE 1
Locator: DIMM_A2
Bank Locator: NODE 1
Locator: DIMM_B1
Bank Locator: NODE 1
Locator: DIMM_B2
Bank Locator: NODE 1
...
Locator: DIMM_G1
Bank Locator: NODE 2
Locator: DIMM_G2
Bank Locator: NODE 2
Locator: DIMM_H1
Bank Locator: NODE 2
Locator: DIMM_H2
Bank Locator: NODE 2


       上面的示例輸出顯示總共8個通道,從A到H,其中每個通道都有2個DIMM。

       您也可以使用dmidecode來確定內存頻率:

dmidecode -t memory | grep Speed

Speed: 2133 MHz
Configured Clock Speed: 2134 MHz
Speed: Unknown
Configured Clock Speed: Unknown
Speed: 2133 MHz
Configured Clock Speed: 2134 MHz
Speed: Unknown
...
Speed: 2133 MHz
Configured Clock Speed: 2134 MHz
Speed: Unknown
Configured Clock Speed: Unknown
Speed: 2133 MHz
Configured Clock Speed: 2134 MHz
Speed: Unknown
Configured Clock Speed: Unknown

       輸出顯示速度爲2133 MHz(DDR4)和未知(不存在)。 這與之前的輸出一致,表明每個通道都有一個內存條。

#### 8.1.1 網絡接口卡(譯者注:NIC)要求
      使用支持DPDK的高端NIC,如Intel XL710 40GbE。
      確保每個NIC都刷了最新版本的NVM/固件。
      使用PCIe Gen3插槽,例如Gen3 x8或Gen3 x16,因爲PCIe Gen2插槽不能爲2x10GbE及更高提供足夠的帶寬。 您可以使用lspci來檢查PCI插槽的速度,如下所示:

lspci -s 03:00.1 -vv | grep LnkSta

LnkSta: Speed 8GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- ...
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete+ ...

       將NIC插入PCI插槽時,請務必檢查標誌,例如CPU0或CPU1,以指示它連接的是哪個插座。

       應該注意NUMA。 如果您使用2個或更多來自不同NIC的端口,最好確保這些NIC位於相同的CPU socket上。 下面進一步顯示瞭如何確定這一點的例子。

#### 8.1.2 BIOS設置
       以下是有關BIOS設置的一些建議。 不同的平臺會有不同的BIOS命名,所以以下內容主要供參考:

 1. 在開始之前考慮將所有BIOS設置重置爲其默認設置。
 2. 禁用所有節電選項,例如:電源性能調整,CPU P狀態,CPU C3報告和CPU C6報告。
 3. 選擇性能作爲CPU功耗和性能的策略。
 4. 禁用Turbo Boost以確保性能隨着核的數量的增加而增加。
 5. 將內存頻率設置爲最高可用數,而不是自動。
 6. 測試NIC的物理功能時禁用所有虛擬化選項,並且如果要使用VFIO,請打開VT-d。

#### 8.1.3 Linux引導命令行
       以下是關於GRUB引導設置的一些建議:

 1. 使用默認的grub文件作爲起點。
 2. 通過grub配置預留1G巨頁。 例如,要預留8個1G大小的巨頁:

default_hugepagesz=1G hugepagesz=1G hugepages=8

 3. 隔離將用於DPDK的CPU核。 例如:

isolcpus=2,3,4,5,6,7,8

 4. 如果它想要使用VFIO,請使用以下額外的grub參數:

iommu=pt intel_iommu=on


### 8.2 運行DPDK之前的配置

 1 構建DPDK目標並預留巨頁。 有關更多詳細信息,請參閱前面關於在Linux環境中使用巨頁的章節。
以下shell命令可能有助於構建和配置:

Build DPDK target.

cd dpdk_folder
make install T=x86_64-native-linuxapp-gcc -j

Get the hugepage size.

awk '/Hugepagesize/ {print $2}' /proc/meminfo

Get the total huge page numbers.

awk '/HugePages_Total/ {print $2} ' /proc/meminfo

Unmount the hugepages.

umount awk '/hugetlbfs/ {print $2}' /proc/mounts

Create the hugepage mount folder.

mkdir -p /mnt/huge

Mount to the specific folder.

mount -t hugetlbfs nodev /mnt/huge

 2 使用DPDK cpu_layout應用程序檢查CPU佈局:

cd dpdk_folder

usertools/cpu_layout.py

   或運行lscpu檢查每個socket上的核。

 3 檢查您的NIC的ID和相關socket的ID:

List all the NICs with PCI address and device IDs.

lspci -nn | grep Eth

    例如,假設您的輸出如下所示:

82:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
82:00.1 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
85:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
85:00.1 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]


   檢查PCI設備相關的numa節點ID:

cat /sys/bus/pci/devices/0000\:xx\:00.x/numa_node


      通常,0x:00.x位於socket0上,而8x:00.x位於socket1上。注:要獲得最佳性能,請確保核和NIC位於同一socket中。 在上面的示例中,85:00.0位於socket1上,應該由socket1上的核使用,以獲得最佳性能。

 4 檢查需要加載哪些內核驅動程序以及是否需要從其內核驅動程序解除綁定網絡端口。 有關DPDK設置和Linux內核要求的更多詳細信息,請參閱“從源碼編譯DPDK目標”和“Linux驅動程序”章節。

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