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分布,
- 避免在master物理核心的兩個lcore上跑data path任務
- 在每個物理核上僅選擇一個lcore創建任務
理由是,超線程的兩個邏輯核心是共享流水線和L1/L2 Cache的,超線程是否適合dpdk?
不知道為啥,在大部分代碼里看到的是上面這兩種任務初始化,而不是根據物理核心初始化