memcache中的网络IO、多线程、锁
来源:互联网 发布:莱恩安德森季后赛数据 编辑:程序博客网 时间:2024/06/15 20:10
有效使用网络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 Socket
UDP是无连接的数据包服务,可以多个线程同时读写同一UDP套接口,系统保证并发的安全性。memcache为了提高UDP的服务能力,利用了该特征。主线程建立UDP套接口后,会将该套接口注册到工作线程池中数个工作线程,具体数量可由memcache启动参数指定,默认是注册到工作线程池中所有线程。来自UDP链路上的请求由多个工作线程处理。
3. TCP Socket
监听TCP协议的服务请求。主线程建立TCP监听套接口并负责accept该监听套接口上的网络连接请求。每accept一个TCP连接都注册到工作线程池中某个特定工作线程,之后该连接上的请求由工作线程处理,这点跟Unix域套接口处理相同。
http://blog.sina.com.cn/s/blog_9170a8de01019afz.html
- memcache中的网络IO、多线程、锁
- IO、网络、多线程模型总结
- 网络编程中的IO复用
- 网游服务器网络层IO多线程
- 网络编程基础(4) : IO多路复用(多线程)
- Java网络编程-IO多路复用(多线程)
- 关于LINUX网络编程中的IO 操作
- 网络编程中的5种IO模型
- memcache 多线程 并发模型
- 城市天气查询(Java网络、面向对象、多线程、IO)
- IO流、多线程、网络、XML以及反射的基本知识
- memcache(1)网络模型
- 多线程在网络编程中的应用
- 网络爬虫中的那些多线程设计模式
- 网络爬虫中的那些多线程设计模式
- 网络IO
- PHP中的Memcache详解
- PHP中的Memcache详解
- Parse error: syntax error, unexpected T_STRING in \\e\\data\\tmp\\templist2.php on line 159
- 帝国CMS常用PHP变量查看
- ECMS开启模板支持程序代码$navinfor[字段名]
- 帝国CMS恭喜您,该目录不存在
- 【转载】数据库锁机制
- memcache中的网络IO、多线程、锁
- linux 重启apache命令
- jvisualvm 插件下载主页
- mysql 创建事务及查看表信息(存储引擎等基本信息)
- 如何找哪些连接出长时间持有着某个锁?
- mysql事务隔离级别设置与查看
- mysql事务隔离级别举例
- 乐观锁与悲观锁
- MYSQL事务与锁,需要手动加锁吗?