大型遥测地震仪高性能数据传输方法
技术领域
本发明涉及地震仪数据传输方法,特别是涉及一种大型遥测地震仪高性能数据传输方法。
背景技术
1、大型遥测地震仪具有海量回传地震数据的特点。随着以太网(Ethernet)技术的日趋成熟与发展,在地震勘探领域,数据采集设备由开始几十道、几百道的小型地震仪发展到现在具备上万道甚至十万道带道能力的高精度大型遥测地震专用网络,其中,采集服务器承担了接收整个地震遥测网络采样数据的任务,在使用十万道仪器持续8秒的数据采集生产过程中,会回传3-4G左右的采样数据,并且基于施工效率和成本的考虑,需要在基本实时情况下将数据无损传输到采集服务器并保存,因此,网卡只有在接收速率基本达到线速(千兆网卡1000Mb/s),并充分利用数据接收系统网络带宽和实现高速存储才能满足这一需求。在常规网络数据传输中,普遍采用的是TCP/IP(传输控制协议/网际协议)协议。TCP协议是面向连接的、可靠的数据流传输协议,对应OSI模型第四层(传输层),广泛应用于互联网(Internet)和局域网(Ethernet)的数据传输控制。在数据传输过程中,数据帧的TCP协议头段加入了能够保证数据完整性的多项校验字段与数据帧索引字段,并且融入了大量数据传输应答机制,以保证数据传输安全性,这在互联网远程数据传输过程中有其不可替代的优势,但是面向连接和可靠数据传输的特点是以牺牲大量带宽为代价的,这在相当程度上降低了用户数据的传输效率;IP协议,对应OSI模型第三层(网络层),其主要应用于互联网数据包路由服务,同时是一种无连接、不可靠传输协议,对于分层架构的遥测地震仪专用网络并没有太多实际应用价值,因此可以看出,TCP/IP协议是无法达到充分利用网络带宽实现高性能存储要求的。
2、现代计算机系统结构普遍采用分层的架构体系,目前比较流行的计算机架构中的网络体系是由网络硬件设备层、驱动层、与设备无关的网络接口抽象层、内核协议层、与协议无关的用户接口层构成,因此,在数据帧到达网络接口设备并向上传递的过程中,避免不了要做各种各样的数据验证、各个协议层对数据帧的拆包与路由处理,所以此过程必然会导致在数据接收过程中效率的下降,无法达到所需要的高效传输速率。
3、以太网高速数据采集的过程,其实质是对网络数据帧的捕获和快速处理,对于此问题的解决方案,比较典型的是国外提出的零拷贝(zero copy),此项技术首先改造网络接口设备的底层驱动程序,使其能够将网络接口设备接收到的数据直接存放(DMA)映射到应用层的内存空间,再由应用层程序不断轮询读取此缓存空间的内容,此一过程减少了网卡到内核和内核到用户空间的数据拷贝,毋庸质疑,此方法确实提高了网络上捕包的效率,并降低了CPU资源的占用,但此方法也是建立在现代分层的操作系统架构体系之上,而现代计算机硬件设备的模块化、多样化设计使得操作系统在设计之初就已经充分考虑了对底层硬件设备的接口抽象,也即是说无论使用那个厂家的硬件设备,只要其硬件接口和驱动程序符合标准,操作系统内核会以通用的接口方法去操作此类硬件设备,因此操作系统具有统一的与设备无关的抽象接口,然而此项技术改造的基础是以更改硬件设备的驱动程序为前提,也就是跳过操作系统抽象接口直接操作底层硬件设备,而网络接口卡从高端到低端,从型号到厂家每一款都有自己的驱动程序,在应用过程中,对每一款网卡都要实现一次驱动程序的改造,显然是不现实的,同时,在用户层轮询数据时同样会占用CPU相当的资源。
4、目前,部分网络接口设备已经具备了NAPI技术,(即Network ApplicationProgramming Interface),它的核心概念是不采用中断的方式读取数据,而是首先采用网络接口设备中断唤醒数据接收服务程序,然后关闭网络接口设备中断,采用轮询方法来获取数据。在小包大数据流量的网络环境中,网卡每接收到一帧数据就会发起一次中断,由于小包接收必然造成频繁的网卡中断,这势必会造成CPU资源被长时间占用而无法及时响应其他设备或网络层以上协议处理程序的中断处理请求,造成大量丢包,因此NAPI的本质是为了降低网卡中断产生频率,特别是当链路中存在大量短长度数据包时,此技术能够显著减少中断在现场保护和恢复上的时间开销,但是在大流量大包数据帧较多而中断触发较少的情况下,CPU仍然要定时轮询缓冲区,这造成了CPU资源的浪费,经测试表明,在千兆网卡接收速率接近线速时,并没能有效改善性能。另外,根据相关的计算机可靠性指标计算可以知道,轮询的方式实质上是程序控制设备的方式,假如一旦出现死锁,会严重波及操作系统对设备控制权的收回并引发整个系统故障。从长远来看,此方法只能算是权益之策,未能根本解决网络传输效率问题。目前计算机设备正在朝向高主频、多核、海量内存发展,实际应用中表明,在网络数据接收过程中大容量缓存的应用是解决服务器达到峰值接收状态时避免丢包的有效办法。
发明内容
本发明目的在于克服现有的高性能数据接收中存在的效率低、可移植性不高、通用性差的不足问题,提供一种大型遥测地震仪高性能数据传输方法。
为实现上述目的,本发明大型遥测地震仪高性能数据传输方法是通过在操作系统网络协议栈的MAC层(链路层)之上建立专用自定义(经过精简的)数据传输协议,由专用自定义协议代替原来的TCP/IP协议,将收到的符合本协议的数据包经过处理,直接映射到应用层缓存空间,而对于不符合本专用协议的数据帧仍由操作系统内部的协议栈处理,使高效与通用性并存。所以本发明可以看作是针对特定应用的TCP/IP协议扩展。其克服现有的高性能数据接收中存在的效率低、可移植性不高、通用性差的不足问题。本发明利用现代计算机系统中的现有资源和特点,同时考虑到大型地震数据采集系统的数据传输特征,扩展了TCP/IP协议,提高了在大型地震仪采集网络环境中的数据接收效率,使本发明具有可靠性高、改造方便、可扩展性强的特点。
作为优化,所述专用自定义数据传输协议,总体的数据流程为:①.应用层利用socket系统调用建立套接字;②.专用协议响应应用层系统调用并建立专用协议实例;③.专用协议实例根据应用层传入的参量进行相关参数设置;④.专用协议实例根据传入的参量构建大型缓冲队列;⑤.专用协议实例向应用层映射内核缓冲队列地址;⑥.应用层启动接收和发送例程开始收发数据。(见图1)
作为优化,所述专用自定义数据传输协议由协议初始化注册模块、协议实例创建模块、参数设置模块、数据缓冲区映射模块、数据接收模块、数据发送模块、协议实例释放模块、协议卸载模块组成(见图2);其中协议初始化注册模块、协议实例创建模块、四模块集(参数设置模块、数据缓冲区映射模块、数据接收模块、数据发送模块)、协议实例释放模块、协议卸载模块依次链接。
作为优化,当应用层利用本专用协议收发数据时,首先利用系统调用例程指定本协议族和数据帧标识,由此触发协议实例创建模块,建立专用数据结构实例,用本协议的操作例程指针和相关参数对其初始化;
接下来应用层调用参数设置模块向内核传入缓冲区设置参数,由此触发数据缓冲区映射模块将内核空间大容量缓存与用户空间地址相映射,完成内核与应用层共享同一块数据缓冲区的目的;
随后,启动数据接收模块和数据发送模块负责应用层与底层之间的数据接收和发送工作,当应用层关闭对本专用协议的调用时,会触发协议实例释放模块来清空相关数据缓冲区(见图5);
最后,当编译后的整个协议模块向操作系统内核注册时,会由内核自动调用协议初始化注册模块,由初始化注册模块完成本协议专用数据结构向内核的注册工作,而协议卸载模块负责向内核注销本协议的功能实现(见图6)。
作为优化,利用现代计算机设备2核或以上CPU架构、大容量内存的特点,采用其中一核与网卡绑定,使其专门服务处于高速数据接收状态的网卡中断请求,使其它CPU核响应系统中网卡以外设备和程序的处理请求,同时利用高容量缓存将接收到的数据暂存,(从而)提高(了)在大数据流量背景下的数据接收效率。
作为优化,在通用计算机系统中,将网络接口设备的中断服务与指定的CPU核绑定,同时分配大容量数据缓存并将用户空间地址与内核空间地址相关联;当数据帧到达网卡后,硬件发出中断请求,由指定的专用CPU核负责调用中断处理例程将数据拷贝到内核空间,即交给自定义网络收发协议,此协议将数据帧作常规校验后直接挂载到用户层映射到内核中的缓存空间地址上,用户层利用轮询的方法不断从缓存空间读取有效数据并释放处理后的缓存地址。此方法通过操作通用计算机的高速处理和存储部件实现高性能数据接收。具备可靠性高,构建灵活,成本低的特点。
作为优化,在数据到达计算机网络接口以后,由专用CPU核调度数据处理程序将数据放入计算机缓存队列,此后由操作系统内核中专用自定义网络协议处理数据帧,此过程中,第一、当硬中断调度程序执行完毕,交由内核专用网络自定义协议进行处理,比常规网络协议(TCP/IP等)在内核中的处理效率有了极大的提高。第二、由专用CPU核响应设备硬中断调度程序,效率极高。第三、专用自定义网络协议将数据帧直接挂载到应用层映射到内核的缓存空间中,这避免了内核态向用户态的数据拷贝,即节省了CPU的切换(switch context)时间;第四、用户在轮询处理缓存数据时,将数据暂存入具有SEG-Y文件结构的内存空间中。由于采用了专用CPU核中断处理绑定、精简的协议处理流程,大容量缓存映射和锁定等机制,大大增强了数据接收的可靠性和效率。
作为优化,所述将数据按SEG-Y的格式暂时在内存中存储下来,待一次采集完成后,再输出到外部存储设备;在整个数据的接收处理过程中,经过一次南桥总线到内存的数据拷贝,随后的处理都是通过CPU与内存(北桥总线)的有限次通讯完成整个数据接收处理过程,因此极大的增强了数据接收的效率。
作为优化,在多核、多网络接口卡和更高的内存容量计算机配置中,可以继续将多个CPU核与多块网卡作一一中断服务绑定,并在用户层加大接收缓存容量并映射至内核中。现在流行的大多数主板架构中,南桥到北桥的数据通信速率为2GB、北桥与CPU的通信速率为12.8GB,理论上可以支持12核CPU和6块网络接口卡,在实现每块网卡基本线速接收的情况下(以至少1000Mb/s为例),主机总的网络接口速率至少可以达到6000Mb/s,能够满足数据接收的高性能和数据安全性要求。随着计算机多核时代的到来和内存容量的不断扩充,在高性能数据接收处理领域具有很强的可升级性。
作为优化,由于采用现有通用计算机架构和可靠成熟的操作系统作为实现方法的平台,接收数据具有高效、稳定、实现灵活,升级方便的特点,能够满足实时性、可靠性要求高的工业级数据采集生产环境;将网络接口卡的硬件中断绑定到多核架构CPU中的某一颗核上;将内核空间大容量缓存地址与用户空间虚拟地址相关联并锁定。
本发明所采用的技术方案即(见图7):
1、在操作系统内核中增加专用自定义网络传输协议
现代操作系统正在朝向智能化、模块化发展,这为实现在特殊领域的特殊需求提供了必要的保障。操作系统除了其作为一个应用层与设备层的通用接口服务程序外,也允许以模块的方式将特殊的需求程序加入内核当中,以满足对特定硬件设备的自主控制需要。本方法利用其这一特点,对特定的数据帧屏蔽其在网络协议栈中耗时较多的通用协议处理例程,加入经过精简的专用自定义数据传输协议,来满足本发明的高效接收数据这一目的。本方法的实现立足于操作系统设备接口抽象层之上,不去考虑底层网络接口设备的各种不同设计结构,充分利用多核与大容量缓存的优势与操作系统内核功能模块化添加的特点,向操作系统内核嵌入专用自定义协议处理例程,如此既保证了本方法的通用性和可靠性,也从本质上解决了数据接收的效率问题。以linux操作系统接收网络数据帧过程为例,在数据帧到达网卡后,网卡产生硬中断,CPU立即响应中断,调用内核中断服务例程,将网卡数据传递到内核缓存空间,并根据协议标识通知上层(链路层之上)相应协议处理例程处理数据,据此本发明通过在操作系统内核网络协议栈链路层之上注册专用自定义处理协议和协议标识符,由底层判断并将符合本协议标识符的数据传递进来,并经过本协议精简处理后直接挂载到做好用户层映射的内存缓冲空间,由应用层程序不断轮询监控缓存中的有效数据,并按SEG-Y的格式暂时在内存中存储下来,待一次采集完成后,再输出到外部存储设备。本方法中,第一、精简了数据帧在内核中的路由处理过程,第二,节省了普通处理方式中内核到用户层拷贝数据的切换(switch context)时间,因此,极大的提高了网络数据接收的性能,充分利用了千兆网卡的接收带宽,使千兆网卡基本能够达到线速接收的效果。
2、将网络接口卡的硬件中断绑定到多核架构CPU中的某一颗核上。
硬件中断的频繁发生必然消耗CPU的资源,在多核CPU架构中能够将重要的硬件中断任务分配给专一的核去处理,让其他的核去处理内部相对不重要的任务,能够显著提高整个系统针对特殊任务的完成效率。在计算机系统中,每个硬件设备都会被分配一个IRQ号(中断号),此中断信号由硬件产生,并直接送至中断控制器上,然后再由中断控制器向CPU发送信号,当CPU检测到这一中断信号后,中断当前的工作保存现场,并转而通知操作系统调用相应的中断服务例程去处理中断请求。本方法利用多核CPU下的设备中断绑定技术,将一颗CPU核专门服务于一块千兆网卡,响应其中断服务,经过测试,在每秒百兆字节背景流量和小包(小于80Byte)接收的环境下,千兆网卡每秒产生大约167000次中断,而多核CPU架构(以酷睿2为例)中一颗CPU核(以网卡中断服务例程为例)每秒能够响应的中断超过200000次,这完全能够满足作为网卡请求中断服务的专用伺服CPU的要求,因此无论是在小包大流量背景还是大包大流量背景下都能够高效可靠接收数据。基于这一思想,本发明首先将担负数据接收任务的网络接口卡设备中断绑定到专一CPU核上,将重要的任务由多核中的单独一颗CPU核来处理,提高了网卡中断服务的响应效率,进而提高了网卡的数据接收性能。
3、将内核空间大容量缓存地址与用户空间虚拟地址相关联并锁定。
在接收到数据以后依赖大容量内存,将数据暂时放入内存空间,避免了写入外部存储设备时数据进入南桥总线降低数据存储效率的问题。以linux操作系统为例,数据包到达网卡,内核系统会调用网卡的中断处理例程,中断处理例程根据自身的状态寄存器判断是否是数据帧到达,如果是则调用驱动程序中的接收例程,而后,对于所有类型的网卡驱动程序接收到数据帧,最终都会调用到操作系统内核中的netif_rx例程,并将数据帧放入接收缓冲队列,同时产生软中断(NET_RX_SOFTIRQ),此时内核中net_rx_action例程会从此队列头中将数据帧依次取出并通知上层协议处理数据包,因此,链路层接收缓冲队列的提取效率对于丢包率也会有决定性影响;此外,在操作系统设计之初基于安全性考虑,内核空间的物理地址内存管理机制与用户空间的虚拟地址内存管理机制是不同的,所以在传统数据接收过程中,数据经由底层传到内核层,经过内核相关例程处理后,需要将符合用户层应用程序设定要求的数据拷贝到用户内存空间,这一过程增加了从内核态到用户态的转换时间,降低了数据包处理效率,所以需要将用户空间内存地址与内核空间内存地址作映射,以节省大量的模态转换和数据拷贝时间;因此,为了能够构造大型缓存队列,需要首先由应用层控制本专用协议数据缓冲区映射模块以页对齐方式申请大容量内存,然后将用户内存空间地址与操作系统内核空间地址相关联,即将内核中的内存地址与用户层虚拟地址指向同一块物理内存,使内核接收处理例程和应用层接收程序能够在接收数据时利用此缓存空间直接挂载数据和轮询数据,而不需要做过多拷贝与转换等待,从而为高速接收网络数据创造了条件。最后,从操作系统内存管理策略可以知道,对于申请的内存空间如果长时间未使用,会被操作系统暂时置换到虚拟内存,也就是外部存储器,在地震数据的高速回传接收过程中,这显然是不符合效率要求的,因此,在用户空间申请内存的第一时刻,需要锁定申请到的内存空间,即不允许操作系统对申请到的内存空间作可能的换页操作。
总之,本发明利用现代计算机中多核CPU(2核或以上)、大容量内存(2G以上)和多千兆网接口,实现了适用于大型遥测地震仪的高性能数据接口技术。1)在操作系统内核中增加专用自定义网络接收协议,提高网络数据帧在内核中的处理效率;2)将2核或以上CPU其中一核绑定到指定网卡并专门服务于此网卡中断,提高网卡中断请求服务的处理效率;3)将内核空间大容量缓存地址与用户空间地址相关联,减少高速数据传输过程中的内存拷贝操作;4)同时锁定数据接收缓存,限制内存换页等方法,有效地解决了超大地震网络数据传输过程中的实时数据传输和存储瓶颈问题。由于本方法采用现代通用计算机架构和稳定成熟的操作系统作为实现平台,具有实现灵活可靠、成本低、稳定性高、可移植性强等特点。
采用上述技术方案后,本发明其克服现有的高性能数据接收中存在的效率低、可移植性不高、通用性差的不足问题。本发明利用现代计算机系统中的现有资源和特点,同时考虑到大型地震数据采集系统的数据传输特征,扩展了TCP/IP协议,提高了在大型地震仪采集网络环境中的数据接收效率,使本发明具有可靠性高、改造方便、可扩展性强的特点。可广泛应用于:石油勘探、天然气勘探、煤田勘探、矿产勘探、地质工程勘察、地质灾害监测等具有高速、高可靠性数据传输要求的数据采集领域。
附图说明
图1:是本发明大型遥测地震仪高性能数据传输方法的总体数据处理流程图;
图2:是本发明中专用自定义网络协议模块设计图;
图3、4:是linux双核系统中CPU与网卡绑定前后对比;
图5:是本发明中专用自定义网络协议内部数据处理流程图;
图6:是本发明中专用自定义网络协议向内核中注册与卸载的流程图;
图7:是本发明的总体架构设计图。
具体实施方式
如图所示,本发明大型遥测地震仪高性能数据传输方法所采用的技术方案即(见图7):
1、在操作系统内核中增加专用自定义网络传输协议
现代操作系统正在朝向智能化、模块化发展,这为实现在特殊领域的特殊需求提供了必要的保障。操作系统除了其作为一个应用层与设备层的通用接口服务程序外,也允许以模块的方式将特殊的需求程序加入内核当中,以满足对特定硬件设备的自主控制需要。本方法利用其这一特点,对特定的数据帧屏蔽其在网络协议栈中耗时较多的通用协议处理例程,加入经过精简的专用自定义数据传输协议,来满足本发明的高效接收数据这一目的。本方法的实现立足于操作系统设备接口抽象层之上,不去考虑底层网络接口设备的各种不同设计结构,充分利用多核与大容量缓存的优势与操作系统内核功能模块化添加的特点,向操作系统内核嵌入专用自定义协议处理例程,如此既保证了本方法的通用性和可靠性,也从本质上解决了数据接收的效率问题。以linux操作系统接收网络数据帧过程为例,在数据帧到达网卡后,网卡产生硬中断,CPU立即响应中断,调用内核中断服务例程,将网卡数据传递到内核缓存空间,并根据协议标识通知上层(链路层之上)相应协议处理例程处理数据,据此本发明通过在操作系统内核网络协议栈链路层之上注册专用自定义处理协议和协议标识符,由底层判断并将符合本协议标识符的数据传递进来,并经过本协议精简处理后直接挂载到做好用户层映射的内存缓冲空间,由应用层程序不断轮询监控缓存中的有效数据,并按SEG-Y的格式暂时在内存中存储下来,待一次采集完成后,再输出到外部存储设备。本方法中,第一、精简了数据帧在内核中的路由处理过程,第二,节省了普通处理方式中内核到用户层拷贝数据的切换(switch context)时间,因此,极大的提高了网络数据接收的性能,充分利用了千兆网卡的接收带宽,使千兆网卡基本能够达到线速接收的效果。
4、将网络接口卡的硬件中断绑定到多核架构CPU中的某一颗核上。
硬件中断的频繁发生必然消耗CPU的资源,在多核CPU架构中能够将重要的硬件中断任务分配给专一的核去处理,让其他的核去处理内部相对不重要的任务,能够显著提高整个系统针对特殊任务的完成效率。在计算机系统中,每个硬件设备都会被分配一个IRQ号(中断号),此中断信号由硬件产生,并直接送至中断控制器上,然后再由中断控制器向CPU发送信号,当CPU检测到这一中断信号后,中断当前的工作保存现场,并转而通知操作系统调用相应的中断服务例程去处理中断请求。本方法利用多核CPU下的设备中断绑定技术,将一颗CPU核专门服务于一块千兆网卡,响应其中断服务,经过测试,在每秒百兆字节背景流量和小包(小于80Byte)接收的环境下,千兆网卡每秒产生大约167000次中断,而多核CPU架构(以酷睿2为例)中一颗CPU核(以网卡中断服务例程为例)每秒能够响应的中断超过200000次,这完全能够满足作为网卡请求中断服务的专用伺服CPU的要求,因此无论是在小包大流量背景还是大包大流量背景下都能够高效可靠接收数据。基于这一思想,本发明首先将担负数据接收任务的网络接口卡设备中断绑定到专一CPU核上,将重要的任务由多核中的单独一颗CPU核来处理,提高了网卡中断服务的响应效率,进而提高了网卡的数据接收性能。
5、将内核空间大容量缓存地址与用户空间虚拟地址相关联并锁定。
在接收到数据以后依赖大容量内存,将数据暂时放入内存空间,避免了写入外部存储设备时数据进入南桥总线降低数据存储效率的问题。以linux操作系统为例,数据包到达网卡,内核系统会调用网卡的中断处理例程,中断处理例程根据自身的状态寄存器判断是否是数据帧到达,如果是则调用驱动程序中的接收例程,而后,对于所有类型的网卡驱动程序接收到数据帧,最终都会调用到操作系统内核中的netif_rx例程,并将数据帧放入接收缓冲队列,同时产生软中断(NET_RX_SOFTIRQ),此时内核中net_rx_action例程会从此队列头中将数据帧依次取出并通知上层协议处理数据包,因此,链路层接收缓冲队列的提取效率对于丢包率也会有决定性影响;此外,在操作系统设计之初基于安全性考虑,内核空间的物理地址内存管理机制与用户空间的虚拟地址内存管理机制是不同的,所以在传统数据接收过程中,数据经由底层传到内核层,经过内核相关例程处理后,需要将符合用户层应用程序设定要求的数据拷贝到用户内存空间,这一过程增加了从内核态到用户态的转换时间,降低了数据包处理效率,所以需要将用户空间内存地址与内核空间内存地址作映射,以节省大量的模态转换和数据拷贝时间;因此,为了能够构造大型缓存队列,需要首先由应用层控制本专用协议数据缓冲区映射模块以页对齐方式申请大容量内存,然后将用户内存空间地址与操作系统内核空间地址相关联,即将内核中的内存地址与用户层虚拟地址指向同一块物理内存,使内核接收处理例程和应用层接收程序能够在接收数据时利用此缓存空间直接挂载数据和轮询数据,而不需要做过多拷贝与转换等待,从而为高速接收网络数据创造了条件。最后,从操作系统内存管理策略可以知道,对于申请的内存空间如果长时间未使用,会被操作系统暂时置换到虚拟内存,也就是外部存储器,在地震数据的高速回传接收过程中,这显然是不符合效率要求的,因此,在用户空间申请内存的第一时刻,需要锁定申请到的内存空间,即不允许操作系统对申请到的内存空间作可能的换页操作。
更具体是:
1、本发明采用的实验环境配置
发包机:
硬件配置:AMD Phenom(tm)8400 Triple-Core Processor 1.05GHz;3G内存Marvell 88E8071 PCI-E千兆网卡
操作系统:Linux Ubuntu-X86_64;内核版本2.6.28-11
收包机:
硬件配置:Intel(R) Core(TM)2 Duo CPU E6550 2.33GHz;2G内存
Inter 32566DM-2千兆网卡
操作系统:Linux Fedora8-i386;内核版本:2.6.26.8-57
联网设备:
五口千兆网络交换机、超五类双绞线、RJ45接口、T568B线序
实验程序及数据:
利用libcap1.0库自行开发以太网发包程序作为发包机的发送程序,发送程序产生不同长度数据包向接收端批量发送,利用本专用协议接口开发的以太网包收包程序作为收包机的接收程序接收数据包。
2、设计专用自定义网络协议族,并以模块的方式嵌入操作系统内核协议栈。本专用协议由初始化注册模块、协议实例创建模块、参数设置模块、数据缓冲区映射模块、数据接收模块、数据发送模块、协议实例释放模块、协议卸载模块组成,根据以上内容,在linux操作系统下本协议族的实现分以下八个部分:
A.初始化注册模块的实现
当用户层执行insmod将本协议加入操作系统内核协议栈时,会触发本模块的执行。初始化注册模块由gseisnet_init(void)函数实现,首先定义协议族net_proto_family结构体变量gseisnet_family_ops,此结构体变量主要指定协议族标识GSEISNET和协议实例创建函数指针gseisnet_init,然后利用内核协议栈注册函数sock_register将本专用协议族注册到内核网络协议栈以响应应用层对本协议族的socket调用。关键代码如下:
B.协议实例创建模块实现
当应用层调用socket创建套接字时,会触发本模块的执行,proto_ops结构体变量gseisnet_ops定义了socket上的函数操作集合,套接字创建时,会用此结构体对套接字的函数操作集指针赋值bsdsocket->ops=gseisnet_ops,此后由应用层调用的数据接收、发送和参数设置等都会映射到本结构体的函数指针上面,由对应的本协议模块内部函数实际执行相应的操作;接下来定义packet_type变量,此变量定义了数据帧标识符GSEISNET_PACKET和本协议的接收函数指针gseisnet_rcv,然后将packe_type变量注册到ptype_base链表dev_add_pack(&packet_type),当链路层收到本协议指定标识符的数据帧后,会通过查找ptype_base链表查找本协议注册的标识符,随后调用其接收函数gseisnet_rcv继续由本专用协议处理收到的数据帧。关键代码如下:
C.参数设置模块的实现
此模块gseisnet_setsockopt由应用层的参数调用例程setsockopt触发,主要用于控制本专用协议建立缓冲区时向内核传送必要的设置参数,例如缓冲区页面大小和分配的缓冲区块数量等。关键代码如下:
D.数据缓冲区映射模块的实现
当应用层通过setsockopt例程调用,并向本协议内核模块传入GSEISNET_RX_RING标识时,会触发本模块的执行,本模块主要负责在内核中针对建立的套接字构造大型环形缓冲区,通过应用层传入的需要构造的数据帧内存大小和内存块数量来构造缓冲区,由于网络数据帧MTU最大值是1514字节,又因为32为操作系统默认的一次分配的内存页block块大小为4096字节(4K),因此本实现中,以2K作为一个数据帧的缓存空间,实际分配的数据帧缓存数量为分配的全部内存页数量乘以2,以本实现为例内存页大小为BlockSize=4096,一帧数据的缓存大小FrameSize=2048,需要分配的页面个数为BlockNr=102400,所以实际分配的数据帧缓存个数为BlockSize/FrameSize*BlockNr=204800个,总的内存分配量为102400*4096/1024/1024=400MB。最后,应用层通过mmap函数将获取到的内核中分配基址映射到应用层的虚拟地址,并在应用层建立同样数量的指针链表,由虚拟基址计算得出链表中对应的所有内核中缓存队列数据帧地址。关键代码如下:
E.数据接收模块的实现
本模块负责接收内核协议栈链路层传递上来的数据帧,当链路层根据数据帧协议标识将符合本专用协议的数据帧传递到本接收函数时,首先,本接收模块对数据帧做常规的数据合法性校验;其次,对接收完整合法的数据帧在缓冲队列中找到空闲数据帧,并将数据帧加入到缓冲区队列。最后,将相应的队列中数据帧置为可读状态,告知应用层读取数据。此过程关键代码如下:
F.数据发送模块的实现
本模块负责用户数据的发出,由于地震网的硬件特性,因此在数据帧中不需要ip地址和传输层端口,因此,当用户调用send函数发送数据触发本模块时,第一,获取建立socket时保存的硬件地址(网卡mac地址),并根据传入的数据长度分配数据帧缓冲区;第二,将用户数据拷贝到缓冲区,并进行数据合法性检验;第三,将数据帧加入链路层发送队列,通知链路层发送数据。关键代码如下:
G.协议实例释放模块的实现
当应用层关闭socket套接字时,会触发本模块的执行,本模块主要任务是释放sock实例和共享缓冲区,关键代码如下:
H.协议卸载模块的实现
当用户层执行rmmod指令移除本协议模块时,会触发本模块的执行,主要是向内核协议栈注销本协议的相关私有数据结构和函数操作例程。关键代码如下:
最后,编译模块,在linux终端内进入源代码目录并编辑makefile文件:
obj-m+=gseisnet_packet.o
执行编译指令:
make-C/usr/linux-`uname-r`SUBDIRS=$PWD modules
执行模块加载指令:
insmod gseisnet_protocol.ko
3、利用linux操作系统的IRQ Affinity技术能够实现将CPU1与网卡绑定的目的,从而实现网卡的高速中断接收。具体做法是通过操作系统提供的指令smp_affinity将网卡的中断号与指定的CPU标识绑定,以4核心CPU架构为例,CPU的标识依次是0x01,0x02,0x04,0x08(分别代表CPU0,CPU1,CPU2,CPU3),分配给网卡的中断号为21,现在将CPU1与网卡绑定,语法格式为echo“2”>/proc/irq/21/smp_affinity,如果将CPU2和CPU3同时绑定到网卡上面,由两颗CPU核共同完成一块网卡的中断响应,则需要输入:echo“12”>/proc/irq/21/smp_affinity。之所以是”12”,是将CPU2的标识和CPU3的标识相加得出,具体细节可参考二进制运算相关资料,此处不再赘述。如此即完成了CPU与网卡的绑定过程。图1是在linux双核环境下显示的两颗CPU内核分别自系统启动以来响应的中断次数,可以看出,操作系统具备平衡分配中断到多个CPU上的能力,但网卡设备eth0的中断基本上被分配到了CPU1上面,当在高流量环境下,显然CPU1在响应其他中断的同时,还要响应网卡的频繁中断,这造成了CPU1对网卡中断响应处理的不及时和丢包现象。(图3-4)显示了在双核下将CPU1与网卡绑定前后的中断响应情况。
4、应用层编程,利用socket系统调用建立套接字,并指定本协议族和数据帧标识,同时根据需要建立大型共享缓冲队列。最后,启动接收程序接收数据。关键代码如下:
最后,(如下表1)显示以本发明方法构建的数据接收系统与普通网络捕包程序的性能对比。