阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Memcached的内存管理与删除机制

105次阅读
没有评论

共计 4253 个字符,预计需要花费 11 分钟才能阅读完成。

简介

注意:Memcache 最大的 value 也只能是 1M 的空间,超过 1M 的数据无法保存(修改 memcache 源代码)。

注意:内存碎片化永远都存在,只是哪一种方式可以使得内存碎片最小。

1. 什么是内存碎片化?

在使用这种内存缓存系统的时候,由于不断的申请,释放,就会形成一些很小的内存片段,无法被利用,这种现象就叫做,内存的碎片化。这个小块就是操作系统无法使用的空间。

Memcached 的内存管理与删除机制    注意:内存碎片化永远存在,无法消除,但是可以利用最好的算法,降到最低。

注意:磁盘也是存在碎片化

Memcached 的内存管理与删除机制

2. 如何解决?

memcache 利用 slab allocator 的方式来管理(每个 slab class 大小为 1M

最小的单元叫做 chunk(小块):存放数据的仓库

多个小单元组成一个 chunks:多个小块组成(所有的小块的大小全部一致)

每个 slab class 的大小为 1M

注意:单个 chunk 最大只能为 1M,也就是 memcache 的 value 值最大为 1M

Memcached 的内存管理与删除机制

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

Memcached 的内存管理与删除机制

注意:如果 122Bytes 的 slab 装满了,现在有一个 100Bytes 的数据来了,存到哪里去?

答:肯定不会存在 144,还是存在 122 这个 chunk 里面,利用 LRU 算法 来实现数据存储。

LRU 算法:最近最少使用原则。最近一段时间来,哪一个数据基本完成没有被使用过,则就清除掉这个数据。然后让新数据放到里面。

 

但是,固定 chunk 带来的内存浪费,如下 22B

Memcached 的内存管理与删除机制

 

4. factor 调优

Memcached 的内存管理与删除机制

memcached 在启动的时候,会按照一定的大小来组织 slab class,可以通过 -f 来指定

默认是 1.3,相邻 chunk 之间的比值就是增加因子。可以根据自己网站的业务调整缓存因子的大小

Memcached 的内存管理与删除机制

是因为每个业务不一样,所需要的最小的 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 服务器上获取数据

分布式算法

  1. 取摸算法

    将 key 的值对服务器的 台数 取模,然后将对应的 value 值保存到对应的余数的那台 memcache 服务器上,一般这个 hash 函数 crc32(key) % 3

    crc32()这个函数可以使得一个字符串变成一个 32 位的整数

     

    坏处:当某一台服务器宕机或者需要增加一台服务器的时候,这个时候缓存数据基本全部失效,因为除数变了。不严格的公式,命中率 = 取到数据 / 总数 1/N N 代表服务器的台数

     

    引发出来的问题:当 memcache 宕机之后,缓存数据失效,这个时候 MySQL 的压力会骤增,

    这个时候,MySQL 会宕机,然后在重启 MySQL,MySQL 会在短时期内再次宕机,然后,稍微延迟一点(缓存已经重新建立了一部分),又宕机。随着时间的慢慢推移,MySQL 基本上趋于稳定,缓存系统成功建立。

    因为缓存数据不存在,所有的请求全部要转向 MySQL 来提供,这种现象就叫做 memcache 的 雪崩现象

     

    概图:

    Memcached 的内存管理与删除机制

     

    实操:

  2. 使用分布式缓存

    Memcached 的内存管理与删除机制

  3. 从分布式获取

    Memcached 的内存管理与删除机制

  4. 效果

    Memcached 的内存管理与删除机制

     

     

  5. 一致性 hash 实现分布式

    Memcached 的内存管理与删除机制

  6. 设置一个 0 – 2^32 次方的圆环
  7. 将服务器的 IP 通过某种 hash 函数(crc32)映射为圆环上点(服务器的位置)
  8. 将数据的 key 也安装 hash 函数运算,从起点 0 开始,按照圆环顺时针方向旋转,将对应的值保存到不比自己小的一个服务器位置上。

    好处:当某一台服务器宕机之后,数据的影响是最小的,只影响当前这一台服务器上的数据。

    缓存雪崩现象

    由于某个 memcache 节点的缓存数据失效,导致其他 memcache 节点的缓存命中率下降,缓存中缺失的数据会去 MySQL 数据库中查询,短时期内,造成了 MySQL 服务器压力巨大,���成宕机,就叫做 缓存雪崩现象

    雪崩造成的原因?

  9. 由于算法不当,取摸算法,造成大量缓存失效,会引发雪崩

    解决方案:一致性 hash 算法

  10. 缓存时间都是同一时间,缓存系统会在同一时间全部失效,这个也会造成雪崩

    解决方案:缓存时间设置成一个范围内的随机时间(3- 9 小时)

    memcache 如何做高可用

  11. 使用 repcached 实现,全称 replication cached 是由日本人发明的 memcached 的高可用性技术,简称复制缓冲区技术。
  12. MemcacheDB是一个分布式、key-value 形式的 持久存储系统 由 sina 人员开发。它不是一个缓存组件,而是一个基于对象存取的、可靠的、快速的持久存储引擎。协议跟 memcache 一致(不完整),所以很多 memcached 客户端都可以跟它连接。MemcacheDB 采用 Berkeley DB 作为持久存储组件,故很多 Berkeley DB 的特性的他都支持。

    扩展

  13. 如何在 Linux 下给一个 php 添加一个扩展,说出 通用步骤(redis)

    答:

    1. 下载对应扩展源码
    2. 上传放入 /usr/local/src/
    3. 解压 并进入文件夹内
    4. 在文件夹内执行 绝对路径下的 phpize /usr/local/php/bin/phpize
    5. 执行 configure ./configure –with-php-config=/usr/local/php/bin/php-config
    6. make && make install
    7. 生成一个目录文件,文件下面有一个.so 结尾的文件
    8. 修改 php.ini 文件
    9. 增加 extension_dir = 目录 extension= .so 文件
    10. 重启 Apache
    11. 添加 phpinfo()
    12. 浏览器查看
  14. memcache 的安全性如何解决?

    答:

    由于 memcache 的本身设计就是极为简洁的,根本没有设置权限方面的限制。为什么不设置权限?只提供缓存功能,为了精简

  15. 放在内网 192.168.1.110 内网 IP 外网无法访问
  16. 写一个 防火墙验证规则,只允许自己规定 IP 的包可以转进来,其他的全部丢弃

    3. 当使用 文件 保存 session 文件时候,如果文件过多,如何处理?

    一般来说,超过 65535 个 session 文件的时候,这个时候 session 的获取就会变得异常缓慢,意味 php 代码执行很慢,如何解决?

    答:

    分层处理:一个文件夹下建立 A - Z 开头的文件夹 然后 A_Z 在建立

    使用 memcache 处理:单台 memcache 处理能力有限,就使用分布式 memcache 来处理

CentOS 6.6 下 Memcached 源码安装配置  http://www.linuxidc.com/Linux/2015-09/123019.htm

Memcached 安装及启动脚本 http://www.linuxidc.com/Linux/2013-07/87641.htm

PHP 中使用 Memcached 的性能问题 http://www.linuxidc.com/Linux/2013-06/85883.htm

Ubuntu 下安装 Memcached 及命令解释 http://www.linuxidc.com/Linux/2013-06/85832.htm

Memcached 的安装和应用 http://www.linuxidc.com/Linux/2013-08/89165.htm

使用 Nginx+Memcached 的小图片存储方案 http://www.linuxidc.com/Linux/2013-11/92390.htm

Memcached 使用入门 http://www.linuxidc.com/Linux/2011-12/49516p2.htm

Memcached 的详细介绍:请点这里
Memcached 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-04/129962.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计4253字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中