`

Memcached内存分配优化及使用问题

阅读更多

前几天做了个Memcached的思考,并测试了一些数据,是关于如何提高Memcached内存使用率的问题。
在启动memcached的时候可以加-f参数和-n参数。-f指定各slab里面chunk大小的变化比例,默认1.25,-n指定slab里面chunk大小从多少开始。
使用memcache_add($memcache_obj, md5(rand()), str_repeat(md5(rand()),10), false,80000 );向memcache中持续灌入数据。


Memcached –d start –m 50 启动memcache,增长系数默认为1.25
结果:
2011-03-28 11:15:37:SAR:localh~211: 10 0 0 0 0/0% 0 5 265 50M 0% 0 0 0 4/0/0
2011-03-28 11:15:40:SAR:localh~211: 11 0 0 530 0/0% 0 192K 4K 50M 1% 797 530 0 4/0/0
2011-03-28 11:15:43:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 105K 50M 17% 21K 13K 0 4/0/1
2011-03-28 11:15:46:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 104K 50M 48% 61K 13K 0 4/1/1
2011-03-28 11:15:49:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 102K 50M 77% 98K 13K 580 4/1/2
2011-03-28 11:15:52:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 103K 50M 92% 116K 13K 13K 4/1/3
2011-03-28 11:15:55:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 105K 50M 92% 116K 13K 13K 4/2/4
2011-03-28 11:15:58:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 107K 50M 92% 116K 13K 13K 4/2/5
2011-03-28 11:16:01:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 101K 50M 92% 116K 13K 13K 4/3/6

使用率稳定在92%,存储116k条
stats slabs
STAT 8:chunk_size 440
STAT 8:chunks_per_page 2383
STAT 8:total_pages 50
STAT 8:total_chunks 119150
STAT 8:used_chunks 119150

使用了大小为440字节的chunk。 使用了id为8的slab

Memcached –d start –m 50 –f 2 增长系数为2
结果:
2011-03-28 11:17:53:SAR:localh~211: 10 0 0 0 0/0% 0 5 267 50M 0% 0 0 0 4/0/0
2011-03-28 11:17:56:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 107K 50M 16% 20K 13K 0 4/0/0
2011-03-28 11:17:59:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 106K 50M 47% 60K 13K 0 4/1/1
2011-03-28 11:18:02:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 106K 50M 63% 80K 13K 13K 4/1/2
2011-03-28 11:18:05:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 105K 50M 63% 80K 13K 13K 4/1/3
2011-03-28 11:18:08:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 108K 50M 63% 80K 13K 13K 4/2/4
2011-03-28 11:18:11:SAR:localh~211: 11 0 0 13K 0/0% 0 5M 106K 50M 63% 80K 13K 13K 4/2/5

使用率稳定在63%,存储80k条。
STAT 4:chunk_size 640
STAT 4:chunks_per_page 1638
STAT 4:total_pages 50
STAT 4:total_chunks 81900
STAT 4:used_chunks 81900

使用了大小为640的chunk,使用了id为4的slab


Memcached –d start –m 50 –f 1.001 –n 375 增长率为1.001 (memcache要求增长率必须大于1)
结果:
2011-03-28 14:40:09:SAR:127.0.~211: 11 0 0 12K 0/0% 0 4M 100K 50M 98% 124K 12K 10K 4/1/3
2011-03-28 14:40:10:SAR:127.0.~211: 11 0 0 13K 0/0% 0 5M 104K 50M 99% 125K 13K 13K 4/1/3
2011-03-28 14:40:11:SAR:127.0.~211: 11 0 0 13K 0/0% 0 5M 106K 50M 99% 125K 13K 13K 4/2/4

使用率稳定在99%,存储125k条
STAT 1:chunk_size 408
STAT 1:chunks_per_page 2570
STAT 1:total_pages 6
STAT 1:total_chunks 15420
STAT 1:used_chunks 15022

使用了大小为408的chunk,使用了id为1的slab


可见调整-f和-n的值可有效提高memcache对内存的使用率。
不过需要注意的是,以上测试数据使用了同长度数据,对于长度不定长的数据,需要根据整体数据确定-f和-n的值。
经过我的测试slab的id值最大为200,若id为199的slab中chunk仍小于数据长度,那么需要将数据存放在id为200的slab中,该slab中的chunk大小为1m,造成内存的巨大浪费。
memcached -d start -m 50 -f 1.001 -n 100
2011-03-28 14:51:15:SAR:127.0.~211: 11 0 0 13K 0/0% 0 5M 101K 50M 0% 50 13K 13K 4/1/2

内存使用率约等于0,存储50条数据
STAT 200:chunk_size 1048576
STAT 200:chunks_per_page 1
STAT 200:total_pages 50
STAT 200:total_chunks 50
STAT 200:used_chunks 50

使用了大小为1m的chunk,使用了id为200的slab


现在还有一个问题:
STAT 1:chunk_size 408
STAT 1:chunks_per_page 2570
一个1m大小slab中存放了2570个大小为408的chunk,可见并没有放满,剩余的空间就被浪费了。对于这种情况,每个slab浪费的内存只有几百个字节,可以忽略不计,但是假如chunk大小为几十上百k的时候,空间浪费情况就很客观了。这时可在memcached启动时添加-I(大写的i)参数来改变slab的大小

分享到:
评论

相关推荐

    E2EE互联网服务器套件1.7.38

    将 libmemcached 的内存分配器改成了易语言统一申请内存的方式。 修复了URI解析过程的一个逻辑陷阱。兼容中文等情况的URI二次解析可能出现的问题。 修复了XML解析等情况下得到的文本内容超出预计范围的问题。 修复了...

    JAVA中级书籍

    掌握JVM内存分配、JVM垃圾回收;类装载机制; 性能优化; 反射机制;多线程;IO/NIO; 网络编程;常用数据结构和相关算法。 2、对面向对象的软件开发思想有清晰的认识、熟悉掌握常用的设计模式;设计模式;单例模式...

    项目优化经验——垃圾回收导致的性能问题

    在比较了这个网站和其它网站服务器上相关性能监视器指标后发现有一个参数特别显眼:就是其中的每秒分配字节数,这个性能比较差的网站每秒分配2GB的内存(而且需要注意由于性能监视器是每秒更新一下,对于一个非常...

    构建高性能Web站点_PDF_45.5M

    3.4 内存分配 3.5 持久连接 3.6 I/O模型 3.7 服务器并发策略 第4章 动态内容缓存 4.1 重复的开销 4.2 缓存与速度 4.3 页面缓存 4.4 局部无缓存 4.5 静态化内容 第5章 动态脚本加速 5.1 opcode缓存 5.2 ...

    构建高性能Web站点(PDF)

    3.4 内存分配 3.5 持久连接 3.6 I/O模型 3.7 服务器并发策略 第4章 动态内容缓存 4.1 重复的开销 4.2 缓存与速度 4.3 页面缓存 4.4 局部无缓存 4.5 静态化内容 第5章 动态脚本加速 5.1 opcode缓存 5.2 ...

    构建高性能Web站点(PDF)-第2部分

    3.4 内存分配 3.5 持久连接 3.6 I/O模型 3.7 服务器并发策略 第4章 动态内容缓存 4.1 重复的开销 4.2 缓存与速度 4.3 页面缓存 4.4 局部无缓存 4.5 静态化内容 第5章 动态脚本加速 5.1 opcode缓存 5.2 ...

    大桌子云办公平台DzzOffice 2.02.1

    大桌子云办公平台DzzOffice是一款开源的...缓存优化,开启内存缓存(如:memcached等)会显著提高效率;应用市场应用名称旁显示版本;修复评论组件,有些情况下获取不到评论列表的bug;其他功能完善、及已知问题的修复。

    Redis全面接触.pptx

    1.对Reids的单站点缓存和MemCached作相应的对比 2.了解Redis的特点,发展过程,持久化,以及部署的...4.了解Redis内存是如何存储的,以及内部内存分配和优化 5.结合开发语言进行实际调用和测试,(本文以.NET进行实操)

    易语言-E2EE互联网服务器套件1.7.38

    将 libmemcached 的内存分配器改成了易语言统一申请内存的方式。 修复了URI解析过程的一个逻辑陷阱。兼容中文等情况的URI二次解析可能出现的问题。 修复了XML解析等情况下得到的文本内容超出预计范围的问题。 修复了...

    网络架构师148讲视频课程

    │ 第62节:内存分配的Chunk、Slab演示.avi │ 第63节:Memcached的Java客户端开发.avi │ 第64节:理解Memcached的分布式方式.avi │ 第65节:Memcached内存调优.avi │ 第66节:Memcached的限制和使用建议.avi │ ...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

Global site tag (gtag.js) - Google Analytics