很早就想看看memcached的源代码,比较关系其多线程处理模型、内存管理机制。由于各种原因,都没有实施。今天抽时间看了一下,主要是看了多线程模型部分。觉得有两篇博客介绍还是比较全面的,对于学习还是很有帮助的。
a:
Memcached源码分析(线程模型): 讲的比较全面,但是感觉贴的代码有点多(数据结构的代码)。
b:memcache 线程模型。
总体下来觉得:
1. 基于libevent 实现事件的异步处理,性价比高(实现的复杂度和效率对比);
2. 采用线程池的工作模型,主线程负责accept, 工作线程处理连接请求;主线程和工作线程之前采用管道实现事件通知,并且通知是轮训实现的避免了惊群;
3. 每个工作线程有各自的待处理连接队列,各工作线程与主线程实现生产者消费者模型,简洁高效;
4. 连接会有缓存(还有其他),避免了内存频繁后手分配,有助性能提升,特别是对频繁的短连接效果更佳。
因为最近项目中也用到了libevent及相关的线程模型(类mysqlproxy),这里做个简单的对比:
1. 我们也是采用线程池,主线程负责accept,然后通知工作线程处理连接请求。但是我们的待处理时间队列是同一个,锁粒度会大很多!!(这个我们需要改进)
2. 相对于路由层来说,memcache只是管理一侧的连接(client到自身)相对来说比较简单,dbproxy因为要管理两侧的连接的状态,因而读写状态机处理稍微复杂一些。