如何修改memcache内存大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修改memcache内存大小相关的知识,希望对你有一定的参考价值。

将memcache服务器安装包解压到C:\memcached文件夹后,使用cmd命令窗口安装。

1>开始>运行:CMD(确定)

2>cd C:\memcached(回车)

3>memcached -d install(回车 这步执行安装)

4>memcached -d start(回车 这步执行启动memcache服务器,默认分配64M内存,使用11211端口)

此时memcache服务器已经可以正常使用了。

由于32位系统只能处理4G内存的寻址,所以在大于4G内存使用PAE的32位服务器上可以运行2-3个进程,并在不同端口进行监听。

又如:memcached -d -m 10 -u root -l 192.168.105.73 -p 12000 -c 256 -P /tmp/memcached.pid

[plain] view plaincopy
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.105.73 ,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid

memcache服务器安全:

Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。

现在就关于修改memcache服务器配置的问题说明如下:

1>用内网ip的方式提供web应用服务器调用,不允许直接通过外网调用,如将memcache服务器放在192.168.1.55的服务器上

2>修改端口,如改为11200

3>分配内存,如分配1024M(1G内存)

方法如下:
1>开始>运行:regedit(回车)

2>在注册表中找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server

3>默认的ImagePath键的值是:"c:\memcached\memcached.exe" -d runservice,改为:"c:\memcached\memcached.exe" -d runservice -m 512 -p 11200 -l 192.168.1.55(确定,关闭注册表)

4>我的电脑(右键)>管理>服务 找到memcache的服务,重新启动一次即可生效。
可以使用php写的 MemAdmin 来监控memcahce运行状态
原文地址:http://blog.csdn.NET/leiyonglin/article/details/6921134
参考技术A memcache 本身是一款分布式的高速缓存系统,以 key-value 的形式常驻内存,一般用来做网站或者数据库的缓存使用。
特别是对以下场景非常适合用 memcache 来做缓存:
1. 频繁访问的数据2. 安全性要求比较低的数据
3. 更新比较频繁的小表(用户状态表、物品库存等)

谈谈 Memcached LRU

一. Memcached 内存结构


可以看出 Memcached 将内存分为一个一个 slab class,slab class 没有大小,所有的 slab class 加起来就是 Memcached 启动时设置的内存大小。slab class 里面有 slab page,slab class 大小由 slab page 个数决定,默认的 slab page 为 1M,可以在启动 Memcached 时设置。slab page 里又分为同等大小的 chunk,chunk 就是存储缓存的基本单元,chunk 大小,不同 slab class 的 page 大小一致,但是 chunk 大小不一致,默认 class1 的 chunk 大小为 96 byte,不同 class 的 chunk 大小由启动时设置的 factor 系数决定,下一个 class 的 chunk 是上一个 class 的 chunk 的 1.25 倍(默认是 1.25)。


Memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。


      Slab Allocator的基本原理是按照预先规定的大小,将分配的内存以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定,分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配,以解决内存碎片问题。



二. 如何分配

Memcached在启动时通过-m参数指定最大使用内存,但是这个不会一启动就占用完,而是逐步分配给各slab的。如果一个新的数据要被存放,首先选择一个合适的slab(存入的数据大小和 chunk 大小最接近,这样可以减少内部碎片的浪费),然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请,slab申请内存时以page为单位,无论大小为多少,都会有1M大小的page被分配给该slab(该page不会被回收或者重新分配,永远都属于该slab)。申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,再从这个chunk数组中选择一个用于存储数据。若没有空闲的page的时候,则会对改slab进行LRU,而不是对整个memcache进行LRU。(PS:局部 LRU)



三. 面临的问题

在这样的内存结构和内存分配的策略上,会有一些典型的问题,比如 Memcached 还有一般的空闲内存,但是进行了 LRU,原因就是某些缓存数据大小相近的都是分配在某个 slab class 上,这些数据又是热数据,又不断有加入的新数据,因为是局部 LRU,所以导致在这个 slab class 上频繁进行 LRU,但是其他 slab class 里面却有大量空闲空间。这样的情况如果频繁,可以考虑调小 factor,这样大小类似的数据可能会分配到不同的 slab class 上,减少 LRU 情况。



以上是关于如何修改memcache内存大小的主要内容,如果未能解决你的问题,请参考以下文章

memcache的内存管理机制

memcached写数据时存在并发问题吗

如何修改pycharm占用的内存大小

谈谈 Memcached LRU

IDEA 修改内存大小

memcached学习——memcached的内存分配机制Slab Allocation内存使用机制LRU常用监控记录