VPP——可编程网络node
众多产业正在提供更加软件化的网络服务,在这个环境中提供网络服务是亟待解决的问题。必需可是不足的是须要更多关注非本地的网络控制平面,须要更灵活、高效的数据以及路径交互平面。编程
VPP所具备的重要特色:灵活性,可维护性和高度的调试性,可提供高性能扩展性和高效IO数组
vpp的函数调用更像是一种各个节点之间相互链接,经过决定下一跳节点的路径在肯定整个代码的执行路径。一样这种方式的函数调用提供了很低的耦合性,因此基于这种方式的二次开发不用太多考虑各个模块之间的相互影响,甚至能够彻底不用考虑,本身定义的节点根据格式给出相应的回调函数来插入自定义的功能,下面是一个简单转发的node调用图。网络
能够看到,在转发的过程当中若是要加入本身的上层业务只须要定义新的节点,将其链接到对应位置,并不会影响到其余部分的封装。多线程
VLIB_NODE_TYPE_PRE_INPUT:目前只有一个epoll node,对socket相关逻辑提供服务,主要使用在控制业务上。socket
VLIB_NODE_TYPE_INTERNAL:对数据包真正处理业务的node。函数
VLIB_NODE_TYPE_INPUT:收包逻辑node,好比:dpdk,pcap等oop
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 网卡 队列 线程,来改变其默认的绑定状态。
关于多线程的代码主要分布在两个部分:
1.在vlib/threads.c中,这部分主要是线程建立,复制一些结构体而且初始化。
2.在vnet/device/dpdk/thread.c中,定义线程名字、功能。
全部的线程都是调用的同一个函数,只须要改变它的结构体中的内容就能够区分,因此基于vpp的开发也不须要考虑线程关系问题。
vpp/vnet main.c
1.main 首先解析参数,再须要初始化堆,插件的初始化将由他提供。
2.vpe_main_init 初始化各类插件,经过宏函数VLIB_INIT_FUNCTION(X),能够经过遍历单链表、动态连接的方式指定不一样的初始化类型如早期的配置、功能等
3.调用 vilb_unix_main
vilb_unix_mian
thread0->vlib_main
vlib_main_loop