当前位置:首页 > 问答 > 正文

树叶云带你了解Memcached中stats slabs命令的那些事儿,帮你搞懂缓存分片情况

开始)

大家好,我是树叶云,今天我们来聊聊Memcached里面一个非常实用但又可能让人有点困惑的命令:stats slabs,如果你在用Memcached做缓存,想知道内存到底是怎么被用掉的,有没有浪费,那么这个命令就是你必须要会的“侦查工具”。

咱们得知道Memcached是怎么管理内存的,它不像我们想象中那样,来一个数据就随便找一块空地放下,那样的话,内存很快就会变得坑坑洼洼(也就是内存碎片),效率就低了,Memcached用了一个很聪明的办法,叫做“Slab Allocator”,我们可以把它理解成“内存分片分配器”。

想象一下,你有一个大仓库(服务器的总内存),里面卖各种各样的商品(缓存的数据),如果你把大小不一的货物胡乱堆在一起,找起来麻烦,空间也浪费,Memcached的做法是,在仓库里预先划分好一排排货架,每个货架上的格子大小都是固定的,一号货架专放边长10厘米的小盒子,二号货架专放边长20厘米的盒子,以此类推,这些“货架”,就是slabs

stats slabs这个命令,就是给你一份详细的“货架盘点报告”,让你看清每个货架的使用情况。

我们登录到服务器,输入stats slabs命令,会看到一大堆数字,别慌,我们挑最重要的几个来看明白就行了。

分片编号(Slab Class) 报告开头通常是一列像stats slabs:1, stats slabs:2这样的,这个数字就是货架的编号,比如1号货架,2号货架,每个编号对应一个固定大小的格子(Chunk Size)。

格子大小(Chunk Size) 这是最关键的信息之一,它告诉你这个货架上每个格子有多大。chunk_size 96表示1号货架的每个格子是96字节,Memcached会根据你存入数据的大小,自动选择一个最合适的货架(即格子大小最接近且能放得下数据的那个),如果你存一个80字节的数据,它就会被放进96字节的格子里,虽然会浪费掉16字节的空间。

当前货架上的物品数量(curr_items) 这个很好理解,就是当前这个货架上已经放了多少个“商品”(缓存项)。

树叶云带你了解Memcached中stats slabs命令的那些事儿,帮你搞懂缓存分片情况

货架占用了多少页内存(total_pages) Memcached分配内存不是一个个格子来的,而是一整页一整页地划给某个货架,一页默认是1MB,这个值告诉你,为了满足这个货架的需求,已经分配了多少页的内存给它,一旦分配了,这页内存就专属于这个货架了,即使里面的格子是空的,也不会还给操作系统或者给别的货架用。

每个货架总共有多少个格子(total_chunks)total_pages乘以每页能划分出的格子数,就是这个货架总的格子容量,比如一页1MB(1048576字节),如果每个格子96字节,那么一页就能分出大概10922个格子。total_chunks就是这个总数。

已经用掉的格子数(used_chunks) 当前这个货架上已经被占用的格子数量,它应该小于等于total_chunks

空闲的格子数(free_chunks) total_chunks减去used_chunks,就是空闲的格子数,注意,这些空闲格子只在这个货架内部有效,不能给其他大小的数据用。

被主动淘汰的格子数(mem_requested) 当内存满了,Memcached会根据LRU(最近最少使用)算法淘汰一些旧数据来腾空间,这个值记录了在这个货架上,因为内存不足而被淘汰掉的缓存项所占用的总字节数,如果这个数字增长得很快,说明这个尺寸的数据非常活跃,但分配给它的内存可能不太够,导致频繁地“踢掉”旧数据。

树叶云带你了解Memcached中stats slabs命令的那些事儿,帮你搞懂缓存分片情况

如何用这份“报告”发现问题?

树叶云觉得,看懂数据是为了解决问题,通过stats slabs,你主要能发现两个大问题:

  • 内存浪费问题:如果你发现某个货架的chunk_size是100字节,但你存进去的数据平均只有50字节,那么每个格子就浪费了将近一半的空间,更常见的是,如果你的业务数据大小很分散,可能会导致Memcached创建了很多不同的货架,每个货架都可能有一些空闲格子用不上,但内存又被占着,这就是一种内部碎片,这时候,你可能需要调整Memcached的启动参数(比如-f因子)来优化不同货架之间格子大小的增长比例,让格子尺寸更贴合你的数据。

  • 热点数据内存不足问题:如果你发现某个货架的curr_items总是接近total_chunks,而且mem_requested增长得飞快,说明这个尺寸的数据访问非常频繁,但分配给它的“专属货架”太小了,导致数据频繁地被换入换出,缓存命中率会下降,这时候,你可能需要考虑给Memcached分配更多的总内存,或者通过调整参数,让这个尺寸的货架能分配到更多的页(total_pages)。

简单总结一下,stats slabs就像是你Memcached内存仓库的“库管日志”,它能帮你看清内存是怎么被划分和使用的,有没有“大箱子装小零件”的浪费,或者某个畅销品是不是因为货架太小而总是缺货,定期查看和分析它,能帮助你更好地优化缓存策略,让你的Memcached跑得更高效。

希望树叶云的这番解释,能帮你搞懂stats slabs命令背后的那些事儿。 结束)

来源:根据“树叶云”发布的关于Memcached中stats slabs命令的解读内容整理提供。