自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 问答 (1)
  • 收藏
  • 关注

原创 ipfix

IPFIX技术组网  IPFIX 是基于“流”的概念,一个流是指,来自相同的子接口,有相同的源和目的IP 地址,协议类型,相同的源和目的协议端口号,以及相同ToS 的报文,通常为5 元组。IPFIX 会记录这个流的统计信息,包括:时间戳,报文数,总的字节数。IPFIX 主要包括三个设备Export、Collector、Analyzer,三个设备之间的关系如下。  Export 对网络流进行分析处理,提取符合条件的流统计信息,并将统计信息输出Collector ;   Collector 负责解析

2022-06-15 11:20:42 807

原创 vpp policer and classify

cli example:configure policer name policy1 cir 800 cb 9000 rate kbps round closest type 1r2c conform-action transmit exceed-action drop classify table mask l3 ip4 src classify session policer-hit-next policy1 exceed-color table-index 0 match l3 ip4 s

2022-06-15 11:20:04 1825

原创 vpp flowprobe

介绍flowprobe plugin是vpp源码自带的插件,主要功能是flow信息上报,与vpp中的ipfix。简单的配置set ipfix exporter collector 10.87.45.7 src 10.248.161.144 template-interval 50 port 4739 path-mtu 1450配置flow_report_process(PROCESS类型的node),设置上报消息的目的地址,源地址,端口号,mtu等flowprobe params rec

2022-06-15 11:18:39 1098

原创 RSS/RPS/RFS究竟是个什么东西

RSS/RPS/RFS

2021-12-27 18:31:46 2116

原创 利用dpdk rte_ring实现进程间通信

进程间通信有很多方式,如果两个进程是在同一台机器上运行的,效率比较高的通信方式就是共享内存。关于共享内存的实现方式,双方可以通过mmap方式去映射到相同的内存上进而实现内存共享。DPDK实现的ring也可以帮助我们方便的实现高效率的进程间通信。具体方法如下。1.rte_ring需要与rte_mempool配合使用,通过rte_mempool来共享内存。2.primary进程通过rte_ring_create和rte_mempool_create分别创建ring和mempool。3.secon

2021-05-13 10:58:22 1538

原创 vpp给接口配置vlan id

和在linux给接口配置vlan一样,需要先创建一个子接口create sub-interfaces TenGigabitEthernet0/4/0 1010就是vlan id然后给这个子接口配置成ip,up之后就可以正常使用了set interface state TenGigabitEthernet0/4/0.10 upset interface ip address TenGigabitEthernet0/4/0.10 10.10.10.5/24创建完成之后,show int可

2021-05-08 15:42:00 2137

原创 dpdk ring如何实现无锁和零拷贝的

昨天参加了一个面试,面试官问我dpdk的ring是怎么解决冲突的,我当时回答的不好,现在来总结下~1.无锁的实现既然是解决冲突,肯定至少有两个生产者或者两个消费者,以两个生产者为例。core1和core2同时往ring中写入数据,对于core1来说,首先会在入队函数中定义局部变量prod_head和prod_next和cons_tail,prod_head由r->prod.head赋值,cons_tail由r->cons.tail赋值。在判断当前r还有无空间满足写入需求之后,会用

2021-04-16 16:12:49 2632

原创 vpp rte_mbuf和vlib_buffer_t的初始化以及数据如何在node之间传递

1.buffer pool的初始化1.1函数调用关系vlib_buffer_main_init-> vlib_buffer_main_init_numa_node-> vlib_buffer_pool_create1.2创建vlib_buffer_pool的过程每个numa节点都会创建一个pool,首先根据startup.conf文件中指定的num-mbufs值来确定要分配这些buffer,结合当前系统分配的巨页大小(1G或者2...

2021-04-07 18:32:09 2388 1

原创 dpdk uio驱动

关于dpdk的驱动层,一直以来都没有理的很清楚。一是因为本人不是开发驱动的,对驱动知识相当匮乏,二来用dpdk来开发,貌似也不需要过多关注底层驱动逻辑。但是这块不懂的话,总会感觉对dpdk一知半解的,不踏实。所以这篇博客就是通过查阅资料和阅读源码总结出来的,如有理解错误的地方还望各位指正。因为uio是对IO设备而言的,因此本博客中的设备指的是IO设备。1.linux设备驱动uio机制 大家都知道,linux操作系统分为两个层级,一个是内核态,一个是用户态。平时编写的软件都是运行在用户态...

2021-02-20 17:41:21 813

原创 vpp中dpdk接口注册流程分析

vpp是一个优秀的包处理转发框架,可以采用非常多的接口类型来进行收发包,应用最多的就是dpdk了,因此本篇博客主要探讨被dpdk接管的网卡是如何注册到vpp中的。vpp代码版本是1904.本文代码贴的比较少,只描述了一些函数调用关系,最好可以参照源码阅读。关于dpdk就不再赘述,简单的理解dpdk就是一个开发组件,提供了网卡驱动,可以接管原先由内核管理的网卡,实现kernel bypass。同时dpdk也提供了一些辅助机制,可以加快网卡报文的收发。而在vpp中,dpdk是作为一个插件来实现的。在编译vp

2021-02-03 16:55:38 2700 1

原创 关于对齐的一些问题探讨

无论是自己写代码,还是阅读一些开源的代码,总会遇到一些对齐问题,经过查阅资料和自己编程做的一些小实验,总结下关于对齐的那些事。我个人把对齐分为字节对齐和页对齐,下面依次讨论1.字节对齐首先我们来思考一下CPU是如何读取数据的。先明确一个问题,CPU不是按照字节来处理数据的,而是按照字长来处理数据的。所谓字长,就是CPU可以一次性读取的数据长度。假设CPU是32位的,那么CPU一次性就可以读取32位的数据。按照CPU的设计,读取的地址总是32的倍数开始。字节对齐问题和CPU架构以及编译器有

2021-01-27 16:35:18 626

原创 DPDK kni模块分析

相关背景dpdk缺少相应的协议栈,这提升了dpdk的入门门槛。如果我们采用dpdk来开发代码,当网卡被用户态驱动绑定之后,我们不仅需要处理业务报文,还需要对arp,ping,tcp握手等消息进行处理,对于笔者目前的一个业务场景(缺少协议栈,控制面和用户名共用一个网卡不同ip,数据面需要提升收包性能,因此采用了dpdk。为什么控制面和用户名不用两张网卡呢?产品经理决定的~)来说就比较头疼。幸运的是dpdk提供了kni模块,来解决相应的问题。这篇文章就是介绍dpdk的kni模块的实现机制。建议先阅读下dpd

2021-01-16 16:09:41 1335 2

原创 DPDK的meter库(双速率三色算法)

前面一篇讲了dpdk的单速率三色桶算法,这篇解析一下双速率三色桶。流程和单速率完全相同,区别在于数据结构以及颜色判断的逻辑上。仍然看色盲模式相比于单速率模式,我感觉双速率模式更好理解,有两个桶C和P以及两个令牌产生速率。两个桶同时跟随时间增加令牌数,超过容量则丢弃。报文速率如果介于cir和pir,超过cir部分的报文返回黄色,低于cir的返回绿色。报文速率超过pir,所有超过pir部分的报文都返回红色,介于cir和pir部门的返回黄色,低于cir的返回绿色报文速率低于cir,所有的报文绿色~

2020-08-29 13:10:53 1243

原创 DPDK的meter库(单速率三色算法)

DPDK提供了丰富的基础库,其中就有利用令牌桶来实现meter功能,可以参考例子中的qos_meter。这篇博客主要就是解读这个例子。令牌桶算法分为单速率三色算法和双速率单色算法,单速率只有一个速率桶C桶以及一个EBS。关注点在于报文的突发尺寸,双速率有两个速率桶C和P,更关注突发的报文速率。首先来看单速率三色,令牌产生的速率是cir,C桶容量为cbs,当C桶满时,再去添加E桶,E桶也满时,令牌丢弃。在取令牌时,先取C桶,C桶满足,不管E桶,E桶保持不变,C桶减少相应数量令牌返回绿色。C桶不满,

2020-08-29 11:18:26 1839

原创 centos安装性能监控工具Sysstat(源码安装)

关于Sysstat的介绍,网上有很多,就不在叙述,本篇博客主要讲如何用源码安装。首先可以在官网http://sebastien.godard.pagesperso-orange.fr/download.html或者是GitHubhttps://github.com/sysstat/sysstat下载源码下载完成后,解压,进入目录,分别执行./configure --disable-nlsmakemake install安装完成之后,敲入sar 2 5,如果有输出,表示安装成功。.

2020-08-20 19:37:25 1039

原创 各种排序算法耗时比较

我们知道,各个排序算法的时间复杂度从快速排序的nlogn到冒泡的n^2,但是即使时间复杂度相同,其具体的耗时也是不同的。今天就来实地测测每种算法到底耗时如何一号选手:冒泡排序。我们知道冒泡排序算的上是最慢的一种排序方法了#include<stdio.h>#include<stdlib.h>#include<memory.h>#include&lt...

2019-10-11 16:01:49 4201

原创 排序算法总结--树排序

树排序是利用搜索二叉树的性质来进行排序。我们知道,搜索二叉树的中序遍历输出就是一个有序的序列。所以我们可以根据跟定的一组元素,构造一个搜索二叉树。所以算法的就分为了两步:1.构造一个搜索二叉树 2.中序遍历输出来看代码实现首先我们创建一个搜索二叉树//二叉排序树节点的数据结构typedef struct b_node{ int value;//节点的值 ...

2019-08-31 11:39:36 3011

原创 排序算法总结--选择排序

选择排序和冒泡排序的思想比较像。冒泡排序的最里层循环结束后,最大的元素会“沉”到序列的最下面。我们是通过一次次的比较大小然后进行交换的方式实现的。那如果我们先找到整个序列最大的元素,然后直接将其放在序列的最后面(或者是先找到最小的元素,然后将其放在序列的最前面),也可以实现排序的目的。所以我们就得到了选择排序算法的核心思想1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。...

2019-08-29 15:26:06 183

原创 排序算法总结--希尔排序

希尔排序是一种改进的插入排序。前面我们讨论过插入排序在序列的大多数元素都是有序的情况下性能较好。所以希尔排序算法将原始的插入排序算法做了改进,每次比较不是相邻两个元素进行比较,而是隔几个元素之间进行比较,称为步长dk。通过不断缩小dk的值,逐步使得序列中元素有序。当dk缩小到1时,序列中的元素都已经基本有序,再进行插入排序就比较轻松了。算法步骤:1.选取合适的步长。可以选取元素个数的一半,...

2019-08-29 14:59:11 331

原创 排序算法总结--插入排序

插入排序,顾名思义就是将一个元素插入到适当的位置。其算法核心是1.将第一个元素看做是个单独的序列。显然,只有一个元素的序列肯定是有序序列。2.然后将和第二个元素做比较。如果第二个元素小,那么就将第二个元素插入到第一个元素前面,这样我们就得到了一个拥有两个元素的有序序列。3.依次扫描剩余元素,每扫描到一个元素,就将其插入到前面已经排好序的序列中。4.扫描完最后一个元素,插入到其适当的...

2019-08-29 14:09:19 135

原创 排序算法总结--快速排序

前面说的冒泡排序是一种交换排序。交换排序还有一种算法,就是快速排序算法。快速排序的核心思想是分而治之。意思就是选出一个基准(可以是第一个元素,也可以是最后一个。为了方便我们选取第一个),将小于这个基准的全部元素都放在这个基准的左边,大于这个基准的全部元素都放在基准的右边。然后分别对左右两个数组在进行同样的操作。这里我们就可以用到递归。也就是说我们每次进行上述操作后,都可以得到一个相对有序的数组...

2019-08-28 15:56:01 204

原创 排序算法总结--冒泡排序算法

假设排序要求是从小到大冒泡算法可以说是最直观,最简单的算法了。核心思想是让小的元素像气泡一样往数组“上面”移动。算法固定的三个步骤:* 1.外层循环决定比较的轮数: 数组长度-1(arr.length - 1)* 2.内层循环决定每一轮比较的次数 :内层循环次数 = 外层循环总次数-外层循环已经完成的次数(arr.length - 1 - i)* ...

2019-08-28 15:01:12 265

原创 DPDK的编译安装

最近在研究vpp+dpdk,此过程中遇到了不少问题,在此记录刚毕业的时候接手的第一个项目就是dpdk了。虽然这个项目在不久后就黄了,但我也通过这个项目对dpdk多多少少有些了解。以下概念借鉴了https://www.cnblogs.com/bakari/p/8404650.html这篇博客。dpdk是Intel提供个的一个开发套件。为 Intel 处理器架构下用户空间高效的数据包处理提...

2019-02-16 17:25:58 4612 4

原创 VPP的源码编译安装

最近在虚拟机上搞vpp的编译安装,遇到很多问题,先记录下来。。。。。。vpp编译一定要联网,切记!!!不联网的话一个个的依赖包会让你怀疑人生的。1.源码获取git clone https://gerrit.fd.io/r/vpp,获取当前最新代码2.安装各种软件依赖包源码获取后,假设放在/home目录下cd /home/vpp执行make后,会出现很多选项,先执行mk...

2019-02-16 16:24:55 2789 5

转载 5G系统-核心网架构、三个核心功能单元

5G核心网采用了SBA架构(Service Based Architecture),基于服务的设计理念,将4G原有网元功能拆分,形成网络上的各个服务提供者。使用这些服务的功能体称为消费者。核心网控制面各个功能之间采用http2.0协议。核心功能块有三个,AMF,SMF,UPF。(分别类似于4G中的MME,XGW,DP)AMF承载以下主要功能:接入和移动管理功能(AMF)包括以下功能。(...

2019-02-01 10:00:50 21828

原创 大小端问题

最近工作中碰到了大小端的问题,困扰了两天,记录一下避免以后走弯路。百度百科上记录:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高...

2018-11-09 10:59:01 646

原创 C语言中回调函数的使用

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。------百度百科 函数采用回调方式的好处       如果函数采用回调的方式,那么调用该函数的函数不需要知道该函数的实...

2018-10-30 14:56:38 1273

原创 C语言中select函数的使用

       一般用connect、accept、recv或recvfrom这类函数,程序阻塞,直至该套接字上接受到数据后程序才能继续运行。但是使用select函数可以实现非阻塞方式的程序。它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。Select的函数格式:int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_...

2018-10-29 20:25:56 6097

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除