【Ceph 】Async Messenger代码跟踪--OSD

目录

一、前置知识

1、ceph Async 模型

2、Async Messenger机制图

二、代码跟踪

1、Server

1)Initialization

2)Bind and Listen

 3)Deal with Event

4)Add Listen Fd

5)Accept Connection

6)Add Accept Fd

7)Communication

2、Client

3、Summary

三、RDMA messenger

 with InfiniBand RDMA  architecture 

  with InfiniBand RDMA  architecture 


原文:http://blog.wjin.org/posts/ceph-async-messenger.html

作于December 28, 2015,比较老,有一定的参考意义,但应该与现在的有一定差异。

一、前置知识

1、ceph Async 模型

ceph Async的IO 多路复用多线程模型

说明:

每个worker 有一个eventCenter,一条workerThread线程。workerpool管理着多个worker,AsyncConnection在创建时根据负载均衡绑定到对应的Worker中。

在Ceph Async模型里,一个Worker类对应一个工作线程和一个事件中心EventCenter。 每个socket对应的AsyncConnection在创建时根据负载均衡绑定到对应的Worker中,以后都由该Worker处理该AsyncConnection上的所有的读写事件。

2、Async Messenger机制图

图:

建立连接后的sd与worker的绑定

Fig. 1. Placement rule of workers and connections in async messenger

一个进程里只有一个workerpool,即使多个messager也是共享一个,里面包含有多个worker,一个worker一个thread,worker内一个eventcenter,eventcenter管理epoll

Overall structure of Ceph async messenger

通信流图:

Communication process using Async messenger in Ceph

如图所示,在Ceph Async模型里,没有单独的main_loop线程,每个工作线程都是独立的,其循环处理如下:

  1. epoll_wait 等待事件
  2. 处理获取到的所有IO事件
  3. 处理所有时间相关的事件
  4. 处理外部事件

这里写图片描述

在这个模型中,消除了Half-sync/half-async的 队列互斥访问和 线程切换的问题。 本模型的优点本质上是利用了操作系统的事件队列,而没有自己去处理事件队列。

二、代码跟踪

研究对象:源码在文件src/ceph_osd.cc。

1、Server

服务端需要监听端口,等待连接请求到来,然后接受请求,建立连接,进行通信。

1)Initialization

以osd进程为例,在进程启动的过程中,会创建Messenger对象,用于管理网络连接,监听端口,接收请求,源码在文件src/ceph_osd.cc:

int main(int argc, const char **argv) 
{
  ......

  // public用于客户端通信
  Messenger *ms_public = Messenger::create(g_ceph_context, g_conf->ms_type,
					   entity_name_t::OSD(whoami), "client",
					   getpid());

  // cluster用于集群内部通信
  Messenger *ms_cluster = Messenger::create(g_ceph_context, g_conf->ms_type,
					    entity_name_t::OSD(whoami), "cluster",
					    getpid());
  /*
 Messenger *ms_hb_back_client  = Messenger::create();
 Messenger *ms_hb_front_client = Messenger::create();
 Messenger *ms_hb_back_server  = Messenger::create();
 Messenger *ms_hb_front_server = Messenger::create();
 Messenger *ms_objecter        = Messenger::create();
*/
  ......
}
//src/msg/Messenger.cc
Messenger *Messenger::create(CephContext *cct, const string &type,
			     entity_name_t name, string lname,
			     uint64_t nonce)
{
  ......

  // 在src/common/config_opts.h文件中,目前需要配置async相关选项才会生效
  // OPTION(enable_experimental_unrecoverable_data_corrupting_feat
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值