DPDK之CPU初始化过程总结

本文基于DPDK-17.05.2分析总结

函数调用过程:

Main----rte_eal_init----rte_eal_cpu_init----eal_cpu_detected
                               -----eal_cpu_core_id
                               -----eal_cpu_socket_id

CPU探测:
以RTE_MAX_LCORE循环进入/sys/devices/system/cpu/cpu目录判断CPU是否在位并赋值给全局数组lcore_config[lcore_id].detected,,若在位则赋值&rte_config->lcore_role[lcore_id]=
ROLE_RTE使能,不在位则赋值为ROLE_OFF;
#define RTE_MAX_LCORE 128
#define RTE_MAX_NUMA_NODES 8
在这里插入图片描述在这里插入图片描述
取出/sys/devices/system/cpu/cpu x/topology/core_id相应的core_id,进入/sys/devices/system/node/node0/cpu x返回socket_id,并保存在lcore_config[RTE_MAX_LCORE]全局数组中,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
CPU核绑定:
目的:增加CPU缓存的命中率
CPU之间是不共享缓存的,如果进程频繁的在各个CPU间进行切换,需要不断的使旧CPU的cache失效。如果进程只在某个CPU上执行,则不会出现失效的情况。在多个线程操作的是相同的数据的情况下,如果把这些线程调度到一个处理器上,大大的增加了CPU缓存的命中率。但是可能会导致并发性能的降低。如果这些线程是串行的,则没有这个影响。
dpdk启动时会建立会分析系统的逻辑核属性建立映射表并统一管理,每个核主要属性如下.
每个核属性包括逻辑核id,硬核id,numa节点id。dpdk会根据系统默认状态生成一一绑定的映射表,用户可以根据需求更改映射表,后续dpdk框架会根据该映射表进行核绑定。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
多核调度框架
1)服务器启动时选取一个逻辑核做主核
2)然后启动其他核做从核
3)所有线程都根据映射表做核绑定
4)控制核主要完成pci,内存,日志等系统的初始化
5)从核启动后等待主核初始化完毕后挂载业务处理入口
6)从核运行业务代码
为每一个SLAVE核创建线程,并调用eal_thread_set_affinity()绑定cpu。线程的执行体是eal_thread_loop()。eal_thread_loop()的主体是一个while死循环,调用不同模块注册到lcore_config[lcore_id].f的回调函数。
不同的模块需要调用rte_eal_mp_remote_launch(),将自己的回调处理函数注册到lcore_config[].f中。以l2fwd为例,注册的回调处理函数是l2fwd_launch_on_lcore()。
在这里插入图片描述
DPDK每个核上的线程最终会调用eal_thread_loop()----l2fwd_launch_on_lcore(),调用到自己实现的处理函数。
lcore指的是EAL线程,就是一个真正的linux/freeBSD线程。EAL创建和管理eal线程,且通过remote_launch来实现任务分配。在每个EAL线程中,有一个称为_lcore_id TLS是线程的独一无二的id。一般EAL线程使用1:1来绑定物理cpu,_lcore_id通常等于CPU id。
当使用多线程时,绑定不再在线程和指定物理cpu之间总是1:1,EAL线程设为对cpu集的亲和性,而_lcore_id不再和CPU id一样。因为这个,有一个EAL选项-lcores,设置lcore的cpu亲和性。对于指定lcore ID或者是ID组,这个选项允许对EAL线程设置CPU集。
格式模板:-lcores=lcores=’<lcore_set>[@cpu_set][,<lcore_set>[@cpu_set],…]’
lcore_set 和cpu_set可以是一个数,范围或者是组。数必须是“digit([0-9]+)”,范围则是“-”,组则是“(<number|range>[,<number|range>,…])”。
如果@cpu_set的值没有提供,则默认将其设为lcore_set相同的值。
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值