包含标签 upf 的文章

vpp编译分析

1. 下载源码 git clone http://192.168.9.105:60080/UPF/upf-vpp.git 2. 编译选项 1.make install-dep #install software dependencies 2.make wipe(wipe-release) #wipe all products 3.make build(build-release) #build binaries 4.make install-ext-deps #install external development dependencies(about dpdk) 5.make pkg-deb #build DEB packages 3. deb包 root@localhost:/home/ubuntu/work/upf-vpp# ll build-root/*.deb -rw-r--r-- 1 root root 184920 Jun 22 19:33 build-root/libvppinfra_19.08.1-21~g512cdac9c-dirty_amd64.deb -rw-r--r-- 1 root root 145112 Jun 22 19:33 build-root/libvppinfra-dev_19.08.1-21~g512cdac9c-dirty_amd64.deb -rw-r--r-- 1 root root 22456 Jun 22 19:33 build-root/python3-vpp-api_19.08.1-21~g512cdac9c-dirty_amd64.deb -rw-r--r-- 1 root root 3313088 Jun 22 19:33 build-root/vpp_19.……

阅读全文

vpp feature

1. 背景和概念 早期的VPP本身的node框架比较固定,各个node之间逻辑连接已经固化,为此新版本增加了feature机制. 每个feature是一个node,用户可以启用/停止某个或某些feature 用户也可以自己写插件,把自定义node(自己的业务逻辑)加入到指定位置 2. 重要数据结构和操作函数 # # vnet_feature_arc_registration_t # ---------------------------------- # vpp将feature分成不同的组,每组feature称为一个arc # arc中的feature按照代码指定的顺序串接起来 # arc结构将记录这组feature的起始node和结束node # 系统初始化时完成每个feature的连接 # vnet/feature/feature.h +38 /** feature registration object */ typedef struct _vnet_feature_arc_registration { /** next registration in list of all registrations*/ struct _vnet_feature_arc_registration *next; /** Feature Arc name */ char *arc_name; /** Start nodes */ char **start_nodes; int n_start_nodes; /** End of the arc (optional, for consistency-checking) */ char *last_in_arc; /* Feature arc index, assigned by init function */ u8 feature_arc_index; u8 *arc_index_ptr; } vnet_feature_arc_registration_t; # VNET_FEATURE_ARC_INIT宏用来注册arc # ---------------------------------- # 在arc中指定的起始node中,必须调用vnet_feature_arc_start函数, # 才能正式进入feature机制业务流程,该函数会将下一跳强行指定为arc中的下一个feature # 先初始化arc VNET_FEATURE_ARC_INIT (device_input, static) = { .……

阅读全文

基于VPP+DPDK开源框架开发UPF

DPDK DPDK是什么 DPDK全称为Date plane development kit,是一个用来进行包数据处理加速的软件库。 为什么DPDK 传统 Linux 内核网络数据流程: 硬件中断--->取包分发至内核线程--->软件中断--->内核线程在协议栈中处理包--->处理完毕通知用户层 用户层收包-->网络层--->逻辑层--->业务层 基于传统 OS 内核的数据处理的弊端: 中断处理。当网络中大量数据包到来时,会产生频繁的硬件中断请求,这些硬件中断可以打断之前较低优先级的软中断或者系统调用的执行过程,如果这种打断频繁的话,将会产生较高的性能开销。 内存拷贝。正常情况下,一个网络数据包从网卡到应用程序需要经过如下的过程:数据从网卡通过 DMA 等方式传到内核开辟的缓冲区,然后从内核空间拷贝到用户态空间,在 Linux 内核协议栈中,这个耗时操作甚至占到了数据包整个处理流程的 57.1%。 上下文切换。频繁到达的硬件中断和软中断都可能随时抢占系统调用的运行,这会产生大量的上下文切换开销。另外,在基于多线程的服务器设计框架中,线程间的调度也会产生频繁的上下文切换开销,同样,锁竞争的耗能也是一个非常严重的问题。 局部性失效。如今主流的处理器都是多个核心的,这意味着一个数据包的处理可能跨多个 CPU 核心,比如一个数据包可能中断在 cpu0,内核态处理在 cpu1,用户态处理在 cpu2,这样跨多个核心,容易造成 CPU 缓存失效,造成局部性失效。如果是 NUMA 架构,更会造成跨 NUMA 访问内存,性能受到很大影响。 内存管理。传统服务器内存页为 4K,为了提高内存的访问速度,避免 cache miss,可以增加 cache 中映射表的条目,但这又会影响 CPU 的检索效率。 如何改进: 控制层和数据层分离。将数据包处理、内存管理、处理器调度等任务转移到用户空间去完成,而内核仅仅负责部分控制指令的处理。这样就不存在上述所说的系统中断、上下文切换、系统调用、系统调度等等问题。 使用多核编程技术代替多线程技术,并设置 CPU 的亲和性,将线程和 CPU 核进行一比一绑定,减少彼此之间调度切换。 针对 NUMA 系统,尽量使 CPU 核使用所在 NUMA 节点的内存,避免跨内存访问。 使用大页内存代替普通的内存,减少 cache-miss。……

阅读全文

最近文章

分类

标签

友情链接

其它