面试题答案
一键面试调整 slab 大小
- 原理:Memcached 使用 slab 分配器来管理内存,每个 slab 包含固定大小的 chunk。如果 slab 大小设置不合理,可能导致内存浪费或对象无法合适存放,进而影响命中率。通过调整 slab 大小,使不同大小的对象能更高效地被分配到合适的 slab 中,减少内存碎片,提高内存利用率,从而提升命中率。
- 实施步骤:
- 首先要分析业务中存储对象的大小分布情况,可以通过一些工具如
memcached-tool
收集一段时间内存储对象大小的统计信息。 - 根据分析结果,使用
memcached
启动参数-f <factor>
来调整 slab 增长因子,默认增长因子为 1.25。例如,如果发现小对象居多,可以适当减小增长因子,使 slab 大小的递增更细密;若大对象较多,则可适当增大增长因子。同时,可以结合-n <chunk_size>
参数设置初始 chunk 大小,让 slab 分配更符合业务对象大小特点。
- 首先要分析业务中存储对象的大小分布情况,可以通过一些工具如
优化 slab 类别的数量
- 原理:过多或过少的 slab 类别都可能影响内存分配效率。过多的 slab 类别会增加管理开销,过少则可能导致对象无法找到合适的 slab 而出现内存浪费或分配失败,影响命中率。合理优化 slab 类别数量,能在管理开销和内存分配灵活性之间找到平衡,提高命中率。
- 实施步骤:
- 同样先借助
memcached-tool
等工具分析现有 slab 类别下对象的分布情况,查看哪些 slab 类别利用率过低或过高。 - 如果发现某些 slab 类别利用率极低,可以考虑合并一些相近大小的 slab 类别。在启动
memcached
时,可以通过调整配置文件或命令行参数,重新规划 slab 类别数量和对应的大小范围。例如,如果原本有 10 个 slab 类别,经过分析发现可以合并为 8 个,就相应调整配置,使内存分配更高效。
- 同样先借助
预分配内存
- 原理:提前按照业务需求分配好足够的内存,避免运行过程中频繁进行内存分配和释放操作,减少内存碎片产生,提高内存分配效率,从而稳定命中率。
- 实施步骤:
- 在启动
memcached
服务时,通过-m <bytes>
参数指定分配给 Memcached 的总内存大小。这个值要根据业务预估的数据存储量来合理设置,设置过小可能导致数据无法全部存储,过大则造成内存浪费。例如,预计业务高峰期需要存储 1GB 数据,可以设置-m 1024
(单位为 MB)。 - 同时,可以结合上述对 slab 大小和类别数量的优化,提前规划好这些内存如何在不同的 slab 中分配,以提高内存使用效率。
- 在启动