一种高并发平台服务器的数据处理的方法转让专利

申请号 : CN201610225491.9

文献号 : CN105912306B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 鲁晓军

申请人 : 电子科技大学

摘要 :

本发明涉及对物联网后台服务器的数据的高并发处理。本发明将接收到字节型数据通过JNI接口发送给服务器内置的动态连接库的收发单元,由其将当前数据存入空闲数据缓冲区当填满后,将其标记为饱和并空闲处理单元发送处理通知;对应处理单元读取数据并将当前数据缓冲区锁定,以及将自身状态标记为忙;然后调用并行指令进行数据处理并将处理结果存入结果缓冲区,处理完毕后,将当前数据缓冲区标记为空闲,以及将自身状态标记为空闲;收发单元读取处理结果,并通过JNI接口将其发送给服务器的物理量数据库。本发明能显著提高SSH架构的物联网后台服务器的数据处理能力,既使用了java语言的良好网络能力,又利用了服务器CPU本身的处理能力。

权利要求 :

1.一种高并发平台服务器的数据处理的方法,其特征在于,包括下列步骤:

当SSH架构的物联网后台服务器通过Java语言编程实现的网络数据接口接收到物联网采集端发送的数据后,将表示物理量的字节型数据通过JNI接口发送给物联网后台服务器内置的动态链接库;

所述动态链接库基于C语言编程实现,包括1个收发单元、n个数据缓冲区、m个处理单元和1个结果缓冲区,且n>m>1;其中,处理单元和数据缓冲区的初始状态为空闲;

收发单元通过JNI接口接收字节型数据,并选择状态为空闲的数据缓冲区存入接收的字节型数据,同时将当前访问的数据缓冲区锁定,当数据填满后,收发单元将当前访问的缓冲区标记为饱和,并向状态为空闲的处理单元发送数据处理通知;

收到数据处理通知的处理单元从状态为饱和的数据缓冲区读出数据,并将当前访问的数据缓冲区锁定,以及将自身状态标记为忙;处理单元调用并行指令进行数据处理并将处理结果存入结果缓冲区;数据处理完毕后,将当前访问的数据缓冲区标记为空闲,以及将自身状态标记为空闲;

收发单元读取结果缓冲区的处理结果,并通过JNI接口将处理结果发送给物联网后台服务器的物理量数据库。

2.如权利要求1所述的方法,其特征在于,动态链接库的处理单元通过调用汇编中的单指令多数据SIMD指令执行数据处理。

说明书 :

一种高并发平台服务器的数据处理的方法

技术领域

[0001] 本发明涉及物联网技术领域,具体涉及对物联网后台服务器的数据的高并发处理。

背景技术

[0002] 目前,对于物联网设备,人们普遍关心的是终端的采集和发送功能,由于终端的微控制器处理能力比较弱,一般只做些简单分析,后台服务器由于有大量终端进行通信,它也只是对数据进行处理后进行存储,并以适当方式向用户显示。
[0003] 对于物联网后台服务器的架构,一般采用SSH(struts2+spring+hibernate)架构,即利用java语言良好的网络性能,实现对大量的连接进行高并发处理,即通过java语言所编写的网络数据接口接收物联网采集端发送的数据后,通过调动java语言的JVM(java虚拟机)的相关函数对接收的字节型数据进行高并发处理并存入物联网后台服务器的预设物理量数据库中,得到能用于用户显示的处理结果。而物联网采集端的数据一般的特点是采用单字节,双字节或整型数表示物理量,当SSH架构的物联网后台服务器通过网络数据接口接收到物联网采集端发送的数据后,需要将收到的字节型数据转换成浮点数,然后做浮点数的系数乘法,最后基于偏移量的加法操作等数据处理才能变成真正的物理量(可直接用于向用户显示),以双字节为例,基于java语言实现对接收数据进行数据处理时,通过调动java语言的JVM的相关函数实现转换、系数相乘和偏移量处理得到物理量,即:
[0004]
[0005] 对于java语言,它的优势在于跨平台和网络性能,但数据处理,尤其高并发数据处理是其弱项,当涉及高并发数据,大数据量到来时,其数据的处理更是系统的瓶颈。

发明内容

[0006] 本发明的发明目的在于:为了克服采用SSH架构的物联网后台服务器在基于java语言对接收数据进行数据处理,得到对应的真实物理量时,java语言的处理能力不足的技术问题,提供一种高并发平台服务器的数据处理的方法,既能使用java语言的良好网络能力,又能提高平台服务器的处理能力。
[0007] 本发明的一种高并发平台服务器的数据处理的方法,包括下列步骤:
[0008] 当SSH架构的物联网后台服务器通过网络数据接口(由java语言编程实现)接收到物联网采集端发送的数据后,将表示物理量的字节型数据通过JNI接口(Java Native Interface,java本地接口)发送给物联网后台服务器内置的动态链接库,优选的,动态链接库基于C语言编程实现;其中,动态链接库包括收发单元、数据缓冲区、处理单元和结果缓冲区,且处理单元和数据缓冲区的初始状态为空闲;
[0009] 收发单元通过JNI接口接收字节型数据,并选择状态为空闲的数据缓冲区存入接收的字节型数据,同时将当前访问的数据缓冲区锁定,当数据填满后,收发单元将当前访问的缓冲区标记为饱和,并向状态为空闲的处理单元发送数据处理通知;
[0010] 收到数据处理通知的处理单元从状态为饱和的数据缓冲区读出数据,并将当前访问的数据缓冲区锁定,以及将自身状态标记为忙;处理单元调用并行指令进行数据处理并将处理结果存入结果缓冲区;数据处理完毕后,将当前访问的数据缓冲区标记为空闲,以及将自身状态标记为空闲;收发单元读取结果缓冲区的处理结果,并通过JNI接口将处理结果发送给物联网后台服务器的物理量数据库。
[0011] 本发明的主要思想是把数据由单个处理变为成批处理,将采用SSH架构的物联网后台服务器的数据处理通过调用并行指令进行数据处理(如将字节型数据转换成浮点数,对浮点数的系数相乘,基于偏移量的加法操作等),例如调用SIMD(汇编中的单指令多数据)指令对接收的字节型数据进行数据处理。X86或X64架构是一款功能强大的处理器,Intel或AMD的主流处理器都支持SSE(Streaming SIMD Extension,流式SIMD扩展)的指令集,因此可以采用SSE指令完成对字节型数据的数据处理,从而显著提高物联网后台服务器的数据处理能力。以SSE指令为例,其涉及的数据处理的并行指令序列如下表所示:
[0012]指令名称 指令用途
Movd 将缓冲区的数据移动到SSE指令的xmm寄存器中
Punpcklbw 将字节扩充成字
Punpcklwd 将字扩充成32位整型数
Cvtdq2ps 将4个整型数转化成4个浮点数
Mulps 4个浮点数同时进行乘法
AddPs 4个浮点数同时进行加法
movq 将结果存入结果缓冲区
[0013] 综上所述,由于采用了上述技术方案,本发明的有益效果是:显著提高SSH架构的物联网后台服务器的数据处理能力,既使用了java语言的良好网络能力,又利用了服务器CPU本身的处理能力。

具体实施方式

[0014] 为使本发明的目的、技术方案和优点更加清楚,下面结合实施方式,对本发明作进一步地详细描述。
[0015] 首先,在采用SSH架构的物联网后台服务器(服务器使用X86或X64的平台,能够将大量的物联网数据(字节型数据)存入数据缓冲区)中内置由C语言编程实现的动态链接库。该动态链接库包括1个收发单元、n个数据缓冲区(可基于当前处理对象实时调整数据缓冲区的个数)、m个处理单元(可以根据处理器个数调整)和1个结果缓冲区(队列的形式,对处理结果实行先进先出),且n>m>1。具体实现时,收发单元、处理单元以线程的方式实现,为了便于后续描述,将收发单元、处理单元用收发线程、处理线程来表述,其初始状态均置为空闲。
[0016] 本发明中,网络数据接口(基于java编程实现)收到字节型数据后,并不直接处理,而是通过JNI接口发给动态链接库的收发线程,收发线程在状态为空闲的数据缓冲区中随机选择一个作为当前访问数据缓冲区,将当前接收的字节型数据存入当前访问数据缓冲区直到被饱和,此时将当前访问数据缓冲区的状态标记为饱和,同时向空闲状态的处理线程发送数据处理通知消息。在收发线程访问一个数据缓冲区时,需将其锁定,即除当前操作的线程外,限制其他线程对当前访问数据缓冲区的访问。
[0017] 收到数据处理通知消息的处理线程,则首先对饱和状态的数据缓冲区加锁,禁止其它线程访问,然后调用并行指令处理,对于X86或x64平台的服务器,可以使用MMX或SSE指令来并行进行数据处理,数据处理完成后,将处理结果存入结果缓冲区,并给当前数据缓冲区解锁,同时标记其状态为空闲。
[0018] 最后,由收发线程将结果缓冲区的数据基于先进先出的读取顺序读出并通过JNI接口存入物联网后台服务器的物理量数据库。
[0019] 在使用X86或64位平台(物联网后台服务器)的SSE指令进行数据处理时,由于java的跨平台特性,SSH高并发架构可以是windows平台也可以是linux平台,而C语言编写的动态链接库在windows下是dll格式,在linux下是so格式,其均能通过JNI接口供java层调用。SSE指令可以是独立的汇编文件也可以嵌入到C语言之中。指令的格式可以是intel格式也可以是AT&T格式,取决于所使用的系统和编译器。
[0020] 实施例
[0021] 以linux平台为例,选用是64位Ubuntu,版本为12.04,开发工具为eclipse 4.3,C语言编译器用的是gcc(linux下的C编译器),版本为4.8.4。数据处理对象以车联网的CAN(Controller Area Network)总线为例,车载OBD终端(以下简称终端)将原始的CAN报文信息发到物联网后台服务器(以下简称服务器),报文内容符合SAE J1939-71协议,下表给出了以发动机温度和油压两条报文示例。
[0022]
[0023]
[0024] 在以上两个报文中,每个报文有8个字节,第一个报文中字节1和2分别为冷却剂温度和燃料温度,都为单字节表示的物理量,字节3和4为双字节表示的发动机温度。第二个报文都是单字节表示的油压。这两个报文有8个字节需要处理。
[0025] 首先java中的minaServer(java中常用的网络通信框架)通过NioSocketAcceptor()方法创建一个非阻塞的物联网后台服务器端的socket,并调用bind()方法监听8011端口接收车载终端的socket请求。
[0026] 在Socket连接建立后,服务器的业务逻辑线程(服务器的现有处理线程)将接收到的报文保存到阻塞队列BlockingQueue中。
[0027] 服务器中的数据处理线程池中的消费者线程INFODeal(服务器的现有处理线程)的实例获取阻塞队列中的报文数据并通过JNI接口调用动态链接库进行数据解析。JNI模块中的交互类DataInteract中的4个本地方法:
[0028] (1)数据传递:将数组buf(用于存放表示物理量的字节型数据)传递给底层c语言处理,即将字节型数据传递给基于C语言编程实现的动态链接库;
[0029] (2)初始化:根据终端连接数(size)返回buffer长度,buffer的长度可调;
[0030] (3)结果读取:从结果缓冲区读取处理结果;
[0031] (4)退出:服务器关闭时释放底层分配的缓冲区空间。
[0032] 本实施例中,动态链接库设置8个数据缓冲区,6个处理线程,每个数据缓冲区有8个单元队列,每个单元队列对应CAN报文中对应的字节,各单元队列的长度可自适应确定,本实施例中将单元队列的长度设置为4096,即各单元队列中的数据由4096个字节组成,每个字节所对应的终端记录在预设数组中。通过JNI接口,对服务器通过网络数据接口传过来的字节型数据,由动态链接库的接收线程将其依次存入各个对应的单元队列中,当单元数据达到4096时,接收线程标记该数据缓冲区的状态为饱和,同时加锁后通知状态为空闲的处理线程来处理。以处理发动机油温的字节为例,将报文1的第3和4字节对应的单元队列(分别称为canEE_3和canEE_4队列)依次读入SSE指令的XMM寄存器中,系数和偏移量也读到XMM寄存器中,然后启动SSE指令进行数据处理。数据处理过程中,将canEE_3和canEF_4的4个字节分别读入寄存器单元xmm0和xmm1中,然后用punpcklbw指令将其拼接成4个短整型数,再用punpcklwd指令将其扩展成4个整型数,接着由cvtdq2ps指令转换成浮点数,最后进行浮点数乘法和加法操作。
[0033] 完成一次4个字节型数据的数据处理后,可循环向xmm0和xmm1中读入,直到单元队列中的字节型数据处理完毕。
[0034] 对于单字节物理量,可以将xmm1清空,然后操作方式同上述方式一致;对于整型数物理量,须将高16位数据按照上述方式拼接后,再使用punpcklwd指令与低16位拼接,其余操作都是一样。
[0035] 数据处理后的处理结果存放在结果缓冲区,等待java函数来取,即通过JNI接口将处理结果读取到物理数据库中。
[0036] 性能比较:
[0037] 服务器配置为:CPU(AMD Athon 4核)、内存(8G)、操作系统(Ubuntu 12.04)、应用软件(tomcat7.0)。在进行数据处理时,共选取15-20条CAN报文,平均每个终端每秒发送132个字节的数据,在模拟多个终端测试时,性能对比如下:
[0038]
[0039] 从上表可知,当终端数超过2000以后,使用纯java方式的CPU的使用率维持在20%左右,但此时丢包严重,很多数据没有来的及处理。因此若只采用java方式处理,则当终端数超过2000个时,系统就开始出现丢包情况,但CPU的利用率却只停留在20%左右,这是因为java中的浮点数运算要通过java虚拟机来做,要调用大量其它资源,造成CPU的较长时间的等待,而且多核的功能没有发挥出来。而发明的方案中,java只负责网络接收,数据处理由C+SSE指令完成,同时设置有多个数据缓冲区,并分配了多处理线程来执行对字节型数据的数据处理,可以充分使用CPU的功能,即使终端数目达到10000,系统依然能够处理。同时,本发明的方案还有较强的扩展能力,如果终端太多处理不过来,则可以增加CPU的核数或个数,增大数据缓冲区来完成,可以根据核数分配多个处理线程进行数据处理,充分利用系统的性能。
[0040] 以上所述,仅为本发明的具体实施方式,本说明书中所公开的任一特征,除非特别叙述,均可被其他等效或具有类似目的的替代特征加以替换;所公开的所有特征、或所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以任何方式组合。