当您第一次启动memcached时,您配置的内存不会自动分配。相反,memcached仅在您开始将信息保存到缓存中后才开始分配和保留物理内存。
当您开始将数据存储到缓存中时, memcached不会逐项为数据分配内存。相反,slab 分配用于优化内存使用并防止缓存中的信息过期时出现内存碎片。
使用 slab 分配,内存以 1MB 的块为单位保留。板被分成许多大小相等的块。当您尝试将值存储到缓存中时, memcached会检查您要添加到缓存中的值的大小,并确定哪个 slab 包含该项目的正确大小分配。如果具有项目大小的 slab 已经存在,则该项目将写入 slab 中的块。
如果新项目大于任何现有块的大小,则会创建一个新的 slab,并将其分成合适大小的块。如果具有正确块大小的现有 slab 已经存在,但没有空闲块,则会创建一个新的 slab。如果您使用大于该键的现有块分配的数据更新现有项,则该键将重新分配到合适的平板中。
例如,最小块的默认大小为 88 字节(40 字节的值,以及默认的 48 字节的密钥和标志数据)。如果您存储到缓存中的第一个项目的大小小于 40 字节,则会创建一个块大小为 88 字节的 slab 并存储该值。
如果您打算存储的数据大小大于此值,则块大小将增加块大小因子,直到确定块大小足以容纳该值。块大小始终是比例因子的函数,四舍五入为块大小,该块大小可以精确地整除为块大小。
有关该结构的示例,请参 见图 16.5 “ memcached中的内存分配”。
结果是您在分配给memcached的内存范围内分配了多个页面。每个页面的大小为 1MB(默认情况下),并根据存储键值对所需的块大小分成不同数量的块。每个实例都分配了多个页面,当需要创建一个需要特定大小块的新项目时,总是会创建一个页面。一个 slab 可能由多个页面组成,并且一个 slab 中的每个页面都包含相同数量的块。
新 slab 的块大小由基本块大小与块大小增长因子相结合决定。例如,如果初始块大小为 104 字节,并且使用默认块大小增长因子 (1.25),则分配的下一个块大小将是适合 104*1.25 或 136 字节的 2 的最佳幂。
以这种方式分配页面可确保内存不会碎片化。但是,根据您存储的对象的分布情况,如果您有大小明显不同的项目,则可能会导致 slab 和块的分布效率低下。例如,每个块大小中的项目数量相对较少可能会浪费大量内存,而每个分配的页面中只有几个块。
您可以使用命令行选项调整增长因子以减少这种影响,该-f
选项调整应用的增长因子以更有效地使用分配的块和板。有关如何确定当前 slab 分配统计信息的信息,请参阅
第 16.2.4.2 节,“ memcached Slabs 统计信息”。
如果您的操作系统支持,您也可以
使用
命令行选项启动memcached 。-L
此选项在启动期间使用大内存页预分配所有内存。这可以通过减少 CPU 内存缓存中的未命中数来提高性能。