memcached完全剖析系列教程《转》 memcached完全剖析系列教程–2.理解memcached的内存存储...
本文目录
Slab Allocation机制:整理内存以便重复使用
· Slab Allocation的主要术语
· 在Slab中缓存记录的原理
· Slab Allocator的缺点
· 使用Growth Factor进行调优
· 查看memcached的内部状态
· 查看slabs的使用状况
· 内存存储的总结
Slab Allocation机制:整理内存以便重复使用
最近的memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。
下面来看看Slab Allocator的原理。下面是memcached文档中的slab allocator的目标:
引用
the primary goal of the slabs subsystem in memcached was to eliminate memory fragmentation issues totally by using fixed-size memory chunks coming from a few predetermined size classes.
也就是说,Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。
Slab Allocation的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)
图1:Slab Allocation的构造图
而且,slab allocator还有重复使用已分配的内存的目的。也就是说,分配到的内存不会释放,而是重复利用。
Slab Allocation的主要术语
Page:分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。
Chunk:用于缓存记录的内存空间。
Slab Class:特定大小的chunk的组。
在Slab中缓存记录的原理
下面说明memcached如何针对客户端发送的数据选择slab并缓存到chunk中。
memcached根据收到的数据的大小,选择最适合数据大小的slab(图2)。 memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。
图2:选择存储记录的组的方法
实际上,Slab Allocator也是有利也有弊。下面介绍一下它的缺点。
Slab Allocator的缺点
Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。
这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了(图3)。
图3:chunk空间的使用
对于该问题目前还没有完美的解决方案,但在文档中记载了比较有效的解决方案。
引用
The most efficient way to reduce the waste is to use a list of size classes that closely matches (if that’s at all possible) common sizes of objects that the clients of this particular installation of memcached are likely to store.
就是说,如果预先知道客户端发送的数据的公用大小,或者仅缓存大小相同的数据的情况下,只要使用适合数据大小的组的列表,就可以减少浪费。
但是很遗憾,现在还不能进行任何调优,只能期待以后的版本了。但是,我们可以调节slab class的大小的差别。接下来说明growth factor选项。
使用Growth Factor进行调优
memcached在启动时指定 Growth Factor因子(通过-f选项),就可以在某种程度上控制slab之间的差异。默认值为1.25。但是,在该选项出现之前,这个因子曾经固定为2,称为“powers of 2”策略。
让我们用以前的设置,以verbose模式启动memcached试试看:
$ memcached -f 2 -vv
下面是启动后的verbose输出:
slab class 1: chunk size 128 perslab 8192slab class 2: chunk size 256 perslab 4096slab class 3: chunk size 512 perslab 2048slab class 4: chunk size 1024 perslab 1024slab class 5: chunk size 2048 perslab 512slab class 6: chunk size 4096 perslab 256slab class 7: chunk size 8192 perslab 128slab class 8: chunk size 16384 perslab 64slab class 9: chunk size 32768 perslab 32slab class 10: chunk size 65536 perslab 16slab class 11: chunk size 131072 perslab 8slab class 12: chunk size 262144 perslab 4slab class 13: chunk size 524288 perslab 2
可见,从128字节的组开始,组的大小依次增大为原来的2倍。这样设置的问题是,slab之间的差别比较大,有些情况下就相当浪费内存。因此,为尽量减少内存浪费,两年前追加了growth factor这个选项。
来看看现在的默认设置(f=1.25)时的输出(篇幅所限,这里只写到第10组):
slab class 1: chunk size 88 perslab 11915slab class 2: chunk size 112 perslab 9362slab class 3: chunk size 144 perslab 7281slab class 4: chunk size 184 perslab 5698slab class 5: chunk size 232 perslab 4519slab class 6: chunk size 296 perslab 3542slab class 7: chunk size 376 perslab 2788slab class 8: chunk size 472 perslab 2221slab class 9: chunk size 592 perslab 1771slab class 10: chunk size 744 perslab 1409
可见,组间差距比因子为2时小得多,更适合缓存几百字节的记录。从上面的输出结果来看,可能会觉得有些计算误差,这些误差是为了保持字节数的对齐而故意设置的。
将memcached引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,调整growth factor,以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。
接下来介绍一下如何使用memcached的stats命令查看slabs的利用率等各种各样的信息。
查看memcached的内部状态
memcached有个名为stats的命令,使用它可以获得各种各样的信息。执行命令的方法很多,用telnet最为简单:
$ telnet 主机名 端口号
连接到memcached之后,输入stats再按回车,即可获得包括资源利用率在内的各种信息。此外,输入”stats slabs”或”stats items”还可以获得关于缓存记录的信息。结束程序请输入quit。
这些命令的详细信息可以参考memcached软件包内的protocol.txt文档。
$ telnet localhost 11211Trying ::1...Connected to localhost.Escape character is '^]'.statsSTAT pid 481STAT uptime 16574STAT time 1213687612STAT version 1.2.5STAT pointer_size 32STAT rusage_user 0.102297STAT rusage_system 0.214317STAT curr_items 0STAT total_items 0STAT bytes 0STAT curr_connections 6STAT total_connections 8STAT connection_structures 7STAT cmd_get 0STAT cmd_set 0STAT get_hits 0STAT get_misses 0STAT evictions 0STAT bytes_read 20STAT bytes_written 465STAT limit_maxbytes 67108864STAT threads 4ENDquit
另外,如果安装了libmemcached这个面向C/C++语言的客户端库,就会安装 memstat 这个命令。使用方法很简单,可以用更少的步骤获得与telnet相同的信息,还能一次性从多台服务器获得信息。
$ memstat --servers=server1,server2,server3,...
libmemcached可以从下面的地址获得:
http://tangent.org/552/libmemcached.html
查看slabs的使用状况
使用memcached的创造着Brad写的名为memcached-tool的Perl脚本,可以方便地获得slab的使用情况(它将memcached的返回值整理成容易阅读的格式)。可以从下面的地址获得脚本:
http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool
使用方法也极其简单:
$ memcached-tool 主机名:端口 选项
查看slabs使用状况时无需指定选项,因此用下面的命令即可:
$ memcached-tool 主机名:端口
获得的信息如下所示:
# Item_Size Max_age 1MB_pages Count Full?1 104 B 1394292 s 1215 12249628 yes2 136 B 1456795 s 52 400919 yes3 176 B 1339587 s 33 196567 yes4 224 B 1360926 s 109 510221 yes5 280 B 1570071 s 49 183452 yes6 352 B 1592051 s 77 229197 yes7 440 B 1517732 s 66 157183 yes8 552 B 1460821 s 62 117697 yes9 696 B 1521917 s 143 215308 yes10 872 B 1695035 s 205 246162 yes11 1.1 kB 1681650 s 233 221968 yes12 1.3 kB 1603363 s 241 183621 yes13 1.7 kB 1634218 s 94 57197 yes14 2.1 kB 1695038 s 75 36488 yes15 2.6 kB 1747075 s 65 25203 yes16 3.3 kB 1760661 s 78 24167 yes
各列的含义为:
列 |
含义 |
# |
slab class编号 |
Item_Size |
Chunk大小 |
Max_age |
LRU内最旧的记录的生存时间 |
1MB_pages |
分配给Slab的页数 |
Count |
Slab内的记录数 |
Full? |
Slab内是否含有空闲chunk |
从这个脚本获得的信息对于调优非常方便,强烈推荐使用。
内存存储的总结
本次简单说明了memcached的缓存机制和调优方法。希望读者能理解memcached的内存管理原理及其优缺点。
下次将继续说明LRU和Expire等原理,以及memcached的最新发展方向—— 可扩充体系(pluggable architecher)。
转载于:https://www.cnblogs.com/caoheyang911016/p/4118966.html
memcached完全剖析系列教程《转》 memcached完全剖析系列教程–2.理解memcached的内存存储...相关推荐
- 艾伟:memcached全面剖析–2.理解memcached的内存存储
本系列文章导航 memcached完全剖析–1. memcached的基础 memcached全面剖析–2.理解memcached的内存存储 memcached全面剖析–3.memcached的删除机 ...
- memcached全面剖析–2.理解memcached的内存存储
版权声明:可以任意转载,但转载时必须标明原作者charlee.原始链接http://tech.idv2.com/2008/07/11/memcached-002/以及本声明 下面是<memcac ...
- memcached全面剖析–2.理解 memcached的内存存储
來源:http://tech.idv2.com/2008/07/11/memcached-002/ 作者charlee 版权声明 :可以任意转载,但转载时必须标明原作者charlee.原始链接http ...
- memcached全面剖析–2. 理解memcached的内存存储
2019独角兽企业重金招聘Python工程师标准>>> 下面是<memcached全面剖析>的第二部分. 发表日:2008/7/9 作者:前坂徹(Toru Maesak ...
- 实验9Linux共享内存通信,操作系统原理与Linux实践教程(卓越工程师培养计划系列教材)...
导语 由申丰山和王黎明共同编著的<操作系统原理与Linux实践教程(卓越工程师培养计划系列教材)>一书理论与实践并重,全面.系统地阐述了操作系统的重要概念和原理,深入.细致地剖析了操作系统 ...
- Memcached源码分析 - 内存存储机制Slabs(5)
Memcached源码分析 - 网络模型(1) Memcached源码分析 - 命令解析(2) Memcached源码分析 - 数据存储(3) Memcached源码分析 - 增删改查操作(4) Me ...
- Memcached内存存储
早就听说过Memcached独特的内存管理方式,写着篇文章的目的就是了解Memcached的内存管理,学习其源代码. 1.什么是Slab Allocator memcached默认情况下采用了名为Sl ...
- 假日教程-ZStack映像檔系列(TurnkeyLinux Observium)
2019独角兽企业重金招聘Python工程师标准>>> 假日教程-ZStack映像檔系列(TurnkeyLinux Observium) 發行者:https://www.turnke ...
- 计算机网络与网页制作教程,计算机网络与网页制作:Dreamweaver CS5案例教程/高等学校通识教育系列教材简介,目录书摘...
编辑推荐: 内容简介: 计算机信息技术与网络科技已成为当今大学生必须学习和掌握的文化课程.<计算机网络与网页制作:Dreamweaver CS5案例教程/高等学校通识教育系列教材>将基础理 ...
最新文章
- 电子文件归档为什么非云不可
- c# SQLServer导入大批量数据
- androidstudio 日历视图怎么显示农历_中秋国庆旅游攻略怎么做?用这个便签软件很简单...
- 谷歌放弃C++语言,Python将要一统江湖了?
- 两直线平行交叉相乘_直线与方程概论
- 微博发布公告 将开展财经违规内容专项整治行动
- linux 平行运行命令,Linux paste命令
- virtualbox--在win7设置ubuntu虚拟机网络
- vb.net json上传服务器_vue项目编译后自动上传,告别繁琐的操作
- 开源项目zheng运行环境
- 使用google.zxing制作条形码和二维码
- picpick截图处理后关闭未保存的图像时不再询问
- p5.js创意绘图(1)动态图形
- 利用Python处理辅助明细账并计算账龄
- 手机扫描行驶证识别应用
- 20年半年总结—默默的活着真是快活极了
- 电脑复制替换目标中覆盖的文件如何恢复?EasyRecovery15
- SQLite3 学习笔记 以及C#连接SQLite3
- C语言课程设计个人所得税计算,请个高手帮忙设计个C语言个人所得税计算的程序...
- 中断控制流水灯c语言程序,51单片机按键中断控制流水灯
热门文章
- [转]symbian基本类型转换
- win10便签常驻桌面_win7桌面便签小工具可以作为工作计划软件使用吗?
- 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )
- 【C 语言】文件操作 ( 使用 fread 和 fwrite 实现二进制文件的拷贝 | stat 统计文件大小 | feof 判定文件结尾 )
- 【错误记录】Kotlin 编译报错 ( Not nullable value required to call an ‘iterator()‘ method on for-loop range )
- 【音频处理】Adobe Audition 快捷键设置
- 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 )
- 【数据挖掘】数据挖掘简介 ( 数据挖掘引入 | KDD 流程 | 数据源要求 | 技术特点 )
- 使用SQLite学习SQL
- vscode 常用插件安装