libeasy网络框架简介

TFS目前使用的网络框架是tbnet,tbnet包含一个IO线程,负责接收新的连接,处理已建立连接上的请求(包含网络包的序列化和反序列化);IO线程接收网络请求包后,可以选择直接由IO线程处理,也可以将其push到一个请求队列,由后端的工作线程池处理。tbnet的主要问题在于只有一个线程负责网络IO,会受到单个CPU的处理能力限制,发挥不了多核的优势。

enter image description here

TFS的dataserver是IO密集型服务,主要瓶颈不在CPU上,而在处理IO上(慢请求),使用tbnet框架非常合适;而nameserver(NS)则不同,其频率最高的请求是”查询block的副本位置信息”,请求处理逻辑简单,很快就能结束,这种”快请求”如果加到请求队列,再由后端的工作线程处理,入队、出队的开销都快赶上了服务请求的开销。

NS上的快请求最好是在IO线程里直接处理,但tbnet的IO线程只有一个,导致NS的处理能力受限;为解决这个问题,最近将NS的网络框架替换为libeasy。相比tbnet,libeasy包含多个IO线程,每个IO线程都能接受并处理网络请求,IO线程之间相互独立(libeasy实际上是基于libev的一个封装,每个IO线程对应libev的一个event loop)。

enter image description here

对于慢请求,如果直接在IO thread里处理,则会导致这个IO线程”假阻塞”,该IO线程后续请求都需要排队等待;libeasy同样采用队列的方式来解决这个问题,先将慢请求加入请求队列(注:图中的Request Queue可能是多个队列),再由后端的单独的线程池来处理。

ref:
2014-07-28
blog.yunnotes.net

0 回复
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。