浏览 4373 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-10
memcached在编译时候可以选择多线程和单线程两种模式,默认是单线程,不过在多核情况下,建议使用多线程方式,线程数推荐为cpu数。 由上图,很容易分析出memcached的主要流程 1 初始化 1.1 在主线程中创建一个event_base , 监听connect/read 事件,主线程即是acceptor又是worker; 1.2 创建一个连接队列Connection_Queue 1.3 如果是多线程模式,则创建子线程,子线程中有自己的event_base,监听read事件,子线程不处理connect请求。 2 处理建链请求 2.1 libevent将connect转发给主线程,调用主线程的event_handler方法; 2.2 从conneciton_queue中获取一个connection_queue_item , 如果没有空闲的item,则创建一个; 2.3 循环选择一个worker(包括主线程自己); 2.4 往目标worker的pipe写一个消息,告诉worker,这个新建的connection就交给你监控了。 3 处理命令 和client建立的socket已经分配给某个worker,由该worker的event_base使用reactor模式,依次处理其监控的socket上read事件。 memcached的实现特点 1. 主线程同时兼作acceptor/worker两个角色,很容易在单线程/多线程模式中切换; 2. 没有使用half async/half sync模式,直接在io线程中处理命令,这是和memcached的业务逻辑简单相关的,简化了系统机构的同时保证了高性能。 3. 在同一个socket上,命令处理是按顺序的,这是一个非常重要的特性,很有发挥余地,呵呵。 memcached的通讯层设计的非常好,有时间把这部分单独抽取出来,再加一个线程池,就可以满足大多数情景的需求了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-21
老大,memcached在编译时候怎么选择多线程和单线程模式?
|
|
返回顶楼 | |
发表时间:2008-10-22
liuye 写道 老大,memcached在编译时候怎么选择多线程和单线程模式? ./configure --enable-threads |
|
返回顶楼 | |