[发明专利]一种基于用户空间事件过滤的提高网络程序处理速度的方法无效
申请号: | 201310431657.9 | 申请日: | 2013-09-22 |
公开(公告)号: | CN103514275A | 公开(公告)日: | 2014-01-15 |
发明(设计)人: | 王雷;吴兴博;龙翔 | 申请(专利权)人: | 北京航空航天大学 |
主分类号: | G06F17/30 | 分类号: | G06F17/30 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 100191*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 用户 空间 事件 过滤 提高 网络 程序 处理 速度 方法 | ||
技术领域
本文涉及一种基于用户空间事件过滤的提高网络程序处理速度的方法。
背景技术
网络是大数据和云计算时代提供大规模计算服务的一种基础设施,计算资源和数据资源分布在以网络连接的集群环境中,为其他节点提供服务在这种环境中是最常见的存在形式。NoSQL数据库是现在流行的数据存储与提供方法,其中,Key-Value存储是一种具有代表性的服务类型。Key-Value存储具有最简单的数据模型,即键-值一一对应存在,通过GET、SET等非常简单的访问方法提供服务,这类服务在NoSQL数据存储中具有速度快的代表特征,也反应了当今时代对数据访问性能的日益增高的需求。比较典型的NoSQL数据存储有:Dynamo、Voldermort、Cassandra、Memcached、Redis。在这类存储中,每次访问的数据传输量很小,常见的每个Key-Value对仅有几百字节,而每次访问都要进行多次的网络读写,频繁的网络IO的操作往往会成为性能瓶颈。
网络IO的效率可以通过IO复用技术来提高,通过IO复用技术,单一的线程能够同时处理多个网络连接,使得多个连接的处理流程流水线化,单一线程能够达到很高的吞吐量。但是在这种情况下,IO操作的频率也同比增高,单一时间内需要进行更多次的IO操作,在Linux操作系统中这一开销对应大量的系统调用。在实践中,效率最高的IO复用依赖Linux内核提供的epoll系统调用集合实现,主要API包括epoll_wait()、epoll_ctl()、read()、write()。epoll_ctl()调用的功能是调整应用程序对IO事件的兴趣类型,本身并不实际进行IO操作。在系统负载较高的情况下epoll_ctl()系统调用的次数能占所有系统调用的一半,而耗时也超过10%,这意味着,这10%的时间没有被花费在IO操作上,限制了系统能发挥的最大性能。
发明内容
本发明是一种基于用户空间事件过滤的提高网络程序处理速度的方法。本方法对网络IO的处理消耗较少的系统调用,提高了网络数据的处理频率,在处理大量并发连接的网络服务程序中,能提高系统吞吐量,尤其对于请求和回复都很小的负载样式,效果显著。处理过程如图1所示。
附图说明
图1为对一个连接进行处理的状态转换图。
具体实施方式
本发明在进行IO操作时的步骤如下:
使用Linux的Socket监听新的连接请求,一旦接到新的连接请求,就建立连接,并将Socket连接封装为文件描述符,后续的操作通过标准的文件描述符操作进行。新的连接都要被设置为非阻塞的IO模式。
使用epoll_create()系统调用创建一个epoll文件描述符,这个文件描述符将会关联所有已经建立的连接,为这些连接的IO时间产生通知事件。
在用户空间建立一个文件描述符到当前状态的映射数据结构,用于保存当前的文见描述符正在监听的IO事件(“可读”,“可写”)。
一旦新的连接建立好,就调用epoll_ctl()系统调用将这个连接的文件描述符关联到epoll文件描述符上。新建立的连接将IO事件设置为“可读”以及“可写”状态(READABLE)。设置完“可读”和“可写”状态后,在应用程序中记录相应的文件描述符和当前状态(“可读”)。
当映射中一个连接表示为“可读”的时候,当获取到一个表示“可读”的消息后,可以对相应的文件描述符进行读操作,通过read()系统调用读取数据,然后对读取的数据进行相应的处理。
当映射中一个连接表示为“可读”的时候,当应用程序获取到一个表示“可写”的消息后,根据应用程序中当前记录的状态,将“可写”消息忽略。继续处理新的消息。
当应用程序要向连接另一端发送通知或者数据,发送的消息要保存到一个消息暂存区内,每个连接对应一个独立的消息缓存区。
当消息缓存区中存在数据,应用程序将这个连接对应的文件描述符标记为“可读”并且“可写”的。
当消息缓存区中不存在数据,应用程序将这个连接对应的文件描述符标记为“可读”的。
当映射中一个连接表示为“可读”并且“可写”的时候,当获取到一个表示“可读”的消息后,可以对相应的文件描述符进行读操作,通过read()系统调用读取数据,然后对读取的数据进行相应的处理。
当映射中一个连接表示为“可读”并且“可写”的时候,当应用程序获取到一个表示“可写”的消息后,检查这个连接对应的写缓冲区是否有等待发送的数据,如果有数据在缓冲区中,那么调用write()系统调用将暂存的消息通过相应的fd发送出去。如果缓冲区中的数据过多,则一次只发送网络允许的最大长度的消息,然后更新缓冲区,保留未发送的消息,等待下次“可写”事件再发送剩下的数据。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京航空航天大学,未经北京航空航天大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201310431657.9/2.html,转载请声明来源钻瓜专利网。
- 上一篇:LD激光混相装置及方法
- 下一篇:偏振光调制相衬显微镜