运行 同一个 DPDK lcore 上的多个线程
Running multiple threads on the same DPDK lcore
我正在开发一个 dpdk 转发应用程序来接收和转发数据包。我有两个功能可以从两个端口接收和转发数据包。我调用了函数,
rte_eal_remote_launch 在两个不同的 lcores 上启动转发和接收功能。这消耗了 lcore 掩码的两个 lcores。因此,我使用服务核心在同一个 lcore 中启动两者。我可以将接收和转发这两个功能注册为服务。但是当我启动服务时,只有一项服务运行。
服务已成功注册并映射到同一个 lcore。但是只有一个在运行时运行。对此问题的任何澄清表示赞赏。
服务注册和启动代码如下
for (i = 0; i < 4; i++){
uint32_t id;
ret = rte_service_component_register(&services[i], &id);
printf("service id : %d\n", id);
if (ret)
rte_exit(-1, "service register() failed");
rte_service_component_runstate_set(id, 1);
rte_service_set_stats_enable(id, 1);
ret = rte_service_runstate_set(id, 1);
if (ret)
return -ENOEXEC;
}
printf("Service Components Registrations Done!\n");
ret = rte_service_lcore_add(core);
if(ret == 0)
printf("Service core added\n");
if (ret && ret != -EALREADY)
printf("core %d added ret %d\n", core, ret);
ret = rte_service_lcore_start(core);
if(ret == 0)
printf("Service core started\n");
if (ret && ret != -EALREADY)
printf("core %d start ret %d\n", core, ret);
for (int s = 0; s < 4; s=s+2) {
if (rte_service_map_lcore_set(s, core, 1))
printf("failed to map lcore %d\n", core);
else{
printf("Service %d started on core\n", s);
}
以下是使用rte_delay_us_sleep(5 * US_PER_S);
延迟系统后rte_service_dump
的结果
Services Summary
service_channel_in: stats 1 calls 0 cycles 0 avg: 0
service_channel_out: stats 1 calls 0 cycles 0 avg: 0
service_channel_in: stats 1 calls 0 cycles 0 avg: 0
service_channel_out: stats 1 calls 0 cycles 0 avg: 0
Service Cores Summary
05 0 0 0 0
DPDK API rte_eal_remote_launch 可以工作不同的 CPU 核心以及相同的CPU核心也是。
- 在不同的 CPU 逻辑核心上
-l 2-3
- 到 运行 在同一个 CPU 逻辑核心上
--lcore (0-1)@2
请注意,第二个选项将 运行 在 CPU 逻辑核心 2
上创建 2 个 DPDK 线程“0-1”到 运行
根据 rte_service_dump
的结果,有 2 个函数 运行ning 即 service_channel_in 和 service_channel_out
因此关于 rte_remote_launch 和 rte_service 不 运行 宁在同一个 CPU 物理核心的观察是不正确的。
示例代码
#include <stdint.h>
#include <inttypes.h>
#include <signal.h>
#include <rte_eal.h>
#include <rte_cycles.h>
#include <rte_lcore.h>
volatile bool run = true;
int helloWaitTest(void *arg)
{
uint16_t val = *(uint16_t *)arg;
while(run)
{
printf(" val %u dpdk logical core %u logical core index %u\n", val, rte_lcore_id(), rte_lcore_index(rte_lcore_id()));
rte_delay_ms(1000 + 1000 * val);
}
return 0;
}
static void
signal_handler(int signum)
{
if (signum == SIGINT) {
run = false;
}
}
int main(int argc, char *argv[])
{
signal(SIGINT, signal_handler);
/* Initialize the Environment Abstraction Layer (EAL). */
int ret = rte_eal_init(argc, argv);
if (ret < 0)
rte_exit(EXIT_FAILURE, "Error with EAL initialization\n");
argc -= ret;
argv += ret;
uint16_t lcore_id = 0;
RTE_LCORE_FOREACH_WORKER(lcore_id)
{
uint16_t temp = lcore_id;
rte_eal_remote_launch(helloWaitTest, &temp, temp);
}
uint16_t temp = rte_lcore_id();
helloWaitTest(&temp);
rte_eal_mp_wait_lcore();
/* clean up the EAL */
rte_eal_cleanup();
return 0;
}
如何运行:sudo ./a.out --lcores '(1-2)@3'
我正在开发一个 dpdk 转发应用程序来接收和转发数据包。我有两个功能可以从两个端口接收和转发数据包。我调用了函数, rte_eal_remote_launch 在两个不同的 lcores 上启动转发和接收功能。这消耗了 lcore 掩码的两个 lcores。因此,我使用服务核心在同一个 lcore 中启动两者。我可以将接收和转发这两个功能注册为服务。但是当我启动服务时,只有一项服务运行。
服务已成功注册并映射到同一个 lcore。但是只有一个在运行时运行。对此问题的任何澄清表示赞赏。
服务注册和启动代码如下
for (i = 0; i < 4; i++){
uint32_t id;
ret = rte_service_component_register(&services[i], &id);
printf("service id : %d\n", id);
if (ret)
rte_exit(-1, "service register() failed");
rte_service_component_runstate_set(id, 1);
rte_service_set_stats_enable(id, 1);
ret = rte_service_runstate_set(id, 1);
if (ret)
return -ENOEXEC;
}
printf("Service Components Registrations Done!\n");
ret = rte_service_lcore_add(core);
if(ret == 0)
printf("Service core added\n");
if (ret && ret != -EALREADY)
printf("core %d added ret %d\n", core, ret);
ret = rte_service_lcore_start(core);
if(ret == 0)
printf("Service core started\n");
if (ret && ret != -EALREADY)
printf("core %d start ret %d\n", core, ret);
for (int s = 0; s < 4; s=s+2) {
if (rte_service_map_lcore_set(s, core, 1))
printf("failed to map lcore %d\n", core);
else{
printf("Service %d started on core\n", s);
}
以下是使用rte_delay_us_sleep(5 * US_PER_S);
rte_service_dump
的结果
Services Summary
service_channel_in: stats 1 calls 0 cycles 0 avg: 0
service_channel_out: stats 1 calls 0 cycles 0 avg: 0
service_channel_in: stats 1 calls 0 cycles 0 avg: 0
service_channel_out: stats 1 calls 0 cycles 0 avg: 0
Service Cores Summary
05 0 0 0 0
DPDK API rte_eal_remote_launch 可以工作不同的 CPU 核心以及相同的CPU核心也是。
- 在不同的 CPU 逻辑核心上
-l 2-3
- 到 运行 在同一个 CPU 逻辑核心上
--lcore (0-1)@2
请注意,第二个选项将 运行 在 CPU 逻辑核心 2
根据 rte_service_dump
的结果,有 2 个函数 运行ning 即 service_channel_in 和 service_channel_out
因此关于 rte_remote_launch 和 rte_service 不 运行 宁在同一个 CPU 物理核心的观察是不正确的。
示例代码
#include <stdint.h>
#include <inttypes.h>
#include <signal.h>
#include <rte_eal.h>
#include <rte_cycles.h>
#include <rte_lcore.h>
volatile bool run = true;
int helloWaitTest(void *arg)
{
uint16_t val = *(uint16_t *)arg;
while(run)
{
printf(" val %u dpdk logical core %u logical core index %u\n", val, rte_lcore_id(), rte_lcore_index(rte_lcore_id()));
rte_delay_ms(1000 + 1000 * val);
}
return 0;
}
static void
signal_handler(int signum)
{
if (signum == SIGINT) {
run = false;
}
}
int main(int argc, char *argv[])
{
signal(SIGINT, signal_handler);
/* Initialize the Environment Abstraction Layer (EAL). */
int ret = rte_eal_init(argc, argv);
if (ret < 0)
rte_exit(EXIT_FAILURE, "Error with EAL initialization\n");
argc -= ret;
argv += ret;
uint16_t lcore_id = 0;
RTE_LCORE_FOREACH_WORKER(lcore_id)
{
uint16_t temp = lcore_id;
rte_eal_remote_launch(helloWaitTest, &temp, temp);
}
uint16_t temp = rte_lcore_id();
helloWaitTest(&temp);
rte_eal_mp_wait_lcore();
/* clean up the EAL */
rte_eal_cleanup();
return 0;
}
如何运行:sudo ./a.out --lcores '(1-2)@3'