一种高吞吐数据流处理方法技术

技术编号:15653368 阅读:84 留言:0更新日期:2017-06-17 07:54
本发明专利技术公开了一种高吞吐数据流处理方法,通过异步数据接收的方式对数据接收和处理,使用少量的接收线程应对尽可能多的客户端发送请求,充分利用接收线程的cpu时间,提升系统整体吞吐率;对接收的数据通过无锁的任务调度方法尽可能快的将其送入业务处理线程进行处理,减少锁开销,保证数据处理的实时性;另外,由于数据接收是一种IO密集型操作,而数据处理是一种cpu密集型操作,将两层分离,分别运行在不同范围的cpu核上,保证数据的接收和处理过程互不干扰,不会出现数据处理线程长时间占用cpu,数据接收线程得不到系统调度运行的情况,而且,接收线程数和处理线程数比例可根据业务需求配置平衡,充分利用系统的cpu和内存资源。

【技术实现步骤摘要】
一种高吞吐数据流处理方法
本专利技术涉及高性能网络流量处理领域,具体涉及一种高吞吐数据流处理方法。
技术介绍
在目前的网络项目中,经常会进行多层次的架构设计,如分为前端数据采集层、数据汇聚和处理层、数据存储层等,处于数据汇聚和处理层上的服务器通常需要处理几百个前端的连接,上千兆比特每秒的瞬时流量,并且还存在“浪涌”现象,即流量的峰谷值相差巨大,峰值流量过大导致服务器接收和处理数据不及时,甚至宕机,因此对服务器提出了较高的性能要求。为了保证实时、可靠的接收和处理来自前端服务器的数据流,目前已有的方案主要是对数据汇聚和处理层的服务器进行硬件扩容,利用服务器集群来保证高吞吐数据的实时处理,但是这并不能充分发挥服务器的单机处理能力,造成了资源的浪费。为了提高服务器单机的数据接收和处理能力,目前设计架构时的常见的方法有:(1)接收线程对应客户端,每个接收线程对应唯一的接收队列,对应唯一的处理线程:这种方法适用于每个客户端不间断发送大量数据流给汇聚服务器,缺点是单客户端对应了单一的接收线程和单一的处理线程,不能够平衡接收线程数和处理线程数的比例,当接收数据的速度大于处理数据的速度时,会造成接收队列积压数据,处理不及时;当接收队列的速度远小于处理数据的速度时,造成处理线程数过多,资源浪费;(2)接收线程对应客户端,每个接收线程对应唯一的接收队列,使用处理线程池,加锁形式读写队列数据:这种方法在接收数据时,单客户端对应单一的接收线程和接收队列,处理数据时,采用处理线程池,接收线程加写锁对队列写入数据,处理线程加读锁和互斥锁读出数据进行处理。这种方式的缺点是当客户端处于间歇式的发送数据时,接收线程数过多,造成资源浪费;另外频繁的加锁和解锁造成额外的开销,导致性能的降低;(3)接收线程池,对应若干接收队列,使用处理线程池,加锁形式读写队列数据:这种方式在接收数据时使用了线程池,客户端不再对应唯一的接收线程,并通过异步的方式快速从系统缓冲区中读取数据,避免了IO阻塞等待;处理时采用了线程池,可以配置接收线程和处理线程的比例,缺点是接收线程池和处理线程池对队列处于多读多写的方式,需要加互斥锁,造成的系统开销较大。
技术实现思路
针对上述已有方法存在的缺点和问题,本专利技术公开了一种高吞吐数据流处理方法。为了实现上述目的,本专利技术采用以下技术方案:一种高吞吐数据流处理方法,具体步骤包括:(1)读入接收层,调度层,业务层和转发层的配置参数;(2)根据读入的配置参数,创建接收层的客户端状态维护线程、监听线程、读写事件监控线程、数据接收线程,业务层的业务线程,调度层的调度线程,转发层的发送线程;并将上述不同的线程分别绑定到不同的cpu核心上运行;(3)如果有客户端请求连接,则通过监听线程判断接收的是否是合法的套接字,将合法的套接字加入套接字监听集合并在客户端状态表中记录该套接字的索引位置,已接收数据长度,时间戳和客户端计数器;如果套接字监听集合中有套接字状态改变,则通过读写事件监控线程判断套接字监听集合中状态发生改变的套接字是否产生读写事件,并将产生读事件的套接字放入待接收套接字队列中;如果待接收套接字队列不为空,则通过数据接收线程从待接收套接字队列中取出套接字,并将从客户端状态表中获取的该套接字的完整数据包放入数据接收队列,同时更新客户端状态表中该套接字的已接收数据长度和时间戳;客户端状态维护线程遍历客户端状态表中每个套接字的时间戳,如果套接字接收的时间戳超过预设的超时时间,则关闭该套接字,并删除该套接字在客户端状态表中的数据信息;如果数据接收队列不为空,调度线程则从数据接收队列中取出数据,放入对应的任务队列;如果任务队列不为空,业务处理线程则从自己对应的任务队列中取出任务数据进行处理,并将缓存的处理结果放入结果队列;如果结果队列不为空,发送线程采用轮询的方式从各个结果队列中取出数据发送给远端系统,在读结果队列时加读锁和互斥锁,完成后解锁。进一步地,步骤(1)中,所述参数包括:接收层可使用的cpu核心数recv_cpu_num,接收层线程数recv_thread_num,接收队列的长度recv_q_len,监听的端口号recv_listen_port,接收数据超时时间recv_timeout;调度层可使用的cpu核心数move_cpu_num,调度层线程数move_thread_num;业务层可使用的cpu核心数bsns_cpu_num,业务层线程数bsns_thread_num,任务队列的长度bsns_task_q_len,结果队列的长度bsns_result_q_len;转发层可使用的cpu核心数send_cpu_num,转发层线程数send_thread_num,转发目的IP及端口send_dst_ip/send_dst_port,响应http报文长send_back_http_len。进一步地,步骤(2)中,将不同的线程分别绑定到不同的cpu核心上运行包括以下几种情况:(2.1)如果recv_cpu_num等于1,那么客户端状态维护线程、监听线程、读写事件监控线程、数据接收线程都绑定于0号核心;(2.2)如果recv_cpu_num大于1,那么客户端状态维护线程、监听线程绑定于0号核心,读写事件监控线程、数据接收线程绑定于1~recv_cpu_num-1号核心;(2.3)如果move_cpu_num大于等于1,那么调度线程都绑定于recv_cpu_num~recv_cpu_num+move_cpu_num-1号核心;(2.4)如果bsns_cpu_num等于1,那么所有业务线程都绑定于recv_cpu_num+move_cpu_num核心上;(2.5)如果bsns_cpu_num大于1,那么应急业务线程绑定于recv_cpu_num+move_cpu_num号核心,其他业务线程绑定于recv_cpu_num+move_cpu_num+1~recv_cpu_num+move_cpu_num+bsns_cpu_num-1号核心;(2.6)如果send_cpu_num大于等于1,那么所有的发送线程都绑定于recv_cpu_num+move_cpu_num+bsns_cpu_num~recv_cpu_num+move_cpu_num+bsns_cpu_num+send_cpu_num-1号核心。进一步地,步骤(2)中,将不同的线程分别绑定到不同的cpu核心运行的方法,包括:Linux系统下使用API:pthread_setaffinity_np(),Windows系统下使用API:SetThreadAffinityMask()。进一步地,步骤(3)中,将合法的套接字加入套接字监听集合的同时,在客户端状态表中,将该套接字索引位置设置为1,表示有效,将该套接字已接收数据长度重置为0,时间戳设置为当前时间,客户端计数器加1。进一步地,步骤(3)中,所述读写事件监控线程遍历套接字监听集合中每个状态发生改变的套接字,判断套接字是否产生读事件,如果是,则将该套接字在状态表中的时间戳更新为当前时间,并将该套接字放入待接收套接字队列,如果待接收套接字队列已满,则将套接字重新放入套接字监听集合,并记录待接收套接字队列满的日志信息;如果套接字产生的是本文档来自技高网
...
一种高吞吐数据流处理方法

【技术保护点】
一种高吞吐数据流处理方法,具体步骤包括:(1)读入接收层,调度层,业务层和转发层的配置参数;(2)根据读入的配置参数,创建接收层的客户端状态维护线程、监听线程、读写事件监控线程、数据接收线程,业务层的业务线程,调度层的调度线程,转发层的发送线程;并将上述不同的线程分别绑定到不同的cpu核心上运行;(3)如果有客户端请求连接,则通过监听线程判断接收的是否是合法的套接字,将合法的套接字加入套接字监听集合并在客户端状态表中记录该套接字的索引位置,已接收数据长度,时间戳和客户端计数器;如果套接字监听集合中有套接字状态改变,则通过读写事件监控线程判断套接字监听集合中状态发生改变的套接字是否产生读写事件,并将产生读事件的套接字放入待接收套接字队列中;如果待接收套接字队列不为空,则通过数据接收线程从待接收套接字队列中取出套接字,并将从客户端状态表中获取的该套接字的完整数据包放入数据接收队列,同时更新客户端状态表中该套接字的已接收数据长度和时间戳;客户端状态维护线程遍历客户端状态表中每个套接字的时间戳,如果套接字接收的时间戳超过预设的超时时间,则关闭该套接字,并删除该套接字在客户端状态表中的数据信息;如果数据接收队列不为空,调度线程则从数据接收队列中取出数据,放入对应的任务队列;如果任务队列不为空,业务处理线程则从自己对应的任务队列中取出任务数据进行处理,并将缓存的处理结果放入结果队列;如果结果队列不为空,发送线程采用轮询的方式从各个结果队列中取出数据发送给远端系统,在读结果队列时加读锁和互斥锁,完成后解锁。...

【技术特征摘要】
1.一种高吞吐数据流处理方法,具体步骤包括:(1)读入接收层,调度层,业务层和转发层的配置参数;(2)根据读入的配置参数,创建接收层的客户端状态维护线程、监听线程、读写事件监控线程、数据接收线程,业务层的业务线程,调度层的调度线程,转发层的发送线程;并将上述不同的线程分别绑定到不同的cpu核心上运行;(3)如果有客户端请求连接,则通过监听线程判断接收的是否是合法的套接字,将合法的套接字加入套接字监听集合并在客户端状态表中记录该套接字的索引位置,已接收数据长度,时间戳和客户端计数器;如果套接字监听集合中有套接字状态改变,则通过读写事件监控线程判断套接字监听集合中状态发生改变的套接字是否产生读写事件,并将产生读事件的套接字放入待接收套接字队列中;如果待接收套接字队列不为空,则通过数据接收线程从待接收套接字队列中取出套接字,并将从客户端状态表中获取的该套接字的完整数据包放入数据接收队列,同时更新客户端状态表中该套接字的已接收数据长度和时间戳;客户端状态维护线程遍历客户端状态表中每个套接字的时间戳,如果套接字接收的时间戳超过预设的超时时间,则关闭该套接字,并删除该套接字在客户端状态表中的数据信息;如果数据接收队列不为空,调度线程则从数据接收队列中取出数据,放入对应的任务队列;如果任务队列不为空,业务处理线程则从自己对应的任务队列中取出任务数据进行处理,并将缓存的处理结果放入结果队列;如果结果队列不为空,发送线程采用轮询的方式从各个结果队列中取出数据发送给远端系统,在读结果队列时加读锁和互斥锁,完成后解锁。2.如权利要求1所述的高吞吐数据流处理方法,其特征在于,步骤(1)中,所述参数包括:接收层可使用的cpu核心数recv_cpu_num,接收层线程数recv_thread_num,接收队列的长度recv_q_len,监听的端口号recv_listen_port,接收数据超时时间recv_timeout;调度层可使用的cpu核心数move_cpu_num,调度层线程数move_thread_num;业务层可使用的cpu核心数bsns_cpu_num,业务层线程数bsns_thread_num,任务队列的长度bsns_task_q_len,结果队列的长度bsns_result_q_len;转发层可使用的cpu核心数send_cpu_num,转发层线程数send_thread_num,转发目的IP及端口send_dst_ip/send_dst_port,响应http报文长send_back_http_len。3.如权利要求2所述的高吞吐数据流处理方法,其特征在于,步骤(2)中,将不同的线程分别绑定到不同的cpu核心上运行包括以下几种情况:(2.1)如果recv_cpu_num等于1,那么客户端状态维护线程、监听线程、读写事件监控线程、数据接收线程都绑定于0号核心;(2.2)如果recv_cpu_num大于1,那么客户端状态维护线程、监听线程绑定于0号核心,读写事件监控线程、数据接收线程绑定于1~recv_cpu_num-1号核心;(2.3)如果move_cpu_num大于等于1,那么调度线程都绑定于recv_cpu_num~recv_cpu_num+move_cpu_num-1号核心;(2.4)如果bsns_cpu_num等于1,那么所有业务线程都绑定于recv_cpu_num+move_cpu_num核心上;(2.5)如果bsns_cpu_num大于1,那么应急业务线程绑定于recv_cpu_num+move_cpu_num号核心,其他业务线程绑定于...

【专利技术属性】
技术研发人员:葛瑞海张永铮庹宇鹏
申请(专利权)人:中国科学院信息工程研究所
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1