memcached的内存管理与删除机制
memcached的内存管理与删除机制
简介
注意:Memcache最大的value也只能是1M的空间,超过1M的数据无法保存(修改memcache源代码)。
注意:内存碎片化永远都存在,只是哪一种方式可以使得内存碎片最小。
1. 什么是内存碎片化?
在使用这种内存缓存系统的时候,由于不断的申请,释放,就会形成一些很小的内存片段,无法被利用,这种现象就叫做,内存的碎片化。这个小块就是操作系统无法使用的空间。
注意:内存碎片化永远存在,无法消除,但是可以利用最好的算法,降到最低。
注意:磁盘也是存在碎片化

2. 如何解决?
memcache利用slab allocator的方式来管理(每个slab class大小为1M)
最小的单元叫做 chunk(小块):存放数据的仓库
多个小单元组成一个chunks:多个小块组成(所有的小块的大小全部一致)
每个 slab class的大小为1M
注意:单个chunk 最大只能为 1M,也就是memcache的value值最大为1M

3. memcache如何选择合适的大小?

注意:如果 122Bytes的slab装满了,现在有一个100Bytes的数据来了,存到哪里去?
答:肯定不会存在144,还是存在122这个chunk里面,利用LRU算法来实现数据存储。
LRU算法:最近最少使用原则。最近一段时间来,哪一个数据基本完成没有被使用过,则就清除掉这个数据。然后让新数据放到里面。
但是,固定chunk带来的内存浪费,如下22B

4. factor调优

memcached在启动的时候,会按照一定的大小来组织slab class,可以通过-f 来指定
默认是1.3,相邻chunk之间的比值就是增加因子。可以根据自己网站的业务调整缓存因子的大小。

是因为每个业务不一样,所需要的最小的chunk是不一样的。这个参数使得我们的系统变得更加适应自己的业务,因为数据可以自己设定大小。
5. memcache的惰性删除
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种行为被称为lazy(惰性)expiration。因此,好处是memcached不会在过期监视上耗费CPU时间。
比如:有 set(name, asion, 0, 3600) 过了3600秒就失效,失效后,并不会自动删除,只有当get查询时,检测是否过期,如果过期则删除,填充新的数据
6. memcache的LRU算法
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。
顾名思义,这是删除"最近最少使用"的记录的机制。因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空
间分配给新的记录。从缓存的实用角度来看,该模型十分理想。
当mecache里面的数据空间(默认是64M)已经占满了,再继续存储数据能否存储呢?
答:能存储,要删除过期的数据,如果都没有过期,则删除最不活跃的数据,腾出空间给后面添加数据。
例如:以122Bytes的slab举例,当数据装满后,如果来了一个100Bytes数据,如何处理?
分析:内存的管理 LRU算法 、FIFO算法(基本不用)
7. memcache的一些参数
注意:在vim下如果输入了 ctrl+s 可以使用 ctrl+q 退出
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
注意:如果系统是32位的,则最大限制为2G,如果系统是64位,则无限制。
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是3
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
-v 输出警告和错误信息
-vv 打印客户端的请求和返回信息
-i 打印memcached和libevent的版权信息
高级特性
分布式memcache配置
什么是分布式?
答:由于单台memcache的服务能力有限(单台服务器的内存大小是有限的),可以使用多台memcache来提供缓存的功能,这种架构就叫做memcache的分布式缓存系统。
如何实现?
答:在客户端实现分布式(就是在php程序端实现对数据进行分布式保存,php程序决定数据保存众多分布式服务器中的其中一台),在数据保存之前,根据一定的算法,将数据保存到那台memcache服务器上,在获取数据的时候,按照前面相同的算法去对应的memcache服务器上获取数据
分布式算法
- 取摸算法
将key的值对服务器的台数取模,然后将对应的value值保存到对应的余数的那台memcache服务器上,一般这个hash函数 crc32( key ) % 3
crc32()这个函数可以使得一个字符串变成一个32位的整数
坏处:当某一台服务器宕机或者需要增加一台服务器的时候,这个时候缓存数据基本全部失效,因为除数变了。 不严格的公式, 命中率 = 取到数据/总数 1/N N代表服务器的台数
引发出来的问题:当memcache宕机之后,缓存数据失效,这个时候MySQL的压力会骤增,
这个时候,MySQL会宕机,然后在重启MySQL,MySQL会在短时期内再次宕机,然后,稍微延迟一点(缓存已经重新建立了一部分),又宕机。随着时间的慢慢推移,MySQL基本上趋于稳定,缓存系统成功建立。
因为缓存数据不存在,所有的请求全部要转向MySQL来提供,这种现象就叫做memcache的雪崩现象。
概图:

实操:
- 使用分布式缓存

- 从分布式获取

- 效果

- 一致性hash实现分布式

- 设置一个 0 - 2^32次方的圆环
- 将服务器的IP通过某种hash函数(crc32)映射为圆环上点(服务器的位置)
- 将数据的key也安装hash函数运算,从起点0 开始,按照圆环顺时针方向旋转,将对应的值保存到不比自己小的一个服务器位置上。
好处:当某一台服务器宕机之后,数据的影响是最小的,只影响当前这一台服务器上的数据。
缓存雪崩现象
由于某个memcache节点的缓存数据失效,导致其他memcache节点的缓存命中率下降,缓存中缺失的数据会去MySQL数据库中查询,短时期内,造成了MySQL服务器压力巨大,造成宕机,就叫做缓存雪崩现象。
雪崩造成的原因?
- 由于算法不当,取摸算法,造成大量缓存失效,会引发雪崩
解决方案:一致性hash算法
- 缓存时间都是同一时间,缓存系统会在同一时间全部失效,这个也会造成雪崩
解决方案:缓存时间设置成一个范围内的随机时间(3-9小时)
memcache如何做高可用
- 使用repcached实现,全称 replication cached是由日本人发明的memcached的高可用性技术,简称复制缓冲区技术。
- MemcacheDB是一个分布式、key-value形式的持久存储系统。由sina人员开发。它不是一个缓存组件,而是一个基于对象存取的、可靠的、快速的持久存储引擎。协议跟memcache一致(不完整),所以很多memcached客户端都可以跟它连接。MemcacheDB采用Berkeley DB作为持久存储组件,故很多Berkeley DB的特性的他都支持。
扩展
- 如何在Linux下给一个php添加一个扩展,说出通用步骤(redis)?
答:
- 下载对应扩展源码
- 上传放入/usr/local/src/
- 解压 并进入文件夹内
- 在文件夹内执行 绝对路径下的 phpize /usr/local/php/bin/phpize
- 执行configure ./configure --with-php-config=/usr/local/php/bin/php-config
- make && make install
- 生成一个目录文件,文件下面有一个.so 结尾的文件
- 修改php.ini文件
- 增加 extension_dir = 目录 extension= .so文件
- 重启Apache
- 添加 phpinfo()
- 浏览器查看
- memcache的安全性如何解决?
答:
由于memcache的本身设计就是极为简洁的,根本没有设置权限方面的限制。为什么不设置权限? 只提供缓存功能,为了精简
- 放在内网 192.168.1.110 内网IP外网无法访问
- 写一个防火墙验证规则,只允许自己规定IP的包可以转进来,其他的全部丢弃
3. 当使用文件保存session文件时候,如果文件过多,如何处理?
一般来说,超过65535个session文件的时候,这个时候session的获取就会变得异常缓慢,意味php代码执行很慢,如何解决?
答:
分层处理: 一个文件夹下建立A-Z开头的文件夹 然后A_Z在建立
使用memcache处理: 单台memcache处理能力有限,就使用分布式memcache来处理
memcached的内存管理与删除机制的更多相关文章
- memcached整理の内存管理及删除机制
内存的碎片化 如果用C语言直接malloc,free来向操作系统申请和释放内存时,在不断申请和释放的过程中,形成了一些很小的内存片段,无法再利用.这种空闲但无法利用内存的现象称为内存的碎片化. sla ...
- memcached 的内存管理与删除机制
1:内存的碎片化 如果用 c 语言直接 malloc,free 来向操作系统申请和释放内存时, 在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用. 这种空闲,但无法利用内存的现象,--- ...
- Memcached 之内存管理与删除机制
一.内存的碎片化 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用,这种空闲,但无法利用内存的现象称为内存的碎片化 ...
- MC的内存管理和删除机制
先看一下,什么叫做内存的碎片化: 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时, 在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用. 这种空闲,但无法利用内存的 ...
- Linux内存管理3---分页机制
1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...
- JVM内存管理及GC机制
一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露 ...
- [CLR via C#]21. 自动内存管理(垃圾回收机制)
目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...
- 【摘录】JAVA内存管理-JVM垃圾收集机制
很多公司都有自己的JVM实现,被Oracle收购的sun公司开发的JVM实现名为HotSpot.这一实现是我们最常用到的. 还有哪些JVM实现呢?比较有名的有Oracle之前收购的BEA公司(就是以前 ...
- Memcached源码分析之内存管理
先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...
随机推荐
- RCP 项目启动图片设置
第一步 选择启动图片命名为 splash.bmp 第二步 添加 扩展点 然 后在右边的扩展元素细节中填入相应的信息,比如我们在这里的application属 性 为 org.vwpolo.rcp.ex ...
- 15,scrapy中selenium的应用
引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生如果直接用scrapy对其url发请求,是获取不到那部分动态加载出来的数据值,但是通过观察会发现,通过浏览器 ...
- Sicily 8843 Ranking and Friendship
http://soj.me/8843 题意:几个人想做好朋友,朋友之间相差位置小于等于k,且长度相同分析:排序,将长度相同的放在一起.若长度相同,第i个人能放进去的条件是位置相差下雨等于k. ...
- datagrid的修改和删除功能的实现
1.修改 双击,进入一行的编辑状态的功能的实现 2.删除 3.扩展easyui的datagrid,添加动态增加或删除Editor的方法 (1)背景要求: 对于某一列,比如密码,动态增加时候,是可以编辑 ...
- 拼多多2018校招编程题汇总 Python实现
题目原址 列表补全 在商城的某个位置有一个商品列表,该列表是由L1.L2两个子列表拼接而成.当用户浏览并翻页时,需要从列表L1.L2中获取商品进行展示.展示规则如下: 用户可以进行多次翻页,用offs ...
- URIs, URLs, and URN
首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源.而URL是uniform resource locator,统一资源定位器,它是一种具体 ...
- 导入goshop2(复制自己看)
1.goshop2采用了分布式的架构,很好的使用dubbo集成了服务.导入goshop2需要注意的事项如下: 1.1基本模块的架构: goshop-common开头的为项目的通用配置 goshop-s ...
- linux常用命令(复制)
显示目录和文件的命令 Ls:用于查看所有文件夹的命令. Dir:用于显示指定文件夹和目录的命令 Tree: 以树状图列出目录内容 Du:显示目录或文件大小 修改目录,文件权限和属主及数组命令 ...
- grep_awk_sed文本处理
小技巧 1.删除0字节文件find -type f -size 0 -exec rm -rf {} \; 2.查看进程按内存从大到小排列ps -e -o “%C : %p : %z : %a”|sor ...
- 第四篇:python基础_4
本篇内容 名称空间与作用域 闭包函数 装饰器 迭代器 生成器 三元表达式 列表解析 生成器表达式 一. 名称空间与作用域 1.名称空间 存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方 ...