DPDK線程啟動方式


dpdk線程

rte_eal_init執行時會通過pthread_create創建一個worker線程(eal_thread_loop),並綁定到配置的lcore上,
可通過參數-c/-l/--lcores指定在那些核心創建worker線程。
每個worker線程擁有一對管道fd用於與master線程通信。
worker線程內部時一個while超循環結構,在循環開始處通過read管道阻塞線程。
master線程調用rte_eal_remote_launch或rte_eal_mp_remote_launch創建用戶線程時,
實現上是通過write對應core的管道喚醒worker線程,再執行rte_eal_remote_launch傳入的函數。

幾種用戶線程初始化方式

在每個slave核上創建線程

RTE_LCORE_FOREACH_SLAVE(lcore_id) {
	rte_eal_remote_launch(user_loop, param, lcore_id);
}

在除了master核的其他核上創建線程

rte_eal_mp_remote_launch(user_loop, param, SKIP_MASTER);

dpdk線程的思考

前文提到rte_eal_remote_launch創建線程實際時喚醒對應lcore的worker線程
通過cpu_layout.py可以查看當前cpu的核心分布,例如:

======================================================================
Core and Socket Information (as reported by '/sys/devices/system/cpu')
======================================================================

cores =  [0, 1]
sockets =  [0]

       Socket 0     
       --------     
Core 0 [0, 1]       
Core 1 [2, 3]  

上面兩種dpdk線程初始化方式都會跳過core 0 的0核(默認的master核心)
那么問題來了
對於啟用了超線程的cpu,一個物理核上會存在兩個兩個邏輯核(lcore)
那么data path的任務是否適合放在上面這個cpu的core0-1上呢?
拍腦袋想也應該時不合適的吧?
那么在線程初始化的適合,是否應該根據cpu分布,

  1. 避免在master物理核心的兩個lcore上跑data path任務
  2. 在每個物理核上僅選擇一個lcore創建任務

理由是,超線程的兩個邏輯核心是共享流水線和L1/L2 Cache的,超線程是否適合dpdk?

不知道為啥,在大部分代碼里看到的是上面這兩種任務初始化,而不是根據物理核心初始化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM