设为首页 收藏本站
查看: 650|回复: 0

[经验分享] 深入研究memcache 特性和限制

[复制链接]

尚未签到

发表于 2015-11-18 09:32:59 | 显示全部楼层 |阅读模式
特性和限制
  在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
  Memcached单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个Memcached进程,最大30天的数据过期时间,设置为永久的也会在这个时间过期
  常量REALTIME_MAXDELTA 60*60*24*30控制最大键长为250字节,大于该长度无法存储
  常量KEY_MAX_LENGTH 250控制单个item最大数据是1MB,超过1MB数据不予存储
  常量POWER_BLOCK 1048576进行控制,它是默认的slab大小 最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,通过settings.maxconns=1024 进行控制跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48,影响slab的数据占用和步进方式memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。
  memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。  

memcached作为小规模的数据分布式平台是十分有效果的。
  memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。

/usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
  -d选项是启动一个守护进程,  

-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,  

-u是运行Memcache的用户,我这里是root,  

-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,  

-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,  

-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,  

-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,
  2)如果要结束Memcache进程,执行:

kill `cat /tmp/memcached.pid`
  Memcache使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。

Memcache的存储涉及到slab,page,chunk三个概念。  

1.Chunk为固定大小的内存空间,默认为96Byte。  

2.page对应实际的物理空间,1个page为1M。  

3.同样大小的chunk又称为slab。  

Memcached再启动的时候根据-n和-f参数,产生若干slab。具体应用中Memcache每次申请1page,并将这1M空间分割成若干个chunk,这些chunk有着同样的大小,属于同一个slab。
【添加】
  通过memcache添加item的时候:  

1. Memcache计算item的大小(key+value+flags),选取合适的slab(刚好能放下该item的slab)  

2. 如果这个item对应的slab未出现过,则申请1个page(注意,这1M空间不论是否达到memcached使用内存都可以申请成功)并加该item存入slab中的chunk  

3. 如果item对应的slab出现过,则在该slab中优先选择expired(free_chunks)和delete(在1.2.2中delete的chunk存在着不能被重复利用的问题)的chunk进行存储,其次将选择未使用过的chunk(free_chunks_end)进行存储。  

4. 如果item对应的slab出现过,但是对应的slab已经存储满了,那么会申请一个新的page,这个page被分为对应大小的chunk,继续存储。  

5. 如果item对应的slab出现过,但是对应的slab已经存储满了并且memcache也达到了最大内存使用。将使用lru算法,清除item(可能将未过期的item清除)此时会有eviction++
【删除】:
  1. Delete操作只是将该chunk置为删除状态,这样在下次使用将优先利用这样的chunk。
【flush】
  1. Flush操作相当于将所有的item失效的一个动作。并不会改变memcache内存分配情况。
【一些注意】

  • memcache已经分配的内存不会再主动清理。
  • memcache分配给某个slab的内存页不能再分配给其他slab。
  • flush_all不能重置memcache分配内存页的格局,只是给所有的item置为过期。
  • memcache最大存储的item(key+value)大小限制为1M,这由page大小1M限制  

    5.由于memcache的分布式是客户端程序通过hash算法得到的key取模来实现,不同的语言可能会采用不同的hash算法,同样的客户端程序也有可能使用相异的方法,因此在多语言、多模块共用同一组memcached服务时,一定要注意在客户端选择相同的hash算法  

    6.启动memcached时可以通过-M参数禁止LRU替换,在内存用尽时add和set会返回失败  

    7.memcached启动时指定的是数据存储量,没有包括本身占用的内存、以及为了保存数据而设置的管理空间。因此它占用的内存量会多于启动时指定的内存分配量,这点需要注意。  

    8.memcache存储的时候对key的长度有限制,php和C的最大长度都是250。
  转自:

http://hi.baidu.com/jqxw4444/item/59c33ea3656ede3e020a4d1c

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140588-1-1.html 上篇帖子: Ubuntu中安装Nginx+php+mysql+memcache+eaccelerator笔记 下篇帖子: memcache stats 说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表