CN103731364A - 基于x86平台实现万兆大流量快速收包的方法 - Google Patents
基于x86平台实现万兆大流量快速收包的方法 Download PDFInfo
- Publication number
- CN103731364A CN103731364A CN201410021519.8A CN201410021519A CN103731364A CN 103731364 A CN103731364 A CN 103731364A CN 201410021519 A CN201410021519 A CN 201410021519A CN 103731364 A CN103731364 A CN 103731364A
- Authority
- CN
- China
- Prior art keywords
- packet
- kernel
- network interface
- address
- interface card
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明涉及一种基于X86平台实现万兆大流量快速收包的方法,其中包括设置支持多队列的网卡收包队列的CPU亲和性;修改内核中数据包的传入地址为收包内核态模块;将数据包向内核协议栈进行传输;所述的收包内核态模块通过地址映射机制将内核队列地址映射到用户态;所述的用户态收取数据包。采用该种基于X86平台实现万兆大流量快速收包的方法,主要解决了传统收包的不足和性能瓶颈,采用网卡RSS技术、内核动态module挂载、零拷贝技术和无锁RingBuffer技术,实现在大流量的环境和基于X86的平台上,快速不丢的将流量从网卡内核空间收到用户进程空间,适用于需要提取流量的局域网或广域网以及各运营商流量出口,具有广泛的应用范围。
Description
技术领域
本发明涉及网络技术领域,尤其涉及大流量收包领域,具体是指一种基于X86平台实现万兆大流量快速收包的方法。
背景技术
网络的飞速发展,使得网络应用越来越多,流量越来越大,传统的千兆逐步被万兆替代,如何将如此大的流量实时收取下来以供后续的分析挖掘使用,成为了当今一个热点研究课题
现有基本的收包技术都是基于Libpcap(分组捕获函数库)和Socket(插座)封装而来,优点是开发快,易于上手,缺点则是在大流量的情况下,收包所占资源多,而往往由于收包流程所耗费的资源庞大,导致处理的性能下降,丢包、来不及收包的情况常常发生,传统的收包方式已经远远不能满足大流量的需求了。
发明内容
本发明的目的是克服了上述现有技术的缺点,提供了一种能够实现在大流量的环境和基于X86的平台上、快速不丢的将流量从网卡内核空间收到用户进程空间、适用于大规模推广应用的基于X86平台实现万兆大流量快速收包的方法。
为了实现上述目的,本发明的基于X86平台实现万兆大流量快速收包的方法具有如下构成:
该基于X86平台实现万兆大流量快速收包的方法,其主要特点是,所述的方法包括以下步骤:
(1)设置支持多队列的网卡收包队列的CPU亲和性;
(2)修改内核中数据包的传入地址为收包内核态模块;
(3)将数据包向内核协议栈进行传输;
(4)所述的收包内核态模块通过地址映射机制将内核队列地址映射到用户态;
(5)所述的用户态收取数据包。
较佳地,所述的设置支持多队列的网卡收包队列的CPU亲和性,具体为:
通过系统Proc文件设置支持多队列的网卡收包队列的CPU亲和性。
较佳地,所述的修改内核中数据包的传入地址为收包内核态模块,包括以下步骤:
(21)所述的支持多队列的网卡收包发生硬中断,进入网卡中断处理函数;
(22)网卡中断处理函数将数据包传输到内核空间,同时发生软中断;
(23)调用软中断处理函数进行数据包的获取以及前期判断工作;
(24)修改数据包的传入地址为收包内核态模块。
更佳地,所述的网卡中断处理函数将数据包传输到内核空间,具体为:
网卡中断处理函数将数据包以直接存储器存取方式传输到内核空间。
较佳地,所述的收包内核态模块通过地址映射机制将内核队列地址映射到用户态,包括以下步骤:
(41)注册收包内核态模块地址函数;
(42)数据包到达收包内核态模块地址函数并进入过滤器进行过滤;
(43)通过过滤器过滤后的数据包进行Hash分流到达不同的内核队列;
(44)内核队列地址通过地址映射机制直接映射到用户态。
较佳地,所述的用户态收取数据包,具体为:
所述的用户态通过无锁RingBuffer结构的内存收取数据包。
更佳地,所述的用户态通过无锁RingBuffer结构的内存收取数据包,包括以下步骤:
(51)内核态采用Kmalloc函数申请无锁RingBuffer结构的内存;
(52)对整块内存进行内存块分割且在内存的第一块存放公用信息;
(53)每当有数据写入内存时,通过取第一块内存中的写位置指针和读位置指针判断此次写入的内存节点位置;
(54)写入数据后,将所对应的内存节点信息进行更新并将写位置指针向后移动;
(55)每当从内存收取数据时,通过取第一块内存中读位置指针来获取待收取的内存节点并通过该内存节点的状态信息标志位判断是否有数据可读。
采用了该发明中的基于X86平台实现万兆大流量快速收包的方法,具有如下有益效果:
本专利主要解决了传统收包的不足和性能瓶颈,采用网卡RSS技术、内核动态module挂载、零拷贝技术和无锁RingBuffer技术,实现在大流量的环境和基于X86的平台上,快速不丢的将流量从网卡内核空间收到用户进程空间,适用于需要提取流量的局域网或广域网以及各运营商流量出口,具有广泛的应用范围。
附图说明
图1为本发明的基于X86平台实现万兆大流量快速收包的方法的流程图。
图2为本发明的数据传输流程图。
图3为本发明的收包内核态模块的工作流程图。
图4为本发明的无锁Ringbuffer结构的内存的工作流程图。
具体实施方式
为了能够更清楚地描述本发明的技术内容,下面结合具体实施例来进行进一步的描述。
1、使用支持多队列(RSS)特性网卡,来提升性能。普通网卡亦可,只是普通网卡一般用在低流量的环境中。
2、网卡支持多队列,通过系统设置网卡收包队列的CPU亲和性,设置CPU的亲和性一般通过系统Proc文件完成。系统文件路径/proc/irq/中断号/smp_affinity。
3、通过上述两步,则实现了收包队列的软中断的平均分配,相比以前普通的收包方式,数据包的软中断一般都集中在CPU0上,往往数据量大的时候,CPU0的使用都在100%,导致0号CPU很忙,而其他CPU空闲的状态,效率大大降低。
4、修改内核,加入收包内核态模块的入口地址。
5、装载收包内核态模块(Rsspacket),该模块实现数据包从内核态到用户态的映射,以及高速收取算法的实现。
6、以上两步实现数据包的高速收取,为本发明的核心。整体数据传输流程见图2。
下面详细介绍实现技术点:
7、针对内核的修改,主要是为了减少包进入协议栈后系统的开销。具体实现方式为:
(1)网卡收包发生硬中断,中断产生后,进入网卡中断处理函数;
(2)网卡中断处理函数将数据包DMA(Direct memory access,直接存储器收取)到内核空间,同时产生软中断;
(3)内核软中断产生,调用软中断处理函数,进行数据包的获取以及一些前期判断工作;
(4)数据包向内核协议栈传递,我们在该步传递之前,修改数据包的传入地址为发明中的收包内核态模块,这样在网卡DMA数据后,直接进入发明中的收包内核态模块(Rsspacket),如此则直接摒弃掉了繁琐的协议栈流程和内核的开销流程,大大节省系统资源和提高速度。
8、收包内核态模块(Rsspacket)工作流程如下(流程见图3):
(1)注册收包内核态模块地址函数;
(2)数据包到达收包地址函数,进行简单的包头分析,进入Filter(过滤器)判断,该Filter可以通过加载模块时进行配置,主要实现数据包的过滤功能;
(3)通过filter过滤后的数据包在进行Hash分流(哈希分流算法)到达不同的内核队列;
(4)内核队列地址通过内存映射(MMAP,Memory Map)直接映射到用户态,该块内存使用块状内存结构,内核负责申请,内存结构为高速无锁RingBuffer(环形缓冲区)结构。
9、高速无锁RingBuffer结构的描述如下(流程见图4):
(1)内存按模块加载时传入参数初始化,默认256MB。该内存采取Kmalloc(内存分割函数)在内核态申请;
(2)对整块内存采取内存块分割的策略。每个内存块为固定的长度,包括但不仅包括读写指针、数据段、一些标志位(如读写完成、可重写、读过快等);
(3)内存的第一块永远不放数据,存放当前的公用信息,如当前读位置、写位置、内存块数、每块内存大写等。读写位置指针占用不同的存储空间,读写程序进行该块内存读写时,永远取各自的读写位置,互不影响,无需加锁;
(4)每当数据写入内存时,通过取第一块内存中写位置指针和读位置指针,来判断该次写入的内存节点位置,写入后,进行内存节点信息的更新,包括该块可读,然后将写指针往后移动。该操作采用原子操作,防止被系统中断打断;
(5)每当读数据时,通过取第一块内存中读位置指针位置,来获取收取的内存节点,同时通过读写指针判断是否有数据可读,通过内存节点的状态信息标志位判断是够数据可读。通过以上完成数据的收取。
由于是环形缓冲,必将有读写重合或速率不一致导致的读写指针问题,在该发明中,我们将读写指针永远的只加不置位,在读写阶段,通过判断两个指针的大写即可完成环形缓冲的置换工作,如读指针应该永远小于写指针才有数据可读,写指针应该不大于读指针整个内存块数的情况下才不会过快写入数据,导致数据丢失等情况。
如图1所示,本发明的实现万兆大流量快速收包的方法包括以下步骤:
(1)设置支持多队列的网卡收包队列的CPU亲和性;
(2)修改内核中数据包的传入地址为收包内核态模块;
具体包括以下四个子步骤:
(21)所述的支持多队列的网卡收包发生硬中断,进入网卡中断处理函数;
(22)网卡中断处理函数将数据包传输到内核空间,同时发生软中断;
(23)调用软中断处理函数进行数据包的获取以及前期判断工作;
(24)修改数据包的传入地址为收包内核态模块。
(3)将数据包向内核协议栈进行传输;
(4)所述的收包内核态模块通过地址映射机制将内核队列地址映射到用户态;
具体包括以下四个子步骤:
(41)注册收包内核态模块地址函数;
(42)数据包到达收包内核态模块地址函数并进入过滤器进行过滤;
(43)通过过滤器过滤后的数据包进行Hash分流到达不同的内核队列;
(44)内核队列地址通过地址映射机制直接映射到用户态。
(5)所述的用户态收取数据包。
具体包括以下五个子步骤:
(51)内核态采用Kmalloc函数申请无锁RingBuffer结构的内存;
(52)对整块内存进行内存块分割且在内存的第一块存放公用信息;
(53)每当有数据写入内存时,通过取第一块内存中的写位置指针和读位置指针判断此次写入的内存节点位置;
(54)写入数据后,将所对应的内存节点信息进行更新并将写位置指针向后移动;
(55)每当从内存收取数据时,通过取第一块内存中读位置指针来获取待收取的内存节点并通过该内存节点的状态信息标志位判断是否有数据可读。
采用了该发明中的基于X86平台实现万兆大流量快速收包的方法,具有如下有益效果:
本专利主要解决了传统收包的不足和性能瓶颈,采用网卡RSS技术、内核动态module挂载、零拷贝技术和无锁RingBuffer技术,实现在大流量的环境和基于X86的平台上,快速不丢的将流量从网卡内核空间收到用户进程空间,适用于需要提取流量的局域网或广域网以及各运营商流量出口,具有广泛的应用范围。
在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。
Claims (7)
1.一种基于X86平台实现万兆大流量快速收包的方法,其特征在于,所述的方法包括以下步骤:
(1)设置支持多队列的网卡收包队列的CPU亲和性;
(2)修改内核中数据包的传入地址为收包内核态模块;
(3)将数据包向内核协议栈进行传输;
(4)所述的收包内核态模块通过地址映射机制将内核队列地址映射到用户态;
(5)所述的用户态收取数据包。
2.根据权利要求1所述的基于X86平台实现万兆大流量快速收包的方法,其特征在于,所述的设置支持多队列的网卡收包队列的CPU亲和性,具体为:
通过系统Proc文件设置支持多队列的网卡收包队列的CPU亲和性。
3.根据权利要求1所述的基于X86平台实现万兆大流量快速收包的方法,其特征在于,所述的修改内核中数据包的传入地址为收包内核态模块,包括以下步骤:
(21)所述的支持多队列的网卡收包发生硬中断,进入网卡中断处理函数;
(22)网卡中断处理函数将数据包传输到内核空间,同时发生软中断;
(23)调用软中断处理函数进行数据包的获取以及前期判断工作;
(24)修改数据包的传入地址为收包内核态模块。
4.根据权利要求3所述的基于X86平台实现万兆大流量快速收包的方法,其特征在于,所述的网卡中断处理函数将数据包传输到内核空间,具体为:
网卡中断处理函数将数据包以直接存储器存取方式传输到内核空间。
5.根据权利要求1所述的基于X86平台实现万兆大流量快速收包的方法,其特征在于,所述的收包内核态模块通过地址映射机制将内核队列地址映射到用户态,包括以下步骤:
(41)注册收包内核态模块地址函数;
(42)数据包到达收包内核态模块地址函数并进入过滤器进行过滤;
(43)通过过滤器过滤后的数据包进行Hash分流到达不同的内核队列;
(44)内核队列地址通过地址映射机制直接映射到用户态。
6.根据权利要求1所述的基于X86平台实现万兆大流量快速收包的方法,其特征在于,所述的用户态收取数据包,具体为:
所述的用户态通过无锁RingBuffer结构的内存收取数据包。
7.根据权利要求6所述的基于X86平台实现万兆大流量快速收包的方法,其特征在于,所述的用户态通过无锁RingBuffer结构的内存收取数据包,包括以下步骤:
(51)内核态采用Kmalloc函数申请无锁RingBuffer结构的内存;
(52)对整块内存进行内存块分割且在内存的第一块存放公用信息;
(53)每当有数据写入内存时,通过取第一块内存中的写位置指针和读位置指针判断此次写入的内存节点位置;
(54)写入数据后,将所对应的内存节点信息进行更新并将写位置指针向后移动;
(55)每当从内存收取数据时,通过取第一块内存中读位置指针来获取待收取的内存节点并通过该内存节点的状态信息标志位判断是否有数据可读。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410021519.8A CN103731364B (zh) | 2014-01-16 | 2014-01-16 | 基于x86平台实现万兆大流量快速收包的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410021519.8A CN103731364B (zh) | 2014-01-16 | 2014-01-16 | 基于x86平台实现万兆大流量快速收包的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103731364A true CN103731364A (zh) | 2014-04-16 |
CN103731364B CN103731364B (zh) | 2017-02-01 |
Family
ID=50455297
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410021519.8A Active CN103731364B (zh) | 2014-01-16 | 2014-01-16 | 基于x86平台实现万兆大流量快速收包的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103731364B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106713462A (zh) * | 2016-12-26 | 2017-05-24 | 郑州云海信息技术有限公司 | 一种网络数据包处理方法和装置 |
CN106953774A (zh) * | 2016-01-07 | 2017-07-14 | 无锡聚云科技有限公司 | 一种基于用户自定义的网络抓包系统 |
CN110602225A (zh) * | 2019-09-19 | 2019-12-20 | 北京天地和兴科技有限公司 | 一种适用于工控环境的linux系统高效收发包方法 |
US10929179B2 (en) | 2016-03-24 | 2021-02-23 | Huawei Technologies Co., Ltd. | Scheduling method and electronic device |
CN116527690A (zh) * | 2023-05-04 | 2023-08-01 | 奇安信科技集团股份有限公司 | 一种流量镜像方法及装置 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2004180092A (ja) * | 2002-11-28 | 2004-06-24 | Sony Corp | 情報処理装置および情報処理方法、並びにコンピュータ・プログラム |
CN101114991B (zh) * | 2006-07-27 | 2012-06-13 | 北京左江科技有限公司 | 一种基于以太网实现数据流高速比对的方法 |
CN101150488B (zh) * | 2007-11-15 | 2012-01-25 | 曙光信息产业(北京)有限公司 | 一种零拷贝网络报文接收方法 |
CN103441941A (zh) * | 2013-08-13 | 2013-12-11 | 广东睿江科技有限公司 | 一种基于Linux的高性能数据报文捕获方法和装置 |
-
2014
- 2014-01-16 CN CN201410021519.8A patent/CN103731364B/zh active Active
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106953774A (zh) * | 2016-01-07 | 2017-07-14 | 无锡聚云科技有限公司 | 一种基于用户自定义的网络抓包系统 |
US10929179B2 (en) | 2016-03-24 | 2021-02-23 | Huawei Technologies Co., Ltd. | Scheduling method and electronic device |
CN106713462A (zh) * | 2016-12-26 | 2017-05-24 | 郑州云海信息技术有限公司 | 一种网络数据包处理方法和装置 |
CN110602225A (zh) * | 2019-09-19 | 2019-12-20 | 北京天地和兴科技有限公司 | 一种适用于工控环境的linux系统高效收发包方法 |
CN116527690A (zh) * | 2023-05-04 | 2023-08-01 | 奇安信科技集团股份有限公司 | 一种流量镜像方法及装置 |
CN116527690B (zh) * | 2023-05-04 | 2024-02-13 | 奇安信科技集团股份有限公司 | 一种流量镜像方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN103731364B (zh) | 2017-02-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105577567A (zh) | 基于Intel DPDK的网络数据包并行处理方法 | |
CN101267361B (zh) | 一种基于零拷贝技术的高速网络数据包捕获方法 | |
CN103731364A (zh) | 基于x86平台实现万兆大流量快速收包的方法 | |
US9280297B1 (en) | Transactional memory that supports a put with low priority ring command | |
WO2022225639A1 (en) | Service mesh offload to network devices | |
CN102904729B (zh) | 根据协议、端口分流支持多应用的智能加速网卡 | |
CN102761489B (zh) | 基于流水线模式的数据包零拷贝的核间通信方法 | |
CN101827072A (zh) | 虚拟内存协议分段卸载 | |
CN106648896B (zh) | 一种Zynq芯片在异构称多处理模式下双核共享输出外设的方法 | |
CN106951388A (zh) | 一种基于PCIe的DMA数据传输方法及系统 | |
US11496419B2 (en) | Reliable transport offloaded to network devices | |
JP6763984B2 (ja) | インフィニバンド(IB)上で仮想ホストバスアダプタ(vHBA)を管理およびサポートするためのシステムおよび方法、ならびに単一の外部メモリインターフェイスを用いてバッファの効率的な使用をサポートするためのシステムおよび方法 | |
CN104394096A (zh) | 一种基于多核处理器的报文处理方法及多核处理器 | |
CN104461979A (zh) | 基于环形总线的多核片上通信网络实现方法 | |
CN109062857B (zh) | 一种能高速实现多处理器间通信的新型消息控制器及其通信方法 | |
CN103885900B (zh) | 数据访问处理方法、PCIe设备和用户设备 | |
CN110519180A (zh) | 网卡虚拟化队列调度方法及系统 | |
CN103916316A (zh) | 网络数据包线速捕获方法 | |
CN104102550A (zh) | 一种多主机进程间通信的方法 | |
CN116501657B (zh) | 缓存数据的处理方法、设备及系统 | |
CN103942149B (zh) | 用户态程序与内核交互报文的方法及系统 | |
CN103064749A (zh) | 一种进程间通信方法 | |
US11176064B2 (en) | Methods and apparatus for reduced overhead data transfer with a shared ring buffer | |
CN111831596A (zh) | 一种rtos串口网络传输方法及装置 | |
CN102299861B (zh) | 一种报文流量控制方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20170815 Address after: KIC Business Center No. 433 Shanghai 200433 Yangpu District Shanghai Road No. 6 building 11 layer Patentee after: SHANGHAI CERTUSNET INFORMATION TECHNOLOGY CO., LTD. Address before: 210042 Xuanwu District, Xuanwu District, Jiangsu, Nanjing, No. 699-22, building 18 Patentee before: CERTUSNET CORP. |