一种基于大规模工业热数据的数据采集和存储系统设计

2023-12-26 04:46陆超杰杨鑫王启蒙朱逸廷陶松
智能制造 2023年6期
关键词:内核线程队列

陆超杰,杨鑫,王启蒙,朱逸廷,陶松

(1.国核自仪系统工程有限公司,上海 200240;2.烽台科技(北京)有限公司,北京 100195)

1 引言

随着互联网技术在工业控制领域的广泛应用,工业控制网络智能化和自动化的水平越来越高,系统也从隔离封闭的环境逐步转为半开放的系统,甚至与互联网直接进行连接[1-2]。工业控制网络的发展造成生产力提高的同时,也带来了安全方面的挑战。

通过对工业控制网络热数据的分析,可以实现对生产环境的监控,实现对诸如高温、高压等异常状况的预警。同时大多数安全软件依靠对数据帧进行捕获与分析来实现安全防护的功能,但工业控制网络日益增长的带宽对数据流量的捕获造成了极大的限制[3]。为了应对这些问题,需要一种在高速网络环境下能够实现低延迟、低丢失率的方法,对数据包进行捕获转储。通过对转储数据的分析处理,实现对工业控制网络的安全监控。

在传统的网络数据转储中常用 Wireshark、TCPDUMP 等软件进行数据包捕获,这类软件依赖操作系统提供的接口获取数据帧,当数据量过大时不能完整对数据流进行捕获,从而出现丢包等现象[4-6]。并且在工业控制网络中数据包长度在 64~ 100 bit 区域附近数据包较多,而操作系统的网络协议栈是通过中断来获取数据包到达的消息,长度较短的数据包在相同的带宽下造成的中断次数更多,给操作系统造成了极大的中断开销[7]。

而 DPDK 则通过用户空间驱动的方式绕过内核网络协议栈,将所有必要的驱动程序移至用户空间,从而避免系统调用并实现应用程序的零拷贝访问。在用户空间通过轮询的方式判断数据帧的到达,直接从网络设备获取数据并进行处理,极大地提高了数据包获取的性能。

针对万兆级工业热数据采集存储问题,本文提出了一种基于数据平面开发框架 DPDK 的网络数据帧采集存储方案,在构建的工控网络靶场中得以验证,在保证快速采集工业热数据的同时,保证数据的完整性。

2 背景技术

2.1 数据平面开发框架

数据平面开发框架 DPDK 是一个由 Linux 开源基金会管理的开源软件项目。它提供一组用于数据平面处理的函数库和基于轮询模式的用户空间网卡驱动程序,将数据包的处理从内核空间转移到了用户空间。与内核空间提供的基于中断的驱动程序相比,实现了更高的计算效率与更高的数据吞吐量。

DPDK 框架通过环境抽象层,隐藏了具体的实现细节,并且为不同的硬件平台和操作系统提供了统一的编程接口,实现了源代码级别的可移植性。DPDK 还提供多线程与多进程模型、CPU 亲和性、内存缓冲池、原子与锁定操作及无锁循环队列等功能。

2.2 Libpcap

Libpcap 是一个可移植的用于网络流量捕获和分析的函数库,包括数据包嗅探、网络监视、流量生成等功能。Libpcap 为不同操作系统提供一套与操作系统无关的接口,来实现应用程序对多个操作系统数据包捕获的需求。

2.3 RESTful API

REST 是一种基于超媒体构建分布式系统的架构风格。在通常情况下,RESTful API 会使用 HTTP 作为应用程序协议。RESTful API 围绕任何类型的对象、数据或服务等资源进行设计,每一个资源可以被 URL 唯一标识。RESTful API 使用统一的接口,有助于实现客户端与服务器分离。

2.4 gRPC

gRPC 是一个开源的高性能远程过程调用框架,可以在多种不同的编程语言环境和硬件平台下进行工作。它可以通过负载均衡、跟踪和身份验证动态的与数据中心进行连接。典型的 gRPC 客户端将会公开实现特定功能的本地函数,以供远程计算机上的另一个进程调用。并且将远程调用伪装成本地调用。

3 系统设计

3.1 方案整体架构

本方案采用模块化设计思想,按照所负责的功能分为控制层与数据层两大模块,模块之间通过远程过程调用进行通信。控制层分为两个子模块,分别是调度模块与信息采集模块。数据层分为收发模块、采集模块与汇聚模块。控制层根据任务需求,对位于本地或远程的数据层下达指令完成相应任务,并采集数据层上报的相关信息;数层根据控制层下发的任务完成采集汇聚,并将过程信息与执行结果上报给控制层。整个系统的架构如图1 所示。

图1 基于软件定义网络的数据采集存储系统结构

3.2 调度模块设计

调度模块负责本系统与外部应用的协同工作,具体过程如图2 所示。调度模块根据外部应用发布的任务信息生成任务,并放入按照一定优先级排序的任务队列,等待任务执行。当数据层空闲的时候,调度模块向控制层下发指令并推送任务信息,使控制层开始工作。同时调度模块根据外部应用的请求返回任务的执行情况或任务的执行结果信息。

图2 采集调度模块流程示意图

在开发跨编程语言或跨硬件平台软件时,通常会因为进程之间的通信问题而不能简单高效地集成,而单一程序又不能有效地实现系统需求。所以为了更好地与外部应用集成以进行协同工作,需要合适的通信协议来完成进程之间的通信。

在与外部应用集成的情况下,要求协议层次清晰、语义简洁,而对性能要求不高。所以调度模块采用 HTTP RESTful API 风格的接口进行与外部应用的通信,以保证与其他应用简单集成。

而在与同一应用不同模块之间的通信,则要求高性能与快速响应。所以调度模块采用gRPC 框架进行不同模块之间的通信。

3.3 信息采集模块设计

在系统数据层运行时,会产生系统运行时数据,包括运行状况、转储数目、转储文件大小等,通过这些数据可以对系统健康状况、任务完成进度等进行判断。

信息采集模块会在控制层执行任务时,采集控制层上报的运行数据,并缓存在特定的存储空间中,供外部应用调取。并且在任务结束时采集任务完成信息。具体操作流程如图3 所示。

图3 信息采集模块流程示意图

同时,在万兆级别的网络环境下,每秒产生的数据量通常有1G 以上,远超普通机械硬盘的写入速度,而固态硬盘价格昂贵,不适合作为大量数据的存储介质。为了实现转储文件在高网络负载的情况下,能够快速存储,本方案采用 Linux 内存文件系统 tmpfs 来作为系统临时文件的缓存方式。tmpfs 是Linux 中的一种文件系统,他将所有的文件都存储在内存或交换分区中。将文件放入tmpfs 是加快文件访问速度的有效方法。

在本方案中,使用 Libpcap 将从无锁循环队列中取出的数据帧存储为 pcapng 格式的临时文件。pcapng 是下一代网络数据包跟踪转储格式,具有良好的可扩展性、可移植性,并且可以进行数据的合并与追加。pcapng 格式嵌入了丰富的文件信息,供其他程序使用,并且数据格式独立于网络设备、硬件平台与操作系统,可以简单地将数据帧转储文件推送到服务器等其他设备进行分析。pcapng 格式解决了pcap 格式的一些不足,支持诸如多网络接口捕获、更高精度与长度的64 位时间戳、在文件中存储额外元数据等,是工业互联网热数据转储的良好选择。

采集模块会在的采集线程在采集工作开始时,会在内存文件系统中创建一个临时的 pcapng 文件。之后采集模块会从无锁循环队列中取出数据帧,并通过 Libpcap 写入临时pcapng 文件。当文件临时到达一定大小,采集线程会创建新的临时文件并将之前的文件路径通过无锁循环队列发送到汇聚模块。

在采集模块中,不同工作线程同时进行工作,相同时间段产生的数据帧可能分散在不同的临时文件中,直接使用临时文件进行分析等工作将会产生不确定的结果。

3.4 收发模块设计

在传统的数据包转储方案中,Linux 系统的网络流量通过内核协议栈进行处理,并且通过内核中的网络过滤器 Netfilter 进行过滤。当网络数据帧到达网络设备时,网络设备会以中断的形式通知内核协议栈对数据帧进行处理,在数据量大时会产生大量的中断,导致CPU 无法处理其他进程。而内核对数据帧进行处理后还需将数据负载拷贝到用户空间,并通知用户空间应用程序。在这个过程中存在两次上下文切换、内核协议栈数据处理和内核空间到用户空间数据拷贝造成的开销。本方案中采用的是DPDK 收发框架构建系统收发能力,与传统的网络数据帧转储方案不同,通过用户空间驱动的方式绕过内核网络协议栈,将所有必要的驱动程序移至用户空间,从而避免系统调用并实现应用程序的零拷贝访问。在用户空间通过轮询的方式判断数据帧的到达,直接从网络设备获取数据并进行处理,极大地提高了数据包获取的性能,具体流程示意图如图4 所示。

图4 收发模块DPDK 收发框架示意图

DPDK 框架使用内存池技术,避免了在高并发场景下内存申请造成的开销与延迟。DPDK 将数据帧缓存在一种名为Mbuf 结构体中,当收包模块轮询过程中检测到网络设备的接收队列不为空时,将会根据队列中数据帧的数量在内存池中申请若干个Mbuf 内存块,并将队列中的数据帧通过直接存储器访问写入到Mbuf 中;DPDK 发送数据包时,等待网卡将数据发送完毕后将Mbuf 内存块重新放回内存池中。整个过程没有不确定大小的内存块的申请与释放,极大地提高了数据帧的处理效率。

DPDK 框架支持CPU 亲和与CPU 独占功能特性,它可以将每个工作线程绑定到不同的CPU 核心上面,使该线程只能在特定的核心上运行,线程不会在不同核心之间频繁迁移,减少调度产生的开销,避免了缓存失效造成的命中问题或其他消耗。

DPDK 提供流分类技术,DPDK 流分类器通过无锁循环队列,将数据帧均匀分配给收发模块的各个工作线程,工作线程从队列中取出数据帧进行克隆操作后推入发送队列进行发送,然后将克隆的数据帧推入采集队列交由采集模块进行采集。

在本方案中,收发模块根据调度模块发送的指令信息,创建流规则并使能 DPDK 流分类器用来捕捉符合特定规则的数据帧。对于不能匹配流规则的数据帧直接进行转发,以节省存储空间。对于匹配流规则的数据帧,则增加对存放该数据帧的 Mbuf 内存块的引用以进行浅拷贝,然后将浅拷贝数据帧包推入存储队列,之后将原数据帧推入网卡发送队列。

4 结论

本方案提出了一种工业控制网络热数据采集存储方案,采用数据平面开发框架作为开发框架,并结合Libpcap、gRPC 等函数库,能够在高负载工业控制网络场景下,实现对万兆级别的工业控制网络热数据采集与存储,并保证转储数据的可靠性与实时性。并且本方案可以结合链路聚合技术使用,对数据层进行动态扩容,实现更高带宽网络数据的采集与转储。系统可以稳定高效地完成相应工作,并实现相应系统要求。

猜你喜欢
内核线程队列
强化『高新』内核 打造农业『硅谷』
队列里的小秘密
基于多队列切换的SDN拥塞控制*
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
在队列里
丰田加速驶入自动驾驶队列
浅谈linux多线程协作
微生物内核 生态型农资
基于上下文定界的Fork/Join并行性的并发程序可达性分析*