查看redis aof内存_Redis持久化问题定位与优化技巧

今天主要分享继Redis持久化方式RDB、AOF之后的一些常用的Redis问题定位于优化方式。这里主要CPU、内存、磁盘在三个维度去分析问题!

Fork操作

当Redis做RDB或AOF重写时,一个必不可少的操作就是执行fork操作创建子进程,对于大多数操作系统来说fork是个重量级操作

虽然fork创建的子进程不需要拷贝父进程的物理内存空间,但是会复制父进程的空间内存页表。例如对于10GB的Redis进程,需要复制大约20MB的内存页表,因此fork 操作耗时跟进程总内存量息息相关,如果使用虚拟化技术,特别是Xen虚拟 机,fork操作会更耗时

  • 在做 RDB 或 AOF 重写时, fork 是必不可少的
  • 对于大多数操作系统来说, fork 是个重量级错误
  • fork 会复制符进程的空间内存页表
  • 如果使用虚拟化技术, 特别是 Xen 虚拟机, fork 操作会更耗时

fork 耗时问题定位:

  • 高流量的 Redis 实例 ops 可达5万以上
  • 正常情况 fork 耗时应该是每 GB 消耗 20ms 左右
  • 可以用 info stats 命令查看 latest_fork_usec 指标, 获取最近一次 fork 操作耗时, 单位微秒

如何改善 fork 操作的耗时:

  • 优先使用物理机或者高效支持 fork 操作的虚拟化技术, 避免使用 Xen
  • 控制 Redis 实例最大可用内存, fork 耗时跟内存量成正比, 线上建议每个 Redis 实例内存控制在 10GB 以内
  • 合理配置 Linux 内存分配策略, 避免物理内存不足导致 fork 失败, 具体细节见12.1节 “Linux 配置优化”
  • 降低 fork 操作的频率, 如适度放宽 AOF 自动触发时机, 避免不必要的全量复制等

子进程开销进程与优化

子进程负责AOF或者RDB文件的重写,它的运行过程主要涉及CPU、内存、硬盘三部分的消耗

CPU

  • CPU 开销分析。子进程负责把进程内的数据分批写入文件, 这个过程属于 CPU 密集操作, 通常子进程对单核 CPU 利用率接近90%
  • CPU 消耗优化。Redis 是 CPU 密集型服务, 不要做绑定单核 CPU 操作。由于子进程非常消耗 CPU, 会和父进程产生单核资源竞争.
  1. 不要和其他 CPU 密集型服务部署在一起, 造成 CPU 过度竞争
  2. 如果部署多个 Redis 实例, 尽量保证同一时刻只有一个子进程执行重写工作, 具体细节见5.4节多实例部署

硬盘

  • 硬盘开销分析

子进程主要职责是把 AOF 或者 RDB 文件写入硬盘持久化。势必造成硬盘写入压力。根据 Redis 重写 AOF/RDB 的数据量, 结合系统工具如 sar、iostat、iotop 等, 可分析出重写期间硬盘负载情况

  • 硬盘开销优化
    • 不要和其他高硬盘负载的服务部署在一起。如: 存储服务、消息队列服务等
    • AOF 重写时会消耗大量硬盘 IO, 可以开启配置 no-appendfsync-on-rewrite, 默认关闭。表示在 AOF 重写期间不做 fsync 操作
    • 当开启 AOF 功能的 Redis 用于高流量写入场景时, 如果使用普通机械磁盘, 写入吞吐一般在 100MB/s 左右, 这时 Redis 实例的瓶颈主要在 AOF 同步硬盘上
    • 对于单机配置多个 Redis 实例的情况, 可以配置不同实例分盘存储 AOF 文件, 分摊硬盘写入压力

配置 no-appendfsync-on-rewrite=yes 时, 在极端情况下可能丢失整个 AOF 重写期间的数据,需要根据数据安全性决定是否配置

内存

  • 内存消耗分析

子进程通过 fork 操作产生, 占用内存大小等同于父进程, 理论上需要两倍的内存来完成持久化操作, 但 Linux 有写时复制机制 (copy-on-write)。父子进程会共享相同的物理内存页, 当父进程处理写请求时会把要修改的页创建副本, 而子进程在 fork 操作过程中共享整个父进程内存快照。

  • 内存消耗监控
    • RDB 重写: 被修改的内存页可以等价认为 RDB 重写的消耗
    • AOF 重写: 被修改的内存页 + AOF 重写缓冲区
  • 内存消耗优化
    • 如果部署多个 Redis 实例, 尽量保证同一时刻只有一个子进程在工作
    • 避免在大量写入时做子进程重写操作, 这样将导致父进程维护大量页副本, 造成内存消耗

Transparent Huge Pages(THP) 是 Linux kernel 在2.6.38增加的功能, 支持 huge page (2MB) 页分配, 会降低 fork 速度, 默认开启. 当开启时, 在 fork 后会大幅增加重写期间父进程的内存消耗, 建议关闭:

sudo echo never>/sys/kernel/mm/transparent_hugepage/enabled

AOF追加阻塞

当开启AOF持久化时,常用的同步硬盘的策略是everysec,用于平衡性 能和数据安全性。对于这种方式,Redis使用另一条线程每秒执行fsync同步 硬盘。当系统硬盘资源繁忙时,会造成Redis主线程阻塞!如下图所示

408b61fbe03f3f744723143bd0b6919d.png

阻塞流程分析

  • 如果距上次同步成功时间在2秒内,主线程直接返回
  • 如果距上次同步成功时间超过2秒,主线程将会阻塞,直到同步操作完 成。
    • 主线程负责写入AOF缓冲区
    • AOF线程负责每秒执行一次同步磁盘操作,并记录最近一次同步时 间
    • 主线程负责对比上次AOF同步时间:

通过对AOF阻塞流程可以发现两个问题

  • everysec配置最多可能丢失2秒数据,不是1秒
  • 如果系统fsync缓慢,将会导致Redis主线程阻塞影响效率

AOF阻塞问题定位

  • 每当发生AOF追加阻塞事件发生时,在info Persistence统计中, aof_delayed_fsync指标会累加,查看这个指标方便定位AOF阻塞问题。
  • AOF同步最多允许2秒的延迟,当延迟发生时说明硬盘存在高负载问 题,可以通过监控工具如iotop,定位消耗硬盘IO资源的进程
  • 发生 AOF 阻塞时, Redis 输出如下日志, 用于记录 AOF fsync 阻塞导致拖慢 Redis 服务的行为
Asynchronous AOF fsync is taking too long (disk is busy). Writing the AOF bufferwithout waiting for fsync to complete, this may slow down Redis
  • 每当发生 AOF 追加阻塞事件发生时, 在info Persistence 统计中, aof_delayed_fsync 指标会累加, 查看这个指标方便定位 AOF 阻塞问题
  • AOF 同步最多允许2秒的延迟, 当延迟发生时说明硬盘存在高负载问题, 可以通过监控工具如 iotop, 定位消耗硬盘 IO 资源的进程

更多原创技术分享,关注公众号:码农架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows设置mysql使用率_Windows下配置Mysql

这里说的配置Mysql,是在安装时进行的,请先查看:Windows平台下安装Mysql紧接上文,安装完成后将配置选项打上对勾,按下“Finish”,出现下面的界面,这里有一个很好的功能,mysql配置向导…

mysql 云无忧ps教程_华为云数据库MySQL一键开通读写分离,无忧应对企业业务高峰情景...

业务大促,订单暴增,网站流量暴涨几倍,数据库服务器容量又要扛不住了,眼睁睁看着生意白白溜走,再苦逼也无法解决,“肿”么办?别担心,一键开通读写分离,而且只需一个连接地…

python 基因序列提取_科学网—简单的Python脚本提取对应位置基因序列(fasta文件) - 王彬忠的博文...

最近,用Python脚本提取,在基因号已知,位置已知条件下,相对应位置的基因序列时发现,这样很简单但是很实用的脚本,在网上却比较难找。而且,能被找到的脚本,相对于具有初级编程能力的人…

python是强定义语言吗_python是强类型语言吗

强弱是对类型而言的。强类型,你有一个值之后这个值是什么类型是确定,比如n1,n的类型是确定的(字符串),因此你不能在Python做n3 mn1运算。而弱类型就不是这样的,值的类型可以在需要的时候再去确定,比如PHP里…

深入java核心_Java核心(五)深入理解BIO、NIO、AIO

导读:本文你将获取到:同/异步 阻/非阻塞的性能区别;BIO、NIO、AIO 的区别;理解和实现 NIO 操作 Socket 时的多路复用;同时掌握 IO 最底层最核心的操作技巧。BIO、NIO、AIO 的区别是什么?同/异步、阻/非阻塞…

java arraylist底层实现原理_ArrayList和LinkedList底层原理

ArrayList和LinkedList都是List的实现类,是在日常开发中经常被使用到的两个集合,我们来结合源码看下两个集合的不同之处。先来看下ArrayList的源码:// 默认的初始化大小private static final int DEFAULT_CAPACITY 10;ArrayList的底层数数组…

java 3_Java 3 (Java的数据类型)

Java的数据类型主要内容:1Java数据类型的分类2.8种基本数据类型3.理解引用类型的特点一、什么是数据类型?计算机语言将数据按性质进行分类,每一类称为一种数据类型;数据类型定义了数据的性质、取值范围、存储方式、对数据所能进行…

java replace stringbuilder_java.lang.StringBuilder.replace()方法实例

全屏java.lang.StringBuilder.replace()方法按照这个顺序,在指定的字符串的子字符串替换字符。子串开始在指定start的 索引,并延伸到该字符 end - 1,或如果序列的末端不存在这样的字符。声明以下是java.lang.StringBuilder.replace()方法的声…

中小学课java_java毕业设计_springboot框架的中小学排课与实现

这是一个基于java的毕业设计项目,毕设课题为springboot框架的中小学排课与实现, 是一个采用b/s结构的javaweb项目, 开发工具eclipsei/eclipse, 项目框架jspspringbootmybatis, 中小学排课与实现采用mysql进行数据存储, 并基于mybatis进行了orm实体关系映射, 该中小学排课与实现…

制作自己的 Docker 容器

软件开发最大的麻烦事之一,就是环境配置。用户必须保证操作系统的设置,各种库和组件的安装,只有它们都正确,软件才能运行。docker从根本上解决问题,软件安装的时候,把原始环境一模一样地复制过来。 以 koa-…

matlab差分算子的灰度图像边缘检测,常用图像边缘检测方法及MATLAB研究

论文2 1年 2月 I 01 5日现代电子技术M o e n El c r i sT e h qu d r e ton c c ni e第3 4卷第 4期Fe .2 11 b 0 Vo1 3 . . 4 NO 4常用图像边缘检测方法及 Malb研究 t a韦炜(安文理学院,陕西西安西 706 ) 1 0 5({№吨~一~一一一三一一垂”. ; _堇;~~ _一…

php %3c%3c%3cxml 报错,代码审计| APPCMS SQL-XSS-CSRF-SHELL

0x01 背景由若水师傅提供的一个素材,想要复现CNVD上披露的一个APPCMS的漏洞,由CNVD上的描述可以知道存在漏洞的地方是comment.php这个文件,然后就没有详细的漏洞信息了,所以就需要分析相应的源码文件找出存在漏洞的点。借这个素材…

php二进制保存到本地,C# 将二进制字符串保存到本地

C# 将二进制字符串保存到本地#region 将文件保存到本地/// /// 将文件保存到本地/// /// 文件的二进制数据字符串/// 文件名称,必须带后缀private void SaveFile(string psContent, string psFileName){byte[] accessory Convert.FromBase64String(psContent);//Sy…

suse 安装oracle11,Suse11安装Oracle11gR2

注:以下采用终端XmanagerEnterprise 4中的Xshell连接1、安装前参数修改vi /etc/security/limits.conf --末尾添加如下oracle soft nproc 2047oracle hard nproc 16384oracle soft nofile 1024oracle hard nofile 65536vi /etc/sysctl.conf --末尾添加如…

oracle 超市管理系统,SuperManager 超市账单管理系统 JSP + Servlet + Oracle Jsp/ 240万源代码下载- www.pudn.com...

文件名称: SuperManager下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 2144 KB上传时间: 2015-07-07下载次数: 0详细说明:超市账单管理系统JSP Servlet Oracle-超市账单管理系统JSP Servlet Oracle文件列表(点击判断是否您需要的文件,如果是…

linux命令行的操作符,如何在Linux命令行中进行基本的数学运算

原标题:如何在Linux命令行中进行基本的数学运算Linux bash或命令行允许您执行基本和复杂的算术和布尔运算。像expr,jot,bc和factor等命令可以帮助您找到复杂问题的最优数学解决方案。在本文中,我们将描述这些命令并提供示例&#…

linux什么用户什么任务,linux任务里的1 和2是什么意思

输出学过代码的小伙伴应该知道STDIN、STDOUT、STDERR通常都是指定输出通道的,perl里又称之为句柄那么1代表的就是STDOUT、2代表的是STDERR、jimmy在视频中会翻译成1代表的是正确输出,2代表的是错误输出。其实严格上不能这样去固有化去理解每一个软件的定…

linux .desktop权限,如何在Ubuntu Xenial Xerus 16.04 Linux Desktop上以root用户身份登录

您可能已经注意到,默认情况下,Ubuntu Xenial Xerus 16.04 Linux Desktop不具备以root管理员用户身份登录的功能。每次尝试以root用户身份在终端上登录都会导致Login incorrect错误信息:。默认的Ubuntu Linux桌面行为的背后原因是,…

2048游戏c语言linux简易代码,C语言实现2048游戏代码

本文实例为大家分享了C语言实现2048游戏具体代码,供大家参考,具体内容如下效果图:使用文本界面的屏幕绘图库 ncurses.设计思路:在满足条件情况下消除方块允许在游戏主界面(16 宫格)中任意一格输出数据实现代码:#include #include #include #include #inc…

linux shell结构,linux——Shell的控制结构(附shell编写代码和运行结果)

针对shell的控制结构,也就是shell编程时所需要的三种控制流程,顺序/分支和循环。在bash中,顺序可由简单的输入输出命令组成;分支语句由if、case实现;循环语句用for、while和until来实现。一、if语句1、基本的if语句语句…