您的位置:首页 > 理论基础 > 计算机网络

memcache中的网络IO、多线程、锁

2013-12-09 10:52 225 查看
有效使用网络IO,CPU资源对于大规模的服务器性能有着重要的影响,本文记录memcache对网络IO和CPU的使用方法。
线程memcache实现为多线程模型,线程可划分为以下4种:1. 主线程,负责memcache服务器初始化,监听TCP、Unix Domain连接请求;2. 工作线程池,memcache默认4个工作线程,可通过启动参数修改,负责处理TCP、UDP,Unix域套接口链路上的请求;3. assoc维护线程,memcache内存中维护一张巨大的hash表,该线程负责hash表动态增长;4. slab维护线程,即内存管理模块维护线程,负责class中slab的平衡,memcache启动选项中可关闭该线程。
memcache默认有7个线程,4个主要的工作线程,3个辅助线程。
锁memcache代码中大量使用锁,而且锁的范围很大,这点很糟糕。memcache中的锁主要可划分为以下几种:1. slabs lock全局锁,每次内存管理模块申请,释放内存,slab维护线程工作都需要获取slabs lock;2. stats lock数据统计锁,每个工作线程各有单独的stats lock;3. cache lock全局锁,内存中hash表的操作需持有该锁;4. conn lock全局锁,listen socket操作时需持有该锁;5. item lock锁,memcache创建大量的item lock锁,对k-v操作时,对k进行hash,然后取对应的item lock锁
网络IO模型memcache使用libevent开源组件构建高效的网络IO处理模型。
memcached进程启动时根据启动参数可能初始化3种网络IO,分别如下:1. Unix Domain Socket监听来自本机其它进程的服务请求,适用于当memcache和业务进程部署在同一物理主机的情景。主线程建立一个Unix域套接口,并让主线程监听来自该套接口的连接请求。收到客户连接之后,将连接随机注册到工作线程池中某个特定工作线程,之后该连接上的请求由工作线程处理。
2. UDP SocketUDP是无连接的数据包服务,可以多个线程同时读写同一UDP套接口,系统保证并发的安全性。memcache为了提高UDP的服务能力,利用了该特征。主线程建立UDP套接口后,会将该套接口注册到工作线程池中数个工作线程,具体数量可由memcache启动参数指定,默认是注册到工作线程池中所有线程。来自UDP链路上的请求由多个工作线程处理。
3. TCP Socket监听TCP协议的服务请求。主线程建立TCP监听套接口并负责accept该监听套接口上的网络连接请求。每accept一个TCP连接都注册到工作线程池中某个特定工作线程,之后该连接上的请求由工作线程处理,这点跟Unix域套接口处理相同。http://blog.sina.com.cn/s/blog_9170a8de01019afz.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: