libeasy网络框架简介
libeasy网络框架简介
libeasy是一个基于事件驱动模型的网络框架,在设计上支持多个网络I/O线程,并通过每个线程对应一个event loop来实现高效的事件处理。与传统如tbnet、muduo等框架不同的是,libeasy特别注重将业务逻辑与网络层分离,并通过管道机制实现线程间的唤醒与通信。具体来说,在业务逻辑线程监听管道读端时触发I/O线程的唤醒机制:当I/O线程接收数据时会将数据写入管道写端并返回任务链表执行任务。这种设计不仅提升了系统的可扩展性还缓解了单个IO线程对多核环境的性能限制问题。
从应用角度来看TFS中的数据服务器(dataserver)由于其主要瓶颈在于IO操作因此更适合采用tbnet这样的单一IO线程架构;而nameserver(NS)由于其高频率的快速查询请求则需要一个更高效的处理机制因此被替换为基于libev封装的 libeasy 框架。相比于传统框架 libeasy 通过支持多个独立的IO线程实现了更好的负载均衡和资源利用率同时也在快请求处理上进行了优化以减少队列开销从而提升了整体性能表现。
参考资料:
http://www.cnblogs.com/foxmailed/archive/2013/02/17/2908180.html
http://blog.yunnotes.net/index.php/libeasyarch
libeasy网络框架简介
**
**
libeasy主要是一个用于构建高性能计算系统的开放源代码库。该系统采用模块化架构设计,在资源管理方面实现了高度并行性与灵活性。具体而言,在处理多路异步通信时会创建多个独立运行的网路接口实例,并通过独立的事件循环来处理这些网路接口上的异步操作请求。在软件开发层面采用组件化的架构设计模式,并支持多种不同的网路协议栈接口配置选择以及网路协议动态注册机制。
libeasy不同于其它的网络框架比如tbnet,muduo。tbnet,muduo等网络框架的目的就是向应用层暴露出简单的发包和收包的接口,让应用层从底层发包和收包的处理细节中解放出来,使得应用层能更加专注于业务逻辑的实现,为了做到这些,网络框架帮助应用程序管理连接,管理输入输出缓冲区,处理具体的发包收包等细节和错误的处理,处理流控,并且允许应用层注入封包,解包,新建连接时处理,断开连接时处理,收到包后处理包的逻辑等。libeasy与这些网络框架稍不同,从高层次看,libeasy中的线程分为业务逻辑线程和网络I/O线程,无论哪种线程,线程都有唯一的一个event loop,工作的时候,I/O线程和网络I/O线程有对应关系,他们之间通过pipe来实现线程的唤醒,原理就是业务逻辑线程的event loop监听pipe的读端,当I/O线程A接收到包的时候,往pipe的写端写入数据,业务逻辑线程event loop返回,从任务链表中取任务执行。可以说,libeasy已经超出了网络框架的范畴,但是libeasy也支持和普通的网络框架一样,仅仅使用网络 I/O线程部分。
当前TFS采用的网络架构为tbnet。其核心组件包括一个专门负责接收新连接并处理已建立连接上的请求(涉及网络包的序列化与反序列化)的一级io线程。当io线程接收到网络请求包时,可选择直接由其进行处理也可将其入队至一个请求队列由后端的工作线程池负责处理。该架构的主要缺陷在于仅配备单个io线程导致其在多核处理器环境下未能充分发挥多核计算的优势。

TFS的数据服务器是以IO密集型服务为基础设计的;该服务器的主要性能瓶颈并非来自于CPU资源受限制,而是集中在对大量I/O操作进行高效处理上,尤其是针对延迟较大的请求数量(即慢请求数量)。相比之下, nameserver(NS)的功能则完全不同,其最频繁出现的请求数量为"获取块副本位置信息"类型;这类请求数量具有相对简单的处理逻辑,一旦完成即能迅速终止响应流程;特别地,将此类快速响应的需求加入到整体请求数列中,并由后端的工作线程负责处理相关事务,这样带来的入队与出队操作开销几乎能够赶上服务总请求数量所引发的操作开销。
对于NS层的快速数据包的处理效率而言,在IO线程中进行直接处理更为理想。然而,在TBNET架构中,由于其单线程设计限制了网络层(NS)处理能力。这使得NS层的整体性能受到制约。为此,针对这一问题提出了解决方案:最近的研究团队已将NS网络框架进行了重构。与TBNET相比的新一代框架libeasy采用了模块化的架构设计——它不仅增加了多条IO线程的支持,并且每个IO线程能够独立地接收和处理数据包。值得注意的是(libeasy实际上是基于libev的一个封装),每个IO线程对应一个事件循环(event loop)。

对于处理缓慢的I/O请求而言,在单个IO线程中进行操作会导致该线程出现"伪阻塞"现象,并使得后续的所有I/O操作都必须依次排队等待;而libeasy则采用了类似的策略,在系统设计上也进行了优化。通过将所有需要排队的I/O操作收集到一个队列中,并通过将所有需要排队的I/O操作收集到一个队列中,并由后端独立设置的一个专门线程池来处理这些任务。
参考资料:
http://www.cnblogs.com/foxmailed/archive/2013/02/17/2908180.html
