Redis 子进程开销监控和优化方式

Stella981
• 阅读 659

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

01

 CPU

CPU开销分析。 子进程负责把进程内的数据分批写入文件,这个过程 属于CPU密集操作,通常子进程对单核CPU利用率接近90%

CPU消耗优化。Redis是CPU密集型服务,不要做绑定单核CPU操作。由于子进程非常消耗CPU,会和父进程产生单核资源竞争

  • 不要和其他CPU密集型服务部署在一起,造成CPU过度竞争

  • 如果部署多个Redis实例,尽量保证同一时刻只有一个子进程执行重写 工作,具体见下一篇文章的“多实例部署”

02

 内存

  • 内存消耗分析

子进程通过 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

03

 磁盘

  • 硬盘开销分析

子进程主要职责是把 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 重写期间的数据,需要根据数据安全性决定是否配置

Redis 子进程开销监控和优化方式

总结

Redis 子进程开销监控和优化方式

配Redis持久化前后前后整理了三篇文章,归纳起来大致可分为下面几点

  • Redis 提供了两种持久化方式: RDB 和 AOF

  • RDB 使用一次性生成内存快照的方式, 产生的文件紧凑压缩比更高, 因此读取 RDB 恢复速度更快。由于每次生成 RDB 开销较大, 无法做到实时持久化, 一般用于数据冷备和复制传输

  • save 命令会阻塞主线程不建议使用, bgsave 命令通过 fork 操作创建子进程生成 RDB 避免阻塞

  • AOF 通过追加写命令到文件实现持久化, 通过 appendfsync 参数可以控制实时/秒级持久化。因为需要不断追加写命令, 所以 AOF 文件体积逐渐变大, 需要定期执行重写操作来降低文件体积

  • AOF 重写可以通过 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数控制自动触发, 也可以使用 bgrewriteaof 命令手动触发

  • 子进程执行期间使用 copy-on-write 机制与父进程共享内存, 避免内存消耗翻倍。AOF 重写期间还需要维护重写缓冲区, 保存新的写入命令避免数据丢失

  • 持久化阻塞主线程场景有: fork 阻塞和 AOF追加阻塞。fork 阻塞时间跟内存量和系统有关, AOF 追加阻塞说明硬盘资源紧张

  • 单机下部署多个实例时, 为了防止出现多个子进程执行重写操作, 建议做隔离控制, 避免 CPU 和 IO 资源竞争

- END -

Redis持久化推荐

[

Redis 持久化方式-AOF

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247493665%26idx%3D1%26sn%3D5ec9d3d4dbd568c57e4967ae6d66f569%26chksm%3Dfd63f89eca147188fa3bb62f661d2c118aebd21350a7d06a4b9bd4eaa6410ea9ec501c0c619c%26scene%3D21%23wechat_redirect)

[

Redis 持久化方式-RDB

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247493538%26idx%3D1%26sn%3D68ae9009394554294527af9ba0c7df11%26chksm%3Dfd63f71dca147e0b8256df08066d5ad977360e3ebe2d5409e40a15c66f18a398eb2a7eb740b4%26scene%3D21%23wechat_redirect)

[

Redis持久化问题定位与优化技巧

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247494013%26idx%3D1%26sn%3D7b7feb4dc6eaafb239d0820d30f17414%26chksm%3Dfd63f9c2ca1470d44f1c8f745dff90ceeeafb55ed9a6133852c5b81ad8cedf30bb299757dc22%26scene%3D21%23wechat_redirect)

[

Redis三种持久化方式

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247492366%26idx%3D3%26sn%3Df8ef038f85a97d990e019ac03adb1250%26chksm%3Dfd63f3b1ca147aa76e4cf07c5a91b1daff9ec368530abf5ff6007b510aadc5c2b05f6911547e%26scene%3D21%23wechat_redirect)

Redis 子进程开销监控和优化方式

本文分享自微信公众号 - 码农架构(iByteCoding)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这