发明内容
为了解决现有技术中的上述问题,即为了解决现有基于以太网的高速数据采集系统在采集和记录数据时CPU利用率低、系统兼容性差、封装和部署困难以及在数据带宽较高的情况下,系统传输可靠性低的问题,本发明第一方面,提出了一种用于高速数据采集系统的以太网数据流记录方法,所述高速采集系统由Linux操作系统、多块万兆网卡及高速NVMe固态硬盘构建,该方法包括:
步骤S100,Linux操作系统启动后,隔离出设定数量的CPU核心;
步骤S200,通过sysfs文件系统卸载所述Linux操作系统内核态网卡驱动,并创建hugepage内存池;对每一个万兆网卡,通过hugetlbfs文件系统分配其对应的数据接收缓存池及无锁FIFO缓存,并基于其对应的PCIE地址,通过sysfs文件系统对各万兆网卡PCIE寄存器进行初始化设置,使其进入采集状态;
步骤S300,创建多个工作线程并绑定至所述CPU核心,以用户态轮询的驱动方式对各万兆网卡采集的数据包进行连续接收及磁盘记录;所述工作线程包括数据接收线程和磁盘记录线程。
在一些优选的实施方式中,所述隔离出的CPU核心其至少保留Core0用于Linux操作系统内核线程调度。
在一些优选的实施方式中,步骤S200中“通过sysfs文件系统卸载所述Linux操作系统内核态网卡驱动,并创建hugepage内存池”,其方法为,通过sysfs文件系统下pci设备驱动目录中的unbind节点进行卸载,卸载完成之后在nr_hugepages节点设置hugepages数量,创建hugepage内存池。
在一些优选的实施方式中,步骤S200中“通过hugetlbfs文件系统分配其对应的数据接收缓存池及无锁FIFO缓存”,其方法为:使用mmap在hugetlbfs文件系统中分配各万兆网卡数据接收缓存池和无锁FIFO缓存空间。
在一些优选的实施方式中,步骤S200中“基于其对应的PCIE地址,通过sysfs文件系统对各万兆网卡PCIE寄存器进行初始化设置”其方法为:使用mmap对sysfs文件系统下pci设备资源节点resource0进行映射,并在该映射空间中对相关万兆网卡PCIE寄存器偏移地址内容进行读写;所述读写包括关闭万兆网卡中断、复位万兆网卡主控芯片、二次关闭中断、等待DMA初始化标志完成、复位数据接收环RX头指针RDH和尾指针RDT、填充各DMA描述单元物理地址、开启巨帧和混杂模式标志位。
在一些优选的实施方式中,步骤S300中“以用户态轮询的驱动方式对各万兆网卡采集的数据包进行连续接收”,其方法为:
步骤S310,各万兆网卡根据RX中DMA描述单元对应地址将采集的数据包通过PCIE总线传输至系统内存,并向前移动RDH,直至RX当前位置的DMA描述单元的STAT_DD标志位为1;
步骤S320,获取所述DMA描述单元对应数据包的虚拟地址,存入指针数组;并从hugepage内存池中申请新的数据包接收空间进行初始化,将新缓存的物理地址写入所述DMA描述单元;
步骤S330,循环执行步骤S310-步骤S320,直至达到设定的单次最大接收数量,当达到最大接收数量,执行步骤S340;
步骤S340,向前移动RDT,释放各万兆网卡的存储空间,并对所述指针数组对应数据包进行处理,将处理结果拷贝至无锁FIFO,拷贝完成后释放指针数组所对应的内存池空间;所述处理包括完整性检测、包头过滤。
在一些优选的实施方式中,所述磁盘记录其记录方法为:将无锁FIFO中的数据包取出,把单一连续数据流分为多个文件写入磁盘;当数据文件大小超过设定阈值时,关闭当前文件并创建新的数据文件进行写入。
本发明的第二方面,提出了一种用于高速数据采集系统的以太网数据流记录系统,该系统包括关闭隔离模块、网卡初始化模块、记录模块;
所述关闭隔离模块,配置为Linux操作系统启动后,隔离出设定数量的CPU核心;
所述网卡初始化模块,配置为通过sysfs文件系统卸载所述Linux操作系统内核态网卡驱动,并创建hugepage内存池;对每一个万兆网卡,通过hugetlbfs文件系统分配其对应的数据接收缓存池及无锁FIFO缓存,并基于其对应的PCIE地址,通过sysfs文件系统对各万兆网卡PCIE寄存器进行初始化设置,使其进入采集状态;
所述记录模块,配置为创建多个工作线程并绑定至所述CPU核心,以用户态轮询的驱动方式对各万兆网卡采集的数据包进行连续接收及磁盘记录;所述工作线程包括数据接收线程和磁盘记录线程。
本发明的第三方面,提出了一种存储装置,其中存储有多条程序,所述程序应用由处理器加载并执行以实现上述的用于高速数据采集系统的以太网数据流记录方法。
本发明的第四方面,提出了一种处理装置,包括处理器、存储装置;处理器,适用于执行各条程序;存储装置,适用于存储多条程序;所述程序适用于由处理器加载并执行以实现上述的用于高速数据采集系统的以太网数据流记录方法。
本发明的有益效果:
本发明提高了高速数据采集系统的CPU利用率、系统兼容性和系统传输可靠性,并降低了封装和部署的难度。本发明在网络传输方面,一方面采用轮询的驱动模式来对网卡数据进行读取,避免操作系统对网卡中断响应的不确定性,提高系统传输的可靠性,另一方面利用多核CPU优势,将各路数据流处理线程分离并绑定在独立的CPU核心上,同时屏蔽系统中其他任务对该核心的中断和占用,减小不必要的系统调用和线程调度,实现对数据流的高效并行处理,显著提升处理器使用效率。在数据记录方面,利用NVMe固态硬盘的多队列优势提升多路数据流的写入性能,可根据实际带宽需求和固态硬盘写入性能进行平衡分配。
同时,本发明利用标准函数库实现数据流记录方法,提升了系统兼容性和可移植性,而且数据记录软件在运行前只需做简单拷贝而无须考虑依赖包的安装,极大地简化了系统部署,因此本发明具有传输可靠性高、可线性扩展、系统兼容性强、部署容易的特点。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关发明相关的部分。
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
本发明的用于高速数据采集系统的以太网数据流记录方法,如图1所示,包括以下步骤:
步骤S100,Linux操作系统启动后,隔离出设定数量的CPU核心;
步骤S200,通过sysfs文件系统卸载所述Linux操作系统内核态网卡驱动,并创建hugepage内存池;对每一个万兆网卡,通过hugetlbfs文件系统分配其对应的数据接收缓存池及无锁FIFO缓存,并基于其对应的PCIE地址,通过sysfs文件系统对各万兆网卡PCIE寄存器进行初始化设置,使其进入采集状态;
步骤S300,创建多个工作线程并绑定至所述CPU核心,以用户态轮询的驱动方式对各万兆网卡采集的数据包进行连续接收及磁盘记录;所述工作线程包括数据接收线程和磁盘记录线程。
为了更清晰地对本发明用于高速数据采集系统的以太网数据流记录方法进行说明,下面结合附图对本发明方法一种实施例中各步骤进行展开详述。
步骤S100,Linux操作系统启动后,隔离出设定数量的CPU核心。
在本实施例中,先搭建高速数据采集系统:具体的硬件环境包括:多块万兆网卡及高速NVMe固态硬盘、物理核心数不少于2的x86或ARM CPU、至少支持1路PCIE 2.0x8和1路PCIE 3.0x4,其中,各数据流对应的万兆网卡和NVMe固态硬盘应安装于同一NUMA节点所对应的PCIE总线上,如图3所示。软件环境为主流Linux操作系统,内核版本在3.3以上。另外,本发明中设置NVMe固态硬盘的数量为N。
搭建好高速数据采集系统后,在操作系统启动时隔离出用于数据接收和文件记录的CPU核心。具体处理如下:
通过修改内核启动参数isolcpus进行CPU核心隔离,且至少保留Core0用于操作系统内核线程调度,例如:isolcpus=2-7表示隔离第Core2至第Core7共6个核心专用于数据流处理,保留Core0、Core1核心的操作系统调度权,本发明优选设置隔离的核心为2n个。另外,第一次启动Linux操作系统时(即初始化),在隔离CPU核心前需关闭主板BIOS中CPU的超线程设置,此设置仅设置一次,在以后操作系统启动时,无需再进行关闭。
步骤S200,通过sysfs文件系统卸载所述Linux操作系统内核态网卡驱动,并创建hugepage内存池;对每一个万兆网卡,通过hugetlbfs文件系统分配其对应的数据接收缓存池及无锁FIFO缓存,并基于其对应的PCIE地址,通过sysfs文件系统对各万兆网卡PCIE寄存器进行初始化设置,使其进入采集状态。
因此,在本实施例中,在数据记录程序中对万兆网卡进行初始化。具体处理如下:
步骤S210,通过sysfs文件系统下pci设备驱动目录中的unbind节点卸载原有Linux操作系统内核态网卡驱动;
步骤S200,加载hugetlbfs文件系统,创建hugepage内存池,分配网卡数据接收缓存池和大容量无锁FIFO缓存;具体为:使用默认2MB页大小,通过sysfs文件系统下nr_hugepages节点设置hugepages数量,并使用mmap在hugetlbfs中分配网卡数据接收缓存池和大容量无锁FIFO缓存空间;本发明中无锁FIFO的数量设置为n。
步骤S230,获取各万兆网卡对应的PCIE地址,并通过sysfs文件系统对万兆网卡PCIE寄存器进行初始化设置:即对网卡PCIE BAR0空间进行内存映射,并初始化网卡寄存器,具体方法为使用mmap对sysfs文件系统下pci设备资源节点resource0进行映射,再在该映射空间中对相关寄存器偏移地址内容进行读写,包括关闭网卡中断、复位网卡主控芯片、二次关闭中断、等待DMA初始化标志完成、复位数据接收环RX头指针RDH和尾指针RDT、填充各DMA描述单元物理地址、开启巨帧和混杂模式标志位等,此时网卡进入正常采集状态。
步骤S300中,创建多个工作线程并绑定至所述CPU核心,以用户态轮询的驱动方式对各万兆网卡采集的数据包进行连续接收及磁盘记录;所述工作线程包括数据接收线程和磁盘记录线程。
在本实施例中,工作线程主要分为数据接收线程、磁盘记录线程和缓存管理线程。每个物理网卡的数据流分别对应一个数据接收线程和一个磁盘记录线程,线程间通过无锁FIFO进行数据共享。为减少线程切换的资源开销以提高并行处理性能,每个数据接收线程和磁盘记录线程被分别绑定至独占的CPU核心。各线程间的结构关系如图3所示。
其中,数据接收线程主要以轮询的驱动方式实现网卡数据的连续接收。这是因为高速数据采集系统对带宽和数据完整性均有较高要求,由于通用计算机操作系统并非针对高速以太网连续收包设计,对网卡中断响应的实时性较差,且数据包需要先后经过网卡驱动、内核网络协议栈再到用户空间的多次拷贝,严重限制了数据包处理效率。尤其在万兆及以上速率环境下,即便使用8KB以上的巨帧(Jumbo Frame)进行传输,传统方法也不能保证持续零丢包记录。因此在本实施例中,以用户态轮询的驱动方式对网卡数据进行读取,避免操作系统对网卡中断响应的不确定性。随后对数据包进行完整性检测、包头过滤等处理,最终将有效数据转移至无锁FIFO。对网卡数据包进行轮询接收的具体步骤如下,如图4所示:
步骤S310,基于采集到数据包或数据流(数量为n),万兆网卡硬件根据数据接收环RX中DMA描述单元对应地址将数据包通过PCIE总线传输至系统内存后,通过硬件设置STATUS寄存器相关数据位,并同时向前移动RX的头指针RDH;数据接收线程循环读取数据接收环RX当前位置的DMA描述单元直到STATUS寄存器的STAT_DD标志位为1;
步骤S320,获取该DMA描述单元对应网络数据包的虚拟地址,存入指针数组;并从hugepage内存池中申请新的数据包接收空间进行初始化,将新缓存物理地址写入当前DMA描述单元;
步骤S330,循环执行步骤S310-步骤S320,直至达到设定的单次最大接收数量,当达到最大接收数量,执行步骤S340;其中,为减少内存操作次数,采用批量接收数据包后单次处理的策略,单次最大接收数量是人为设定值,一般小于网卡缓冲区大小。
步骤S340,向前移动RX的尾指针RDT,为万兆网卡硬件释放存储空间,对指针数组对应数据包进行完整性检测、包头过滤等处理,并将结果拷贝至无锁FIFO,拷贝完成后释放指针数组所对应的内存池空间。
磁盘记录线程负责从无锁FIFO中取出数据,并将单一连续数据流分为多个文件写入磁盘,当数据文件大小超过设定阈值时关闭当前文件并创建新的数据文件进行写入。
缓存管理线程负责定时释放操作系统已写入的文件缓存以提高连续写入性能。
另外,本记录方法支持连续记录和循环记录两种模式,其中连续记录模式为持续创建新的数据文件直至磁盘写满;循环记录模式仅保存最近时间内的预设大小数据内容,当连续记录数据超出预设大小时将自动覆盖最早的数据文件。
本发明第二实施例的一种用于高速数据采集系统的以太网数据流记录系统,如图2所示,包括:关闭隔离模块100、网卡初始化模块200、记录模块300;
所述关闭隔离模块100,配置为Linux操作系统启动后,隔离出设定数量的CPU核心;
所述网卡初始化模块200,配置为通过sysfs文件系统卸载所述Linux操作系统内核态网卡驱动,并创建hugepage内存池;对每一个万兆网卡,通过hugetlbfs文件系统分配其对应的数据接收缓存池及无锁FIFO缓存,并基于其对应的PCIE地址,通过sysfs文件系统对各万兆网卡PCIE寄存器进行初始化设置,使其进入采集状态;
所述记录模块300,配置为创建多个工作线程并绑定至所述CPU核心,以用户态轮询的驱动方式对各万兆网卡采集的数据包进行连续接收及磁盘记录;所述工作线程包括数据接收线程和磁盘记录线程。
所述技术领域的技术人员可以清楚的了解到,为描述的方便和简洁,上述描述的系统的具体的工作过程及有关说明,可以参考前述方法实施例中的对应过程,在此不再赘述。
需要说明的是,上述实施例提供的用于高速数据采集系统的以太网数据流记录系统,仅以上述各功能模块的划分进行举例说明,在实际应用中,可以根据需要而将上述功能分配由不同的功能模块来完成,即将本发明实施例中的模块或者步骤再分解或者组合,例如,上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块,以完成以上描述的全部或者部分功能。对于本发明实施例中涉及的模块、步骤的名称,仅仅是为了区分各个模块或者步骤,不视为对本发明的不当限定。
本发明第三实施例的一种存储装置,其中存储有多条程序,所述程序适用于由处理器加载并实现上述的用于高速数据采集系统的以太网数据流记录方法。
本发明第四实施例的一种处理装置,包括处理器、存储装置;处理器,适于执行各条程序;存储装置,适于存储多条程序;所述程序适于由处理器加载并执行以实现上述的用于高速数据采集系统的以太网数据流记录方法。
所述技术领域的技术人员可以清楚的了解到,为描述的方便和简洁,上述描述的存储装置、处理装置的具体工作过程及有关说明,可以参考前述方法实例中的对应过程,在此不再赘述。
下面参考图5,其示出了适于用来实现本申请方法、系统、装置实施例的服务器的计算机系统的结构示意图。图5示出的服务器仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图5所示,计算机系统包括中央处理单元(CPU,Central Processing Unit)501,其可以根据存储在只读存储器(ROM,Read Only Memory)502中的程序或者从存储部分508加载到随机访问存储器(RAM,Random Access Memory)503中的程序而执行各种适当的动作和处理。在RAM 503中,还存储有系统操作所需的各种程序和数据。CPU 501、ROM 502以及RAM 503通过总线504彼此相连。输入/输出(I/O,Input/Output)接口505也连接至总线504。
以下部件连接至I/O接口505:包括键盘、鼠标等的输入部分506;包括诸如阴极射线管(CRT,Cathode Ray Tube)、液晶显示器(LCD,Liquid Crystal Display)等以及扬声器等的输出部分507;包括硬盘等的存储部分508;以及包括诸如LAN(局域网,Local AreaNetwork)卡、调制解调器等的网络接口卡的通信部分509。通信部分509经由诸如因特网的网络执行通信处理。驱动器510也根据需要连接至I/O接口505。可拆卸介质511,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器510上,以便于从其上读出的计算机程序根据需要被安装入存储部分508。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分509从网络上被下载和安装,和/或从可拆卸介质511被安装。在该计算机程序被中央处理单元(CPU)501执行时,执行本申请的方法中限定的上述功能。需要说明的是,本申请上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本申请的操作的计算机程序代码,上述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本申请各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
术语“第一”、“第二”等是用于区别类似的对象,而不是用于描述或表示特定的顺序或先后次序。
术语“包括”或者任何其它类似用语旨在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备/装置不仅包括那些要素,而且还包括没有明确列出的其它要素,或者还包括这些过程、方法、物品或者设备/装置所固有的要素。
至此,已经结合附图所示的优选实施方式描述了本发明的技术方案,但是,本领域技术人员容易理解的是,本发明的保护范围显然不局限于这些具体实施方式。在不偏离本发明的原理的前提下,本领域技术人员可以对相关技术特征作出等同的更改或替换,这些更改或替换之后的技术方案都将落入本发明的保护范围之内。