作者:马江涛

时间:2010-08-19

前言

此文档帮助您了解 memcache 在保存数据时,假如要保存的数据量接近 memcache 指定的最大内存时,memcache 是怎样进行数据存储的,以及怎样尽可能的提高 memcache 的命中率。

关键词:memcache 、临界、内存、memcache.php、LRU、监控

1 测试目的

探究 memcache 保存数据时,在保存的数据量接近 memcache 指定内存临界时,保存规律是怎样的?

2 测试环境

软件

版本号

说明

php

php-5.3.3

memcache

memcached Server 1.2.1

最大内存设置为 128M

apache

2.2.16

memcache.php

一个开源的 php脚本

3 测试用例

定义变量 i从 0到 3853628增加(一个 key与 value占据的空间约 50 bytes)
设置 Key为:hello+i


设置 Value为:第 i个我
循环插入键值数

4 测试结果

1) 几个截图及说明如下

1》放入第 1986718 个对象后,内存消耗 77.8M(占 memcache 指定最大内存 60.8%)

2》放入2880657 个对象后,内存消耗78.1m(占memcache 指定最大内存61.0%)

3》放入3853630 个对象后,内存消耗78.1m(占memcache 指定最大内存61.0%)

以上三个图示说明,插入的数据如果大小变化不是很大时,memcache 中的数据存储到一定的时候(占总内存60%左右时),不再消耗内存

3) 此时获取缓存中的数据

获取hello1 得到 null

获取hello1926814 得到 null 4/8 位置的数据

获取hello2408518 得到 null 5/8 位置的数据

获取hello2890221 得到 第2890221 个我 6/8 位置的数据

获取hello3853628 得到 第3853628 个我

以上数据说明,在上述情况下,内存消耗到60%左右时,memcache 就开始执行LRU 机制了。

原因分析:

1 memcached 中新的value 过来存放的地址是该value 的大小决定的,value 总是会被选择存放到chunk 与其最接近的一个slab 中,假如已经没有合适的chunk 了,那就开始LRU 了。所以,可见memcached 的LRU 不是全局的,而是针对slab 的,是区域性的。

2 memcached 的内存分配采用的是预分配方式,为了获得更快的速度,不得不以空间换时间。所以在如上情况下(插入的数据大小变化不是很大时),在内存消耗耗到60%左右时开始启用LRU 机制。其余的40%在这种场合,基本等于是浪费掉的。

3 要提高memcached 的命中率,可以通过预估我们的value 大小,然后适当的调整增长因子来实现。(通过调整增长因子 –f 1.1 表示chunk 按照1.1 倍的速度增长,可以尽可能多的拥有某种大小的chunk)

注:
memcache 的数据存储时有3 个概念:1》 slab, 2》 page, 3》 chunk

一个memcahced 进程会预先将自己划分为若干个slab,每个slab 下又有若干个page,每个page 下又有多个chunk。Slab 的数量是有限的,几个,十几个,或者几十个,这个跟进程配置的内存有关。而每个slab 下得page 默认情况是1m,也就是说如果一个slab 占用100m 得内存得话,那么默认情况下这个slab 所拥有得page 的个数就是100,而chunk 就是数据存放的最终地方。

转载于:https://www.cnblogs.com/jiunadianshi/articles/2429125.html

[转载]Memcache内存临界测试相关推荐

  1. Java内存使用量测试 看看我们天天在用的JVM到底浪费了多少内存资源

    JVM内存使用量测试 测试各种不同的数据结构在JVM中的内存使用量 1 import it.unimi.dsi.fastutil.ints.IntOpenHashSet; 2 3 import jav ...

  2. Multi-thread--提高C++性能的编程技术笔记:多线程内存池+测试代码

    为了使多个线程并发地分配和释放内存,必须在分配器方法中添加互斥锁. 全局内存管理器(通过new()和delete()实现)是通用的,因此它的开销也非常大. 因为单线程内存管理器要比多线程内存管理器快的 ...

  3. Multi-thread提高C++性能的编程技术笔记:单线程内存池+测试代码

    频繁地分配和回收内存会严重地降低程序的性能.性能降低的原因在于默认的内存管理是通用的.应用程序可能会以某种特定的方式使用内存,并且为不需要的功能付出性能上的代价.通过开发专用的内存管理器可以解决这个问 ...

  4. Linux内存压力测试stressapptest

    /*********************************************************************** Linux内存压力测试stressapptest* 说 ...

  5. bandwidth 0.32k 发布,内存带宽测试工具

    bandwidth 0.32k 修复了一些小的 AVX 问题. Bandwidth 是一个内存带宽测试的基准工具,但它也可以测量网络带宽.它可以测量每个内存系统的最大内存带宽,包括主内存,L1和L2缓 ...

  6. 内存兼容性测试软件,Ryzen内存测试:有BUG兼容性较差_DIY攒机选购指南-中关村在线...

    锐龙AMD Ryzen内存测试:有BUG兼容性较差 据悉Ryzen 7的一个"小Bug":当插满4条DDR4内存的时候,频率最高只能上到DDR4-2400,插2条的时候就能上到DD ...

  7. Android内存压力测试工具(memtester移植)

    该文章转载于: android用memtester内存压力测试_W歹匕示申W的博客-CSDN博客 Android内存压力测试工具(memtester移植)_甜牛奶蛋糕的博客-CSDN博客_androi ...

  8. Memcache内存分配策略

    转自:http://tank.blogs.tkiicpp.com/2010/12/14/memcache%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e7%ad%96%e7 ...

  9. 提高C++性能的编程技术笔记:多线程内存池+测试代码

    为了使多个线程并发地分配和释放内存,必须在分配器方法中添加互斥锁. 全局内存管理器(通过new()和delete()实现)是通用的,因此它的开销也非常大. 因为单线程内存管理器要比多线程内存管理器快的 ...

最新文章

  1. IDEA JRebel热部署插件免费使用方法
  2. DataGridView数据更新至数据库-逐条更新
  3. C++全局变量和局部变量名称可以相同
  4. linux系统在windows看不到,Linux下怎么看不到盘符啊?
  5. java默认异常处理_spring boot 默认异常处理的实现
  6. MapReduce:Simplified Data Processing on Large Clusters(中文翻译2)
  7. 55. 时间服务器 : NTP 服务器
  8. 如何更改通达OA附件的存储目录
  9. lowagie.text 表格带复杂表头 导出word
  10. 如何制作和使用自签名证书
  11. virtualbox虚拟机安装win10详细教程
  12. C语言/C++常见习题问答集锦(十九)之C语言与漫天飞雪
  13. LaTex公式长度过长
  14. 我的精神家园——陈皓专访
  15. VScode 完整安装、配置及完全卸载
  16. 王者荣耀服务器什么时候增加人数,王者荣耀服务器连续两天崩!春节每人游戏时间暴涨75%,玩家要背锅?...
  17. 电脑系统重装篇7:使用GHO镜像文件安装系统(OneKey)
  18. 文达信息工程学院计算机学院,安徽文达信息工程学院计算机工程学院来我校信息工程学院调研交流...
  19. 使用NSIS制作安装包
  20. 牛奶可乐经济学之Q8:为什么鲸鱼濒临灭绝,鸡却没有繁衍之忧?

热门文章

  1. HDU Problem - 4280 Island Transport(最大流)
  2. oracle awr报告提取,oracle AWR报告提取分析
  3. 关于fragment backState的原理
  4. 液晶电视服务器无响应时间,液晶电视响应速度时间是多少更好啊?
  5. mongoDB分页的两种方法
  6. Eclipse 安装Gradle插件
  7. Spring MVC的表单控制器——SimpleFormController .
  8. java中获取文件路径的几种方式
  9. 线上BUG定位神器(阿尔萨斯)-Arthas2019-0801
  10. springmvc相关配置和用法