在同一个 DPDK lcore 上运行多个线程

如何解决在同一个 DPDK lcore 上运行多个线程

我正在开发一个 dpdk 转发应用程序来接收和转发数据包。我有两个函数来接收和转发来自两个端口的数据包。我调用了函数, rte_eal_remote_launch 在两个不同的 lcore 上启动转发和接收功能。这消耗了 lcore 掩码的两个 lcore。因此,我使用服务核心在同一个 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",ret);

for (int s = 0; s < 4; s=s+2) {
    if (rte_service_map_lcore_set(s,1))
        printf("failed to map lcore %d\n",core);
    else{
        printf("Service %d started on core\n",s);
    }
    

以下是使用rte_service_dump延迟系统后rte_delay_us_sleep(5 * US_PER_S);的结果

    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 内核上工作。

  1. 在不同的 CPU 逻辑内核上-l 2-3
  2. 在相同的 CPU 逻辑核心上运行 --lcore (0-1)@2

注意第二个选项将运行 create 2 DPDK 线程 '0-1' 以在 CPU 逻辑内核上运行 2

根据 rte_service_dump 的结果,有 2 个函数在运行,分别是 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'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-