常见的持久化开发与运维问题

fork 操作

  • fork 操作是一个同步操作,若执行较慢会阻塞 redis 主线程

  • 执行时间与内存量相关:内存越大,耗时越长;虚拟机较慢,真机较快

  • 查看 fork 执行时间,可做监控

    info : latest_fork_usec 上一次执行fork的微秒数

改善 fork
  • 优先使用物理机或者高效支持fork操作的虚拟化技术

  • 控制 Redis 实际最大可用内存:maxmemory

  • 合理配置 Linux 内存分配策略 vm.overcommit_memory = 1

    默认这个值为 0,表示当发现没有足够内存做内存分配的时候,就不去分配。在内存比较低的时候,会发生fork 阻塞。设置为 1 表示认为机器有足够内存,来做内存分配。

  • 降低 fork 频率:例如放宽 AOF 重写自动触发时机,不必要的全量复制

子进程开销和优化

  • CPU 开销

    • RDB 和 AOF 都会生成文件,属于 CPU 密集型
    • 优化1:不做 CPU 绑定,不和 CPU 密集型的应用部署在同一台服务器上
    • 优化2:避免在单机多部署的场景大量发生 AOF 重写
  • 内存
    • 开销:fork内存开销,copy-on-write,子进程会共享父进程的物理内存页,当父进程执行写请求的时候会创建一个副本,此时会消耗内存。即父进程在大量写入的时候,子进程开销会比较大,创建副本。
    • 优化1:防止单机多部署的时候发生大量的重写
    • 优化2:echo never > /sys/kernel/mm/transparent_hugepage/enabled
      • Linux 内核的 2.6.38 版本中增加以上配置,支持大的内存页的分配
      • 内存页分配越大,会提高创建副本页的大小,影响性能
  • 硬盘
    • 开销:RDB 与 AOF 文件写入的场景,可以结合 iostat、iotop 工具进行分析
    • 优化1:不要和高硬盘负载服务部署在一起,例如存储服务、消息队列
    • 配置:no-appendfsync-on-rewrite = yes
    • 根据写入量决定磁盘类型:例如 SSD
    • 单机多实例持久化目录可以考虑分盘以及做资源限制,例如 cgroup

AOF 追加阻塞

Redis在执行 fsync 的时候,redis 为了保证 AOF 文件安全性,会校验上次 fsync 的时间是否大于2秒。若超过2秒,会发生阻塞。

AOF 阻塞定位
  • 通过Redis日志进行定位。出行这行,即发生阻塞:

    Asynchronous AOF fsync is taking too long (disk is busy?)
    Writing the AOF buffer without waiting for fsync to complete,this may show down Redis
  • 通过 info persistence 命令进行查看:每发生一次,aof_delayed_fsync 会增 1 。

如图,aof_deloayed_fsync:0,说明 aof 并没有发生阻塞。

  • 通过 df -hdu -sh 统计整体磁盘情况和查看单独目录点用情况。

优化方法可以参考硬盘优化策略。

redis 学习(20)-- 常见的持久化开发与运维问题的更多相关文章

  1. Redis开发与运维学习笔记

    <Redis开发与运维>读书笔记   一.初始Redis 1.Redis特性与优点 速度快.redis所有数据都存放于内存:是用C语言实现,更加贴近硬件:使用了单线程架构,避免了多线程竞争 ...

  2. Redis学习笔记六:持久化实验(AOF,RDB)

    作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...

  3. Redis开发与运维:SDS

    STRING 我们会经常打交道的string类型,在redis中拥有广泛的使用.也是开启redis数据类型的基础. 在我最最开始接触的redis的时候,总是以为字符串类型就是值的类型是字符串. 比如: ...

  4. 百度王一男: DevOps 的前提是拆掉业务-开发-测试-运维中间的三面墙

    这是一个创建于 375 天前的主题,其中的信息可能已经有所发展或是发生改变. 由数人云.优维科技.中生代社区联合发起的 系列 Meetup < DevOps&SRE 超越传统运维之道&g ...

  5. Redis学习总结(1)——数据持久化

    以前研究Redis的时候,很多东西都不太明白,理解得也不太深,现在有时间重新拾起来看看,将一些心得记录下来,希望和大家一起探讨. 一.简介 Redis是一个单线程高可用的Key-Value存储系统,和 ...

  6. 《Redis开发与运维》

    第1章 初识Redis 1. Redis介绍: Redis是一种基于键值对(key-value)的NoSQL数据库. 与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).has ...

  7. Redis实战(七)Redis开发与运维

    Redis用途 1.缓存 Redis提供了键值过期时间设置, 并且也提供了灵活控制最大内存和内存溢出后的淘汰策略. 可以这么说, 一个合理的缓存设计能够为一个网站的稳定保驾护航. 2.排行榜系统 Re ...

  8. Redis 开发与运维

    Getting Start 高性能 性能优势的体现 C语言实现的内存管理 epoll的I/O多路复用技术+IO连接/关闭/读写通过事件实现异步的非阻塞IO TCP协议 单线程架构,不会因为高并发对服务 ...

  9. 《Redis开发与运维》快速笔记(一)

    1.前言&基本介绍 在原始的系统架构中,我们都由程序直接连接DB,随着业务的进一步开展,DB的压力越来越大,为了缓解DB的这一压力,我们引入了缓存,在程序连接DB中加入缓存层, 从而减轻数据库 ...

随机推荐

  1. CISCO实验记录一:路由器基本配置

    一.路由器基本配置要求 1.设置路由器名为:hehe 2.设置特权模式下password为ccna,secret为ccnp,vty线路密码为ccie 3.所有明文密码都加密 二.路由器基本配置命令 1 ...

  2. HDU2795线段树入门 简单查询和修改

    http://acm.hdu.edu.cn/showproblem.php?pid=2795 #include<iostream> using namespace std; ; int h ...

  3. postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)

    通过触发器方式获取表最后更新时间,并将时间信息写入到另外一张表 一.创建测试表和表记录更新时间表 CREATE TABLE weather( city varchar(80), temp_lo int ...

  4. 如何解决Sublime text中文乱码问题

    Sublime Text 2是一个非常不错的源代码及文本编辑器,但是不支持GB2312和GBK编码在很多情况下会非常麻烦.不过Sublime Package Control所以供的插件可以让Subli ...

  5. 【SR汇总】算法时间效率

    1.SRCNN-0.39s SRCNN处理速度. 论文:Learning a Deep Convolutional Network forImage Super-Resolution 中,4.2节. ...

  6. 安装win10提示“我们无法创建新的分区,也找不到现有分区”

    用U盘安装操作系统,但是遇到了这种问题. 出现这种情况可能是硬盘格式通过指令写死了,所以我们需要通过指令把格式清零, 补充: 其实系统找不到系统分区这种情况其实就是引导程序出了问题,可以用大白菜这种w ...

  7. sqliteDOC创建数据库

    上次刚接触SqlLite,不知道怎么创建数据库,现在做下总结: 界面和MYSQL一样,都是CMD界面,但不是在SQLite.exe中创建数据库: 首先还是说一下cmd下sqlite的使用网上已经很多了 ...

  8. Redis 集群部署

    一.下载所需软件包 redis wget http://download.redis.io/releases/redis-4.0.6.tar.gz ruby wget https://cache.ru ...

  9. HBase管理与监控——内存调优

    HMaster 没有处理过重的负载,并且实际的数据服务不经过 HMaster,它的主要任务有2个:一.管理Hbase Table的 DDL操作, 二.region的分配工作,任务不是很艰巨. 但是如果 ...

  10. Java日志体系(三)commons-logging

    1.1 简介 Apache Commons Logging,又名JakartaCommons Logging (JCL),它是Apache提供的一个通用的日志接口,它的出现避免了和具体的日志方案直接耦 ...