1.背景

目前收包存在的问题:
第一:inpterrupt livelock, 当收到包的时候,网卡驱动程序就会产生一次中断。在大流量的情况下,操作系统将花费大量时间用于处理中断,而只有
少量的时间用于其他任务。
第二:将包从网卡移动到用户层花费的时间太久。
 
2.PF_RING的目标
1. 充分利用 device polling 机制 
2. 减少内核开销,开辟一条新的通道将收包从网卡传输到用户态
 
其架构图如下:
 
PF_RING实现功能如下:
1. 创建一种新的套接字类型 PF_RING, 用于将收包拷贝到一个环形缓冲区
2. 环形缓冲区和PF_RING套接字一同创建和销毁,各个缓冲区为套接字私有
3.如果一个网卡适配器被PF_RING套接字利用系统调用bind()绑定,这个网卡只能用于只读直到套接字销毁
4.对于PF_RING套接字,收包将会被拷贝到套接字缓冲区或被丢包
5.套接字缓冲区将会利用mmap功能
6.用户态程序通过mmap()系统调用访问套接字缓冲区
7.内核拷贝包到环形队列并移动写指针,用户态程序读包并移动读指针
8.新来的包将会覆盖原有包,因此不需要进行内存的分配和释放
9.套接字的缓冲区的长度和桶大小可被用户配置
 
3.实验效果
使用PF_RING之前:
 
使用PF_RING之后:
以上依然有丢包主要是因为用户态程序阻塞在poll(),可通过内核补丁优化。
 
 
4.PF_RING 模式1和2的实现
处理流程图:
 

5.关键路径
函数igb_clean_rx_irq的内部实现:
第8080行函数nap_gro_receice实际上是一个宏:
#define napi_gro_receive(_napi, _skb) netif_receive_skb(_skb)
函数netif_receive_skb分析分组类型,以便根据分类类型将分组传递到网络层的接收函数,为此该函数遍历所有可能负责当前
分组类型的所有网络层函数,这样的话就将包发送至了内核协议栈。而第8075行的函数pf_ring_handle_skb函数将调用PF_RING的注册函数进行处理。
 
 
6.考虑方案
在函数igb_clean_rx_irq增加包过滤函数,UDP且端口53发送至PF_RING处理,而其余包走内核协议栈。
 
7.需要考虑的问题
  • 修改网卡驱动且需要维护多个网卡驱动
  • 性能上不一定能到达DPDK的效果,因为DPDK丢弃了无关包
  • PF_RING的发包需要使用DNA技术,而此功能需要费用。如果不使用DNA,发包将会走协议栈
  • PF_RING是否对驱动进行了优化
备注:DNA功能和普通PF_RING比较减少一次内存拷贝
 
 
8.待做实验
实验目的:验证模式0,1,2之间的差异
 
参考文献:
Improving Passive Packet Capture: Beyond Device Polling - Luca Deri 
 
 
 
 
 
 
 

PF_RING 总结的更多相关文章

  1. 关于PF_RING/Intel 82599/透明VPN的一些事

    接近崩溃的边缘,今天这篇文章构思地点在医院,小小又生病了,宁可吊瓶不吃药,带了笔记本却无法上网,我什么都不能干,想了解一些东西,只能用3G,不敢 开热点,因为没人给我报销流量,本周末我只有一天时间,因 ...

  2. PF_RING安装

    1.安装Build-essential.SVN.Flex.Libnuma-dev.bison ubuntu中:sudo apt-get install build-essential subversi ...

  3. PF_RING 实验

    前提:pf_ring.ko 运行在模式2    收包实验:        使用两台机器同时对装PF_RING的机器进行发包,此机器的网卡流量达到14M的效果.如下所示:     上图为PF_RING自 ...

  4. PF_RING packet overwrites

    最近在用 PF_RING 抓包过程中,发现个灵异的现象,高流量丢包时, 经常会出现正在处理的包的内容被覆盖.开始,怀疑是不是自己程序有地方越界写了,后来发现,如果自己拷贝一份,然后处理拷贝的那份,永远 ...

  5. 大约PF_RING/Intel 82599/透明VPN一些事

    接近崩溃的边缘,如今,在医院这篇文章地方的想法,小病,我宁愿不吃药瓶.一台笔记本电脑,但无法上网,我不称职.想知道的东西.唯一可用3G,不开的热点.由于没人给我报销流程.这个周末,我只有一天,由于下雨 ...

  6. CentOS 6.5 安装Suricata(with PF_RING & CUDA)

    0.基础包 确保已安装 yum install mpfr cpp ppl cloog-ppl gcc kernel-devel pcre-devel libpcap-devel yum-plugin- ...

  7. CenOS 用PF_RING优化Snort

    0.优化顺序 安装PF_RING的kernel模块 安装PF_RING的用户态库 安装Snort的DAQ 安装PF_RING的pfring-daq-module 安装snort 安装PF_RING-a ...

  8. 【转】CentOS安装PF_RING(虚拟机)

    1.       概述 PF_RING是Luca Deri发明的提高内核处理数据包效率,并兼顾应用程序的补丁,如Libpcap和TCPDUMP等,以及一些辅助性程序(如ntop查看并分析网络流量等). ...

  9. PF_RING install in centos7

    很多centos7是最小化安装. 这样很多kernel就没有安装全,而且很多开发库也没有. 在安装PF_RING过程中,会缺少很多依赖. 首先安装依赖包: yum -y install numactl ...

随机推荐

  1. [转]SVN-版本控制软件

    一.版本控制软件 1.为什么需要版本控制软件 问题:① 团队开发 ② 异地协作 ③ 版本回退 2.解决之道 SCM(Software Configuration Management):软件配置管理 ...

  2. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

  3. bootstrap风格的multiselect插件——类似邮箱收件人样式

    在开发颗粒云邮箱的过程中,遇到了一个前端的问题,就是邮箱收件人的那个multiselect的input输入框.不仅能够多选,还要能够支持ajax搜索,把联系人搜索出来.就是类似下面的这个东西: 网上找 ...

  4. 【小错误】起归档是遇到ORA-00265: instance recovery required, cannot set ARCHIVELOG mode

    今天在起归档时遇到ORA-00265: instance recovery required, cannot set ARCHIVELOG mode的错误 从错误我们能够看到是由于datafile,c ...

  5. 应用OpenCV进行OCR字符识别

    opencv自带一个字符识别的例子,它的重点不是OCR字符识别,而主要是演示机器学习的应用.它应用的是UCI提供的字符数据(特征数据). DAMILES在网上发布了一个应用OpenCV进行OCR的例子 ...

  6. 华为OJ平台——字符串匹配

    题目描述: 判断短字符串中的所有字符是否在长字符串中全部出现 输入: 输入两个字符串. 第一个为短字符,第二个为长字符 输出: true  - 表示短字符串中所有字符均在长字符串中出现 false - ...

  7. Alfresco安装与配置图解

    Alfresco安装与配置图解 Alfresco是一款开源的企业内容管理系统(ECM),为企业提供了日常的文档管理.工作流(可以和企业目前的OA协同接合使用).工作记录管理.知识管理.网络内容管理.图 ...

  8. myeclipse的一些设置

    常用快捷键 Ctrl + Shift + R 搜索文件Ctrl + Shift + T 搜索类型Ctrl + O 搜索成员   智能提示 Windows > Preferences > G ...

  9. 使用py2exe打包你的py程序

    软件环境:python3.3.4 + PyQt5 使用py2exe打包写好的py文件,过程如下: 在你要打包的代码文件(比如sample.py)的同文件夹建立一个python代码文件(比如setup. ...

  10. 基于s5pv210嵌入式系统busybox文件系统移植

    基于s5pv210嵌入式系统busybox文件系统移植 1.下载源码 busybox.net/downloads下载最新版的busybox源码,最新源码为1.21.1 2.解压源码文件 tar xvf ...