首页 > 其他分享 >memcached的slab钙化问题

memcached的slab钙化问题

时间:2023-03-24 17:12:32浏览次数:39  
标签:memcached tool 内存 Slab 数据 slab 钙化

memcached的slab钙化问题

现象:

服务某些接口成功率波动,经研发查看是数据在memcached查询的偶尔失败。

因为前一晚升级的时候,改了存储在memcahed的数据(图片base64)的大小,改成高清图。

猜测是memcached存储有问题

排查步骤:
查看memcached监控

 

 

 内存使用率一直都是满的,这个是之前就存在的问题。

 

 

 数据命中率波动,是服务接口报错的表面原因。

接着上memcached服务器查看stats状态,看看是那些数据导致命中率下降

使用memcached-tool工具

 

 

 可以看出大item_size的存储数量很少,就1个,而且保留时间都很短,几秒中就被更新了。

推断是这部分数据的查询导致命中率下降。

那为啥明明是刚写入比较新的数据,但被淘汰了?

经百度查询是Slab钙化问题:

memcached内存利用率一直是90%,已经达到growth factor=1.25的期望内存利用率,所以内存已满。

就算flush_all删除所有数据,item仍占用chunk size,MC删除机制是数据不会真正从内存中消失,只要被其他数据覆盖,MC不会主动删除Slab chunk已存在的数据。

MC淘汰策略是淘汰相同的Slab class数据,96B的item也不会重新使用192B的chunk size,只会使用原有启动Memcached时分配的1MB Slab class(Chunk size 96B),这就是所谓的Slab钙化问题。 假设Slab有各种规格(64~ 1M字节),比如应用存入的大部分数据大小在 64 ~ 128 字节范围内,那么这些数据会存储在128个字节大小的Slab chunk中,这些Slab chunk以链表的方式连接在一起。当已经没有空余的内存分配新的Slab,如果这时候写入10K新数据,且之前并没有这么大的数据写入时,那么这条新数据可以写入成功。但是当下次再写入10K数据时,第一次写入的10K数据就会被逐出。当下一次写入的新数据在64 ~ 128字节时,128字节大小的Slab链表上的数据会以LRU方式淘汰,所以LRU只会淘汰同一级别的Slab数据。

Slab钙化降低内存使用率,如果发生Slab钙化,有三种解决方案:

1) 重启Memcached实例,简单粗暴,启动后重新分配Slab class,但是如果是单点可能造成大量请求访问数据库,出现雪崩现象,冲跨数据库。

2) 随机过期:过期淘汰策略也支持淘汰其他slab class的数据,twitter工程师采用随机选择一个Slab,释放该Slab的所有缓存数据,然后重新建立一个合适的Slab。

3) 通过slab_reassign、slab_authmove参数控制。

============================================================================================================

Memcached 内存分配机制介绍

https://cloud.tencent.com/developer/article/1981648

============================================================================================================

memcached-tool使用详解

memcached-tool脚本可以方便地获得slab的使用情况 (它将memcached的返回值整理成容易阅读的格式),可以从下面的地址获得脚本:
http://www.netingcn.com/demo/memcached-tool.zip

使用方法也极其简单:

Usage: memcached-tool <host[:port]> [mode]

memcached-tool 10.0.0.5:11211 display # shows slabs
memcached-tool 10.0.0.5:11211 # same. (default is display)
memcached-tool 10.0.0.5:11211 stats # shows general stats
memcached-tool 10.0.0.5:11211 move 7 9 # takes 1MB slab from class #7

各列的含义:
# slab class编号
Item_Size Chunk大小
Max_age LRU内最旧的记录的生存时间
1MB_pages 分配给Slab的页数
Count Slab内的记录数
Full? Slab内是否含有空闲chunk

============================================================================================================

memcached使用详解

https://zhuanlan.zhihu.com/p/46364634

 

标签:memcached,tool,内存,Slab,数据,slab,钙化
From: https://www.cnblogs.com/justtosee/p/17252740.html

相关文章

  • Memcached集群实现及原理介绍
    一、Memcached集群介绍1.自身通过算法保证数据唯一性2.集群形式对用户和Memcached都是透明的3.Memcached的集群是通过客户端实现的4.Memcached服务端相互不认识二、代码实现......
  • Memcached stats命令及核心参数
    一、stats命令用来查看服务器的运行状态和内部数据,其中核心的参数有:1.缓存命中率相关参数:cmd_get:总查询次数get_hits:命中次数get_misses:未命中次数2.使用频率参数:curr_items......
  • Xmemcached与SpringBoot实际案例
    在本人的这篇文章《​​Xmemcached集群与SpringBoot整合​​》基础上,进行XMemcached与SpringBoot实际案例的结合。有以下这张表,将这张表的增删改查操作都添加到XMemcached中......
  • Memcached与Redis有什么区别
    Redis和Memcached都是基于内存的数据存储系统。Memcached是高性能分布式内存缓存服务,其本质上就是一个内存key-value数据库。Redis是一个开源的key-value存储系统。与......
  • Java使用memcached
    1.加载commons-pool-1.5.6.jar、java_memcached-release_2.6.6.jar、slf4j-api-1.6.1.jar、slf4j-simple-1.6.1.jar2.创建memcached工具类:publicclassMemcachedUtil{02......
  • 使用PHP连接、操纵Memcached的原理和教程
    Memcahced开源分布式内存对象缓存系统通过减少数据库的负担,从而能够加速你的web应用。在本文中我将解释怎样实现一个基于Memcahced的缓存系统。数据库实例中使用的数据库表......
  • EchartsLabel显示的细节处理
    0.缘起照理来说,春节过后的我现在应该还在快乐地摸鱼划水,但小测试猛地发来测试文档和示例,我对了一波之后对其中有个Echarts的label显示超过20截断有了些许冷汗泠泠的感觉......
  • [VueJsDev] 基础知识 - snippetsLab 代码片段
    代码片段:::details目录目录​代码片段​​​Step.1:massCode代码片段管理​​​​Step.2:Vue2init​​:::vscode中按ctrl+p输入vue.json即可打开vue模板第......
  • [VueJsDev] 基础知识 - snippetsLab 代码片段
    [VueJsDev]目录列表https://www.cnblogs.com/pengchenggang/p/17037320.html代码片段:::details目录目录代码片段Step.1:massCode代码片段管理Step.2:Vue2ini......
  • memcached并发CAS模式
    ​​http://hudeyong926.iteye.com/blog/1463992​​应用场景分析:​​http://hudeyong926.iteye.com/blog/1172189​​如原来MEMCACHED中的KES的内容为A,客户端C1和客户端C2......