思路
- 提高内存命中率
- 减少内存浪费
- 增加内存重复利用率
辅助调优命令
- Stats命令:查看服务器的运行状态和内部数据
- Stats settings:查看服务器设置
参数 | 参数作用 |
---|---|
maxbytes | 最大字节数限制 |
maxconns | 允许最大连接数 |
growth_factor | 自增长因子 |
chunk_size | key+value+flags大小 |
reqs_per_event | 最大吞吐量 |
- Stats items/slabs:数据项统计/区块统计
参数 | 参数作用 |
---|---|
number | 该slab中对象数,不包含过期对象 |
age | LRU中最老对象的过期时间 |
evicted | LRU释放对象数 |
evicted_nonzero | 设置了非0时间的LRU释放对象数 |
evicted_time | 最后一次LRU秒数,监控频率 |
outofmemory | 不能存储对象次数 |
tailrepairs | 修复slabs次数 |
reclaimed | 使用过期对象空间存储对象次数 |
slab核心参数
参数 | 参数作用 |
---|---|
chunk_size | chunk大小 |
chunk_per_page | 每个page的chunk数量 |
total_pages | page数量 |
total_chunk | chunk数量*page数量 |
get_hits | get命中率 |
userd_chunks | 已被分配的chunk数量 |
free_ chunks | 剩余的chunk数 |
mem_requested | 使用过期对象空间存储对象次数 |
active_slabs | slab数量 |
内存调优
在这脸简单回顾Memcached的Slab Allocator机制
说明:
- 如图所示,Slab下面划分Page,Page下面划分Chunk
- 同一个Slab下面所有Chunk大小一样,不同Slab使用自增长因子递增
- 在Slab Class中存放Chunk大小与Slab的对应关系,客户端访问Xmemcached后,先根据存放内容的大小寻找合适的Slab
存在的问题
- 存不满Chunk
- 热点数据的堆积
- Slab不能被Page整除
- Page不能被Chunk整除
思路
- 调整Chunk大小
- 调整自增长因子
场景:MSM
存储的特点:
- 数据长度集中在某几个区域内
- 分均匀分布
优化思路:
- 数据集中在那几个区域内【eg:90 100 110】
- 能不能将chunk调成一致
在eg中,如果调成一致那就是要110,对于存储90的数据就会浪费20byte空间,如果90的数据很多浪费的空间就会比较大 - 调整Chunk大小和自增长因子、slab大小
比如我们有90M空间,划分成3个Slab,每个Slab就是30M,调自增长因子为1.1,那么chunk大小基本是按照90 100 110左右分布
使用限制和建议
- 限制:
- 不提供持久化机制
- Memcached只有理论上的永久持久化【30天】
- 不提供安全机制,要放在防火墙之后
- Memcached的理论最大key长度为250字节
- 单个item最大长度为1M
- 连接数 并发数200 软连接1024
- 不提供冗余机制
- 建议
- 基于文本形式的存储,Memcached目前效率最高
- 作为数据库前端
- 作为热点数据缓存
- 提升web应用速度
- 提高扩展性
- 缓存一些查询结果
- 推荐使用多级缓存