标签:time 分布 ESS 线程创建 上层 多线程 span fun 函数
VPP——可编程网络
众多产业正在提供更加软件化的网络服务,在这个环境中提供网络服务是亟待解决的问题。必需但是不足的是需要更多关注非本地的网络控制平面,需要更灵活、高效的数据以及路径交互平面。
VPP所具有的重要特点:灵活性,可维护性和高度的调试性,可提供高性能扩展性和高效IO
vpp的函数调用更像是一种各个节点之间相互连接,通过决定下一跳节点的路径在确定整个代码的执行路径。同样这种方式的函数调用提供了很低的耦合性,所以基于这种方式的二次开发不用太多考虑各个模块之间的相互影响,甚至可以完全不用考虑,自己定义的节点根据格式给出相应的回调函数来插入自定义的功能,下面是一个简单转发的node调用图。
可以看到,在转发的过程中如果要加入自己的上层业务只需要定义新的节点,将其连接到对应位置,并不会影响到其他部分的封装。
VLIB_NODE_TYPE_PRE_INPUT:目前只有一个epoll node,对socket相关逻辑提供服务,主要使用在控制业务上。
VLIB_NODE_TYPE_INTERNAL:对数据包真正处理业务的node。
VLIB_NODE_TYPE_INPUT:收包逻辑node,比如:dpdk,pcap等
VLIB_NODE_TYPE_PROCESS:该类型的node可以被挂起也可以被恢复,有独立的分配在heap上的运行栈。类似与在一个线程中实现了多任务的调度机制,主要用来修改vpp node内部参数。
1.单线程
所有的控制和矢量数据包的运行都在单线程中完成。
2.只有worker的多线程(使用RSS更方便)
main线程负责控制信息(API,CLI)。
矢量数据包运行在一个或者多个线程上。
3.有io和worker的多线程
main线程负责控制信息(API,CLI)。
IO线程处理接口输入并调度数据包到worker线程。
worker线程做包括TX接口在内的真正的业务。
4.有worker的多线程并且main线程做io
main线程同时做了IO线程所做的事(管理调度worker线程)。
对于线程来说初始化时按照配置文件循环绑定到指定的核上并且分配其rx和tx队列vnet_hw_interface_assign_rx_thread,可以通过show threads查看状态,show dpdk interface placement查看线程绑定网卡的队列,同样也可以使用set dpdk interface placement 网卡 队列 线程,来改变其默认的绑定状态。
关于多线程的代码主要分布在两个部分:
所有的线程都是调用的同一个函数,只需要改变它的结构体中的内容就可以区分,所以基于vpp的开发也不需要考虑线程关系问题。
vpp/vnet main.c
vilb_unix_mian
thread0->vlib_main
vlib_main_loop
标签:time 分布 ESS 线程创建 上层 多线程 span fun 函数
原文地址:https://www.cnblogs.com/zhangtiezi/p/9120940.html