- 浏览: 1431862 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (363)
- oracle (43)
- 缓存策略 (4)
- 数据库设计 (7)
- IntelliJ IDEA (8)
- freemarker (3)
- JSP (12)
- java基础 (75)
- tomcat (14)
- 服务器 (10)
- maven (3)
- linux (21)
- e-learning (2)
- 手机开发 (1)
- 设计模式 (6)
- 技术之外 (2)
- 工具的使用 (8)
- HTML 5 (5)
- 网站前台 (38)
- 网站后台 (11)
- 项目管理 (12)
- 面试题 (5)
- 幽默 (0)
- 系统架构 (8)
- 创业 (10)
- div-css (5)
- 诗词歌赋 (1)
- 网络课堂组知识库 (4)
- 杂家 (3)
- android (12)
- 框架 (14)
- 读书笔记 (1)
- 孙子兵法 (1)
- mysql (3)
- 小人书 (0)
- Jquery (6)
- eclipse (2)
- 正则表达式 (1)
最新评论
-
a98709474:
写的很详细,看完了,明白了这种概念了
数据库水平切分(拆库拆表)的实现原理解析(转) -
a98709474:
MYSQL分库分表总结 -
CatchU:
7年前的招聘要求,厉害厉害
面试要求 -
luozhixiong:
<table class="bbcode&qu ...
MYSQL分库分表总结 -
沈寅麟:
好用
freemarker格式化
Memcached,人所皆知的remote distribute cache,曾经我也看过很多剖析memcached内部机制的文章,有一点收获,但是看过之后又忘记了,而且没有什么深刻的概念,但是最近我遇到一个问题,这个问题迫使我重新来认识memcache,下面我阐述一下我遇到的问题
问题:我有几千万的数据,这些数据会经常被用到,目前来看,它必须要放到memcached中,以保证访问速度,但是我的memcached中数据经常会有丢失,而业务需求是memcached中的数据是不能丢失的。我的数据丢失的时候,memcached server的内存才使用到60%,也就是还有40%内存被严重的浪费掉了。但不是所有的应用都是这样,其他应用内存浪费的就比较少。为什么内存才使用到60%的时候LRU(Least Recently Used)就执行了呢(之所以确定是LRU执行是因为我发现我的数据丢失的总是前面放进去的,而且这个过程中,这些数据都没有被访问.
带着这些疑问,我开始重新审视memcached这个产品,首先从它的内存模型开始:我们知道c++里分配内存有两种方式,预先分配和动态分配,显然,预先分配内存会使程序比较快,但是它的缺点是不能有效利用内存,而动态分配可以有效利用内存,但是会使程序运行效率下降,memcached的内存分配就是基于以上原理,显然为了获得更快的速度,有时候我们不得不以空间换时间。
也就是说memcached会预先分配内存,对了,memcached分配内存方式称之为allocator,首先,这里有3个概念:
1: slab
2: page (每个slab下默认有1m个page)
3: chunk
解释一下,一般来说一个memcahced进程会预先将自己划分为若干个slab,每个slab下又有若干个page,每个page下又有多个chunk,如果我们把这3个咚咚看作是object得话,这是两个一对多得关系。再一般来说,slab得数量是有限得,几个,十几个,或者几十个,这个跟进程配置得内存有关。而每个slab下得page默认情况是1m,也就是说如果一个slab占用100m得内存得话,那么默认情况下这个slab所拥有得page得个数就是100,而chunk就是我们得数据存放得最终地方。
从上面得示例slab 1一共有1m得内存空间,而且现在已经被用完了,slab2也有1m得内存空间,也被用完了,slab3得情况依然如此。 而且从这3个slab中chunk得size可以看出来,第一个chunk为80b,第二个是100b,第3个是128b,基本上后一个是前一个得1.25倍,但是这个增长情况我们是可以控制得,我们可以通过在启动时得进程参数 –f来修改这个值,比如说 –f 1.1表示这个增长因子为1.1,那么第一个slab中得chunk为80b得话,第二个slab中得chunk应该是80*1.1左右。
解释了这么多也该可以看出来我遇到得问题得原因了,如果还看不出来,那我再补充关键的一句:memcached中新的value过来存放的地址是该value的大小决定的,value总是会被选择存放到chunk与其最接近的一个slab中,比如上面的例子,如果我的value是80b,那么我这所有的value总是会被存放到1号slab中,而1号slab中的free_chunks已经是0了,怎么办呢,如果你在启动memcached的时候没有追加-M(禁止LRU,这种情况下内存不够时会out of memory),那么memcached会把这个slab中最近最少被使用的chunk中的数据清掉,然后放上最新的数据。这就解释了为什么我的内存还有40%的时候LRU就执行了,因为我的其他slab中的chunk_size都远大于我的value,所以我的value根本不会放到那几个slab中,而只会放到和我的value最接近的chunk所在的slab中(而这些slab早就满了,郁闷了)。这就导致了我的数据被不停的覆盖,后者覆盖前者。
问题:我有几千万的数据,这些数据会经常被用到,目前来看,它必须要放到memcached中,以保证访问速度,但是我的memcached中数据经常会有丢失,而业务需求是memcached中的数据是不能丢失的。我的数据丢失的时候,memcached server的内存才使用到60%,也就是还有40%内存被严重的浪费掉了。但不是所有的应用都是这样,其他应用内存浪费的就比较少。为什么内存才使用到60%的时候LRU(Least Recently Used)就执行了呢(之所以确定是LRU执行是因为我发现我的数据丢失的总是前面放进去的,而且这个过程中,这些数据都没有被访问.
带着这些疑问,我开始重新审视memcached这个产品,首先从它的内存模型开始:我们知道c++里分配内存有两种方式,预先分配和动态分配,显然,预先分配内存会使程序比较快,但是它的缺点是不能有效利用内存,而动态分配可以有效利用内存,但是会使程序运行效率下降,memcached的内存分配就是基于以上原理,显然为了获得更快的速度,有时候我们不得不以空间换时间。
也就是说memcached会预先分配内存,对了,memcached分配内存方式称之为allocator,首先,这里有3个概念:
1: slab
2: page (每个slab下默认有1m个page)
3: chunk
解释一下,一般来说一个memcahced进程会预先将自己划分为若干个slab,每个slab下又有若干个page,每个page下又有多个chunk,如果我们把这3个咚咚看作是object得话,这是两个一对多得关系。再一般来说,slab得数量是有限得,几个,十几个,或者几十个,这个跟进程配置得内存有关。而每个slab下得page默认情况是1m,也就是说如果一个slab占用100m得内存得话,那么默认情况下这个slab所拥有得page得个数就是100,而chunk就是我们得数据存放得最终地方。
从上面得示例slab 1一共有1m得内存空间,而且现在已经被用完了,slab2也有1m得内存空间,也被用完了,slab3得情况依然如此。 而且从这3个slab中chunk得size可以看出来,第一个chunk为80b,第二个是100b,第3个是128b,基本上后一个是前一个得1.25倍,但是这个增长情况我们是可以控制得,我们可以通过在启动时得进程参数 –f来修改这个值,比如说 –f 1.1表示这个增长因子为1.1,那么第一个slab中得chunk为80b得话,第二个slab中得chunk应该是80*1.1左右。
解释了这么多也该可以看出来我遇到得问题得原因了,如果还看不出来,那我再补充关键的一句:memcached中新的value过来存放的地址是该value的大小决定的,value总是会被选择存放到chunk与其最接近的一个slab中,比如上面的例子,如果我的value是80b,那么我这所有的value总是会被存放到1号slab中,而1号slab中的free_chunks已经是0了,怎么办呢,如果你在启动memcached的时候没有追加-M(禁止LRU,这种情况下内存不够时会out of memory),那么memcached会把这个slab中最近最少被使用的chunk中的数据清掉,然后放上最新的数据。这就解释了为什么我的内存还有40%的时候LRU就执行了,因为我的其他slab中的chunk_size都远大于我的value,所以我的value根本不会放到那几个slab中,而只会放到和我的value最接近的chunk所在的slab中(而这些slab早就满了,郁闷了)。这就导致了我的数据被不停的覆盖,后者覆盖前者。
发表评论
-
打印IP 来源
2014-10-16 22:07 946<% String userAgent = reques ... -
java 写文本换行
2014-08-08 18:34 1977import org.apache.commons.io.Fi ... -
DBCP连接池配置示例
2014-06-17 11:44 1247<bean id="dataSourceOra ... -
CGLIB与asm
2014-05-05 14:42 1349“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言 ... -
201404转成 2014.04
2014-03-31 17:45 999public static void main(Str ... -
取出 字符串中的 网址
2013-10-15 17:47 1269public static void main(Str ... -
java反国际化
2013-09-23 18:10 1017public static String fromEn ... -
AtomicInteger与Volatile修饰
2013-02-05 11:50 6049今天写代码,尝试使用了AtomicInteger这个类,感觉 ... -
ExecutorService线程池
2013-02-05 11:40 1625http://blog.sina.com.cn/s/blog ... -
web.xml中load-on-startup的作用
2012-12-24 10:06 1665如下一段配置,熟悉DWR的再熟悉不过了: <servle ... -
最新版本
2012-09-13 09:28 1013Java SE 7u7 apache-tomcat-7.0. ... -
格式化数字
2012-09-10 20:12 907public static void main(Str ... -
用apache common io包获得文件扩展名
2012-09-09 23:11 1372apache common io包包含了很多非常实用的工具类, ... -
值传递,引用传递
2012-07-28 23:29 1146java 对于 8种基本类型 和 他们的包装类型 , 外 ... -
代码之丑
2012-07-07 22:01 2400原文:http://www.infoq.com/cn/news ... -
Memcache
2012-06-27 09:36 1046Memcache是一个高性能的分布式的内存对象缓存系统,通过在 ... -
ActiveMQ
2012-06-14 15:09 15160ActiveMQ 是Apache出品,最流行的,能力强劲的开源 ... -
proxool配置
2012-06-12 11:43 1186项目结构 所需jar包 proxool.prope ... -
各种文件的注释
2012-04-23 10:44 1012<%-- comment --%> JSP注释,也称为“隐藏注 ... -
List排序
2012-03-27 20:18 1204集合类List存放的数据,默认是按照放入时的顺序存放的,比如依 ...
相关推荐
标题提到的"memcached server"指的是这个服务端程序,用于在多台服务器之间共享数据,通过缓存常用数据来提升整体性能。版本1.2.6是其历史的一个稳定版本,尽管现在已经有了更新的版本,但这个版本依然具有一定的...
sc delete "Memcached Server" memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d ...
- **LRU(Least Recently Used)**: 当内存空间不足时,Memcached会采用LRU策略,优先淘汰最近最少使用的数据。 ### 5. 安全性与性能优化 - **安全性**: 默认情况下,Memcached不提供任何安全机制,所有数据都是...
mon-cache 是 mongoose 缓存到 redis、memcached 或 lru-cache。 这利用了 npm 模块缓存客户端。 初始化 lru缓存 options = { store : "memory" } ; require ( 'mon-cache' ) ( mongoose , options ) ; Redis ...
1.Memcached 安装、部署、Demo程序 ...5.SQL Server Change Tracking集成Memcached 6.项目应用(IM基础数据缓存,例:Category、Brand、Manufacturer等) 7.了解Memcached实现机制,数据模型并做培训
4. **LRU(Least Recently Used)策略**:当内存空间不足时,memcached会使用LRU策略淘汰最近最少使用的item,以腾出空间给新的请求。 5. **线程模型**:memcached采用单线程模型,通过非阻塞I/O和事件驱动模型来...
sc delete "Memcached Server" memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d ...
### Memcached内存分析、调优、集群:深入理解与实践 #### 1. Memcached背景与概述 Memcached是一款高性能的分布式内存缓存服务器,它最初由LiveJournal的运营人员开发,现已成为开源社区中不可或缺的一部分。其...
sc delete "Memcached Server" memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 ...
- **LRU(Least Recently Used)机制**: 当内存不足时,memcached采用LRU算法自动删除最少最近使用的数据项。 #### memcached的发展方向 - **二进制协议**: 新版本的memcached支持更高效的二进制协议,可以提高...
### Memcached内存分析、调优、集群 #### 1. Memcached背景 Memcached是一款高性能的分布式内存对象缓存系统,旨在通过减轻数据库负载来加速动态Web应用的响应速度。它通过在内存中缓存数据和对象来减少读取数据库...
**Windows Server 上的 Memcached 安装与使用详解** Memcached 是一款高性能、分布式内存对象缓存系统,常用于减轻数据库负载,提升Web应用的性能。在Windows Server环境下,我们同样可以利用Memcached来实现数据...
- **缓存策略**:如LRU(最近最少使用)或LFU(最不经常使用)的实现。 - **分片和负载均衡**:在多台服务器上部署memcached,以提高可扩展性。 7. **异常处理**:处理连接错误、超时等问题的方法。 8. **性能...
当内存不足时,Memcached会使用LRU(Least Recently Used)策略进行数据淘汰,优先移除最近最少使用的数据。 **二、主要特性** 1. **分布式**: Memcached 不依赖于特定的硬件或软件环境,它可以根据服务器集群的IP...
总结,通过深入分析Memcached的源代码,我们可以了解到其高效运行背后的设计思想和技术实现,这对于优化缓存性能、解决实际问题以及理解分布式系统有着极大的帮助。对于开发者而言,这是一份宝贵的参考资料,能...
通过对memcached的线程模型和网络事件处理的分析,我们可以看到其高效的设计:主线程与工作线程的分离,确保了连接建立的快速响应和连接处理的并发性。libevent的事件驱动模型,则使得memcached能够灵活、高效地处理...
4. **缓存策略**:支持LRU(Least Recently Used)最近最少使用算法,当内存满时自动淘汰较旧的数据。 5. **持久化**:虽然默认不支持数据持久化,但可以通过第三方工具或插件实现数据备份和恢复。 在实际应用中,...
3. **空间管理**:Memcached采用LRU(Least Recently Used)策略来处理内存满的情况,即最近最少使用的数据会被优先淘汰。 **三、Memcached的安装与配置** 在多数操作系统上,可以通过包管理器安装Memcached,例如...