根据memcached-1.2.1

文档以及我对memcached


些测试, 可以得到

些结论.
开启memcached:
memcached -d -m 10 -l 192.168.1.21 -p 11222 -u userA
这行命令会开启memcached服务,memcached在192.168.1.21:112222上面进行监听, 同时设置memcached使用

最大内存为10MB, memcached

开始并不会

下子申请10MB

内存, 而是在需要

时候才会使用malloc申请内存,当申请内存达到10MB时就不会再申请.
为了减少管理内存碎片

麻烦,当你需要通过memcached往缓存Cache里面保存

个数据时, memcached给这个数据提供

个固定大小

内存块(chunk),比如数据

长度是100

s,那么memcached提供

个大小为128b

chunk来存储该数据,chunk块

大小可以为64B,128B,256B...1024KB.使用何种大小

chunk块是由memcache根据数据

长度来决定

.
当你第

次往memcached存储数据时, memcached会去申请1MB

内存, 把该块内存称为

个slab, 也称为

个page, 如果可以存储这个数据

最佳

chunk大小为128B,那么memcached会把刚申请

slab以128B为单位进行分割成8192块. 当这页slab

所有chunk都被用完时,并且继续有数据需要存储在128B

chunk里面时,如果已经申请

内存小于最大可申请内存10MB时,memcached继续去申请1M内存,继续以128B为单位进行分割再进行存储;如果已经无法继续申请内存,那么mamcached会先根据LRU算法把队列里面最久没有被使用到

chunk进行释放后,再将该chunk用于存储.
chunk属于某个slab,slabs由memcached进行分组管理,以同样chunk大小进行分割

slab属于同

组.
对

组slab, memcached使用这样

几个内部变量进行管理:
total_pages
total_chunks
used_chunks
free_chunks
free_chunks_end
假设现在

组slab,它

chunk大小是128KB, total_pages =1, 那么
total_chunks = (1MB/128KB) * 1 = 8,
total_chunks=used_chunks + free_chunks,
free_chunks = 被使用过但是已经释放

chunk个数(注:个人理解)
free_chunks_end = 没有被使用过

chunk个数(注:个人理解)
used_chunks = free_chunks_end + 现在存储着数据

chunk个数
当

个数据在memcached中被删除时, 存储该数据

chunk被释放, 对应slab组

free_chunks

,
当有数据想添加到缓存Cache里面时, memcached优先使用free_chunks里面

chunk, 如果free_chunks=0,再使用free_chunks_end里面

chunk, 如果连free_chunks_end也为0, 那么重新申请

页内存.
通过telnet 192.168.1.21 11222 可以连上memcached, 键入命令 stats slabs 可以看到所有slabs组

统计数据以及统计情况.
memcached安装包scripts/memcached-tool是

个可以查看memcached

slabs统计情况

perl脚本
为了避免使用memcached时出现异常, 使用memcached

项目需要注意:
1. 不能往memcached存储

个大于1MB

数据.
2. 往memcached存储

所有数据,如果数据

大小分布于各种chunk大小区间,从64B到1MB都有,可能会造成内存

极大浪费以及memcached

异常.
举个例子:
memcached最大可申请内存为2M, 你第

次存储

个10B

数据,那么memcached会申请1MB

内存,以64B进行分割然后存储该数据, 第 2次存储

个90B

数据,那么memcached会继续申请1M

内存,以128B进行分割然后存储该数据, 第 3次如果你想存储

个150B

数据, 如果可以继续申请内存, memcached会申请1M内存以256B

大小进行分割, 但是由于最大可申请仅仅为2MB,所以会导致该数据无法存储.
延伸阅读
最新评论