`

memcached server LRU 深入分析

阅读更多
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早就满了,郁闷了)。这就导致了我的数据被不停的覆盖,后者覆盖前者。


  • 大小: 39 KB
分享到:
评论

相关推荐

    memcached安装及java应用使用memcached

    - **缓存策略**:如LRU(最近最少使用)或LFU(最不经常使用)的实现。 - **分片和负载均衡**:在多台服务器上部署memcached,以提高可扩展性。 7. **异常处理**:处理连接错误、超时等问题的方法。 8. **性能...

    memcached源码

    **Memcached 源码分析** Memcached 是一个高性能、分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升应用性能。它的工作原理是将数据存储在内存中,以便快速访问,从而减轻数据库的压力。在1.4.14...

    Redis 27道面试题及答案.docx

    它的全称是Remote Dictionary Server,它不仅支持简单的字符串数据类型,还支持诸如List、Set、Sorted Set和Hashes等丰富的数据结构。这使得Redis能够胜任更多复杂的任务,例如实现消息队列、标签系统、计数服务等。...

    大型网站架构演变和知识体系

    当系统中存在大量重复的数据请求时,引入数据缓存机制(如 Memcached 或 Redis)能显著提高性能。这一步涉及缓存架构设计,包括数据结构选择(如 Map)、缓存替换策略(如 FIFO、LRU 或 LFU)、缓存框架的使用和优化...

    面试突击班3.4redis知识讲解.zip

    Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,常被用于数据库、缓存和消息中间件等场景。在求职面试中,对Redis的深入理解和熟练掌握往往是技术面试的重要部分。以下是对Redis相关知识点的...

    45道阿里Redis面试题这四大知识点你又知道多少.docx

    根据给定文件的信息,本文将围绕Redis的基础概念、集群配置及使用、分布式锁以及与MySQL结合的应用场景等四大核心知识点进行深入探讨。 ### 一、Redis基础概念 #### 1. Redis简介及其优缺点 - **定义**:Redis...

    热redis面试题汇总

    Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,常被用于数据库、缓存和消息中间件等场景。由于其速度快、功能丰富、易用性好,Redis在IT行业中备受青睐,尤其是在互联网和大数据领域。面试时,...

    分布式JAVA应用基础与实战

    10. **监控与日志**:Zabbix、Prometheus和Grafana等工具用于分布式系统的性能监控,ELK(Elasticsearch、Logstash、Kibana)组合用于日志收集和分析,以便及时发现并解决问题。 11. **容器化与Docker**:Docker...

Global site tag (gtag.js) - Google Analytics