Getting Started Guide for Linux(6)編譯和運行示例應用程序(包括EAL通用命令選項)

官方文檔查看地址:
http://doc.dpdk.org/guides/linux_gsg/build_sample_apps.html
PDF下載地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-getting-started-guide.html

本篇難度係數:
翻譯:★☆☆☆☆
理解:★☆☆☆☆

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

請注意
這個過程的某些部分也可以使用安裝腳本完成,該腳本描述了本文檔的快速啓動安裝腳本(http://doc.dpdk.org/guides/linux_gsg/quick_start.html#linux-setup-script)部分。

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

在DPDK的Linux*環境中編譯應用程序時,必須導出以下變量:

  • RTE_SDK - 指向DPDK安裝目錄。
  • RTE_TARGET - 指向DPDK目標環境目錄。

下面是一個創建helloworld應用程序的示例,它在DPDK Linux環境中運行。這個例子可以在${RTE_SDK}/examples目錄中找到。

該目錄包含main.c文件。當該文件與DPDK目標環境中的庫相結合時,調用各種函數來初始化DPDK環境,然後爲要使用的每個CPU核啓動一個入口點(分派應用程序)。默認情況下,二進制文件是在build目錄中生成的。

cd examples/helloworld/
export RTE_SDK=$HOME/DPDK
export RTE_TARGET=x86_64-native-linux-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-linux-gcc

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

6.2運行示例應用程序

警告
在運行應用程序之前,請確保:完成了
Hugepages設置。
正在使用的任何內核驅動程序都已加載。
如果需要,應用程序使用的端口應該綁定到相應的內核驅動程序。

有關更多細節,請參考Linux驅動程序(http://doc.dpdk.org/guides/linux_gsg/linux_drivers.html#linux-gsg-linux-drivers)。

該應用程序與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:一個運行在內核上的十六進制位掩碼。注意,核心編號可能在平臺之間發生變化,應該事先確定。corelist是一組核心數字,而不是位圖核心掩碼。
  • -n NUM:每個處理器套接字的內存通道數。
  • -b <domain:bus:devid.func>:港口黑名單;防止EAL使用指定的PCI設備(允許多個-b選項)。
  • --use-device:只使用指定的以太網設備。使用逗號分隔[domain:]bus:devid.func值。不能與-b選項一起使用。
  • --socket-mem:從特定套接字上的巨頁分配的內存。在動態內存模式下,該內存也將被固定(即在應用程序關閉之前不會釋放回系統)。
  • --socket-limit:限制每個套接字上可用的最大內存。不支持遺留內存模式。
  • -d 添加要加載的驅動程序或驅動程序目錄。應用程序應該使用此選項加載作爲共享庫構建的pmd驅動程序。
  • -m MB:內存分配從巨大的頁面,不管處理器插座。建議使用–socket-mem來代替這個選項。
  • -r NUM:內存等級的數量。
  • -v:啓動時顯示版本信息。
  • --huge-dir:掛載hugetlbfs的目錄。
  • mbuf-pool-ops-name:要使用的mbuf的池操作名稱。
  • --file-prefix:用於大頁文件名的前綴文本。
  • --proc-type:流程實例的類型。
  • --vmware-tsc-map:使用VMware TSC map代替本地RDTSC。
  • --base-virtaddr:指定基本虛擬地址。
  • --vfio-intr:指定VFIO要使用的中斷類型(如果不使用VFIO,則沒有效果)。
  • --legacy-mem:在遺留內存模式下運行DPDK(在運行時禁用內存儲備/取消儲備,但提供更多的iova -毗連內存)。
  • --single-file-segments:將內存段存儲在更少的文件中(僅動態內存模式—不影響遺留內存模式)。

-c-l和選項是強制性的;其他選項是可選的。

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

./helloworld -l 0-3 -n 4

請注意
–proc-type 和–file-prefixEAL選項用於運行多個DPDK進程。有關詳細信息,請參閱DPDK樣例應用程序用戶指南和DPDK程序員指南中的“多進程樣例應用程序”(Multi-process Sample Application)一章。

6.2.1應用程序使用的邏輯核心
對於DPDK應用程序,coremask (-c 0x0f)或corelist (-l 0-3)參數始終是必需的。掩碼的每個位對應於Linux報告的等效邏輯CPU核心號。首選的corelist選項是定義要使用的核心的更簡潔的方法。由於這些邏輯核心編號以及它們到特定NUMA套接字上的特定核心的映射可能因平臺而異,因此建議在選擇每種情況下使用的coremask/corelist時考慮每個平臺的核心佈局。

在DPDK應用程序初始化EAL層時,將顯示要使用的邏輯內核及其套接字位置。還可以通過檢查/proc/cpuinfo文件(例如,運行cat /proc/cpuinfo.)來爲系統上的所有核心確定此信息爲每個處理器列出的物理id屬性表示它所屬的CPU套接字。當使用其他處理器來理解邏輯核心到套接字的映射時,這是非常有用的。

請注意
可以使用lstopo Linux實用程序獲得邏輯核心佈局的更圖形化視圖。在Fedora Linux上,可以使用以下命令安裝並運行該命令:

sudo yum install hwloc
./lstopo

警告
邏輯核心佈局可以在不同的板佈局之間更改,應該在選擇應用程序coremask/corelist之前進行檢查。

6.2.2應用程序使用的巨大內存
在運行應用程序時,建議使用與分配給hugepages相同的內存。如果在運行時沒有傳遞-m或--socket-mem參數,則DPDK應用程序在啓動時自動執行使用分配給hugepages的內存。

如果通過顯式傳遞-m或--socket-mem值請求更多內存,應用程序將失敗。但是,如果用戶請求的內存少於保留的大頁內存,應用程序本身也可能失敗,特別是使用-m選項時。原因如下。假設系統在套接字0中保留了1024個2MB的頁面,在套接字1中保留了1024個頁面。如果用戶請求128MB內存,64頁可能不匹配約束:

  • 只有套接字1中的內核纔會將內存分配給應用程序。在這種情況下,如果應用程序試圖在套接字0中創建一個對象,例如一個環或內存池,則會失敗。爲了避免這個問題,建議使用--socket-mem選項而不是-m選項。
  • 這些頁面可以位於物理內存中的任何位置,儘管DPDK EAL將嘗試在相鄰塊中分配內存,但這些頁面可能不是相鄰的。在這種情況下,應用程序不能分配大內存池。

socket-mem 選項可用於爲特定套接字請求特定數量的內存。這是通過提供--socket-mem標誌和每個套接字上請求的內存量來實現的,例如,供應--socket-mem=0,512,嘗試只爲套接字1保留512 MB。類似地,在一個4套接字系統上,要僅在每個套接字0和2上分配1 GB內存,可以使用參數--socket-mem=1024,0,1024。任何沒有顯式引用的CPU套接字上都不會保留內存,例如,在本例中,套接字3。如果DPDK不能在每個套接字上分配足夠的內存,則EAL初始化將失敗。

6.3額外的示例應用程序
${RTE_SDK}/examples目錄中包含其他示例應用程序。這些示例應用程序的構建和運行方式可能與本手冊前面部分描述的類似。此外,有關應用程序的描述、編譯和執行的特定說明以及代碼的一些解釋,請參閱DPDK示例應用程序用戶指南。

6.4額外的測試應用程序
此外,在創建庫時還要構建另外兩個應用程序。這些文件的源文件位於DPDK/app目錄中,稱爲test和testpmd。創建庫之後,可以在build/app目錄中找到它們。測試應用程序爲DPDK中的各種功能提供了各種特定的測試testpmd應用程序提供了許多不同的數據包吞吐量測試和特性示例,例如如何使用Intel®82599 10千兆以太網控制器中的流控制器。

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