redis 突然大量逐出导致读写请求block

redis作为缓存场景使用,内存耗尽时,突然出现大量的逐出,在这个逐出的过程中阻塞正常的读写请求,导致 redis 短时间不可用;

redis 中的LRU是如何实现的?

逐出qps突增非常大的原因:一次需要逐出释放太多的空间会导致阻塞;具体的原因是 mem_tofree 的计算逻辑有问题;
mem_tofree 统计的是:实际已分配的内存总量 – AOF 缓冲区相关的内存;
如果这时候有rehash,会临时分配一个桶来做rehash,这部分内存未排除,所以在rehash阶段,算出来的mem_tofree 就会很大,造成一个时刻需要逐出大量的key,逐出的loop是阻塞的,这个阶段会block redis的请求;

逐出qps的计算:

freeMemoryIfNeeded(...)
    // 计算出 Redis 目前占用的内存总数,但有两个方面的内存不会计算在内:
    // 1)从服务器的输出缓冲区的内存
    // 2)AOF 缓冲区的内存
    // 3)AOF 重写缓冲区中的内存
    mem_used = zmalloc_used_memory();
    if (slaves) {
        listIter li;
        listNode *ln;

        listRewind(server.slaves,&li);
        while((ln = listNext(&li))) {
            redisClient *slave = listNodeValue(ln);
            unsigned long obuf_bytes = getClientOutputBufferMemoryUsage(slave);
            if (obuf_bytes > mem_used)
                mem_used = 0;
            else
                mem_used -= obuf_bytes;
        }
    }
    if (server.aof_state != REDIS_AOF_OFF) {
        mem_used -= sdslen(server.aof_buf);
        mem_used -= aofRewriteBufferSize();
    }
    // 计算需要释放多少字节的内存
    mem_tofree = mem_used - server.maxmemory;
    propagateExpire(db,keyobj);
    // 计算删除键所释放的内存数量
    delta = (long long) zmalloc_used_memory();
    dbDelete(db,keyobj);
    delta -= (long long) zmalloc_used_memory();
    mem_freed += delta;
    // 对淘汰键的计数器增一
    server.stat_evictedkeys++;

解决方案

github上 @Rosanta 给出的解决方案:释放内存的循环逻辑中最多执行一定次数,达到阈值了就不再逐出,到下个请求来时再释放一点空间;这个方案的好处是不会 block 整个进程,正常的业务读写请求无影响;潜在问题是可能单次写入的数据比释放的空间还大,导致总的内存是一直上升,而不是下降;

ref

Original: https://www.cnblogs.com/me115/p/8516838.html
Author: 大CC
Title: redis 突然大量逐出导致读写请求block

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529110/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis 常见面试题(2020最新版)

    https://www.cnblogs.com/javazhiyin/p/13839357.html 概述 什么是Redis Redis(Remote Dictionary Ser…

    Linux 2023年5月28日
    0109
  • linux-0.11分析:进程初始化函数init(),第三部分,fork创建第二个进程,第十四篇随笔

    第三部分,fork创建第二个进程 [引用github这个博主 多多支持][ https://github.com/sunym1993/flash-linux0.11-talk ]先…

    Linux 2023年6月7日
    0217
  • linux下利用inode删除文件

    由于 linux下中文编码和在Windows中的中文编码可能不同,在一定的条件下,linux的文件夹可能会存在乱码的情况就算一些乱七八糟的字符。如问号的文件名,这样的文件使用rm …

    Linux 2023年6月6日
    0107
  • 模拟一个简单的tomcat

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0121
  • 操作系统实战45讲笔记 -06 程序中的地址如何转换

    每个应用程序的虚拟地址空间都是相同且独立的。 虚拟地址是由链接器产生的。开发软件经过编译步骤后,就需要链接成可执行文件才可以运行,而链接器的主要工作就是把多个代码模块组装在一起,并…

    Linux 2023年6月7日
    0120
  • ELF文件的笔记

    ELF 说明 ELF文件的英文全称是 The Executable and Link Format, 最初是由UNIX系统实验室开发、发布的ABI(Application Bina…

    Linux 2023年6月7日
    0123
  • Redis 集群

    三高架构:并发,性能,可用 主从复制 主从复制:将 master 中的数据即时、有效的复制到 slave 中 特征:一个 master 可以拥有多个 slave,一个 slave …

    Linux 2023年5月28日
    0110
  • Java基础 | Stream流原理与用法总结

    Stream简化元素计算; 一、接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式;依旧先看核心接口的设计: B…

    Linux 2023年6月13日
    0113
  • Java基础系列–01_基础类型

    J2SE、J2ME、J2EE分别指什么?J2SE 基础版,桌面应用。J2ME 微型版,手机开发。(android,ios)J2EE 企业版,所有浏览器访问的应用程序。注意:JDK5…

    Linux 2023年6月7日
    0102
  • 笔记本 vmware 搭建的k8s 集群出现磁盘io爆满,node无法运行pod

    问题描述: k8s集群只有一个master节点和一个node节点,运行了一些java pod 之后出现磁盘io 爆满,pod无法调度和新建,但是节点的内存和磁盘空间都是充足的。 问…

    Linux 2023年6月14日
    0107
  • __pycache__

    最近在使用python写一个串口模块的时候,偶然发现运行脚本之后,在工程文件夹下面出现了这样一个文件夹__pycache__,所以就特意到网上查了一下这个文件夹是怎么回事。 &am…

    Linux 2023年6月14日
    0117
  • 【电子取证:FTK Imager篇】FTK Imager制作镜像详细介绍

    以DD镜像制造为例,详细介绍了FTK Imager创建镜像的过程,记得大学的时候学习这些没什么教程,找到的资料也是语焉不详,故在此啰嗦一番—【suy】 一、磁盘镜像制作…

    Linux 2023年6月13日
    01.3K
  • SSH_远程终端

    SSH 远程服务 目的 Windwos 和 Linux 的终端控制系统or传送传送文件, 当然 Linux和Linux 以及 Windwos 和 Windwos 之间的通信都是OK…

    Linux 2023年6月7日
    092
  • docker 安装redis

    1、获取 redis 镜像 2、查看本地镜像 bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问 protected-mode no #默认yes,开启保…

    Linux 2023年5月28日
    092
  • vsftpd 操作手册-完整版

    vsftpd 目录 – ftp 简介 – vsftpd 简介 – vsftpd 安装&卸载 – vsftpd 配置文件 – vsftpd 认证模板 – vsftpd 配置模…

    Linux 2023年6月13日
    086
  • redis缓存按条件查询,删除等等i_master_cell

    先用hash 存masterid中的全部i_master_cell key为master_id hash里面为key 为cell_id value为i_master_cell的各个…

    Linux 2023年5月28日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球