QCon北京|3天沉浸式学习,跳出信息茧房。 了解详情
写点什么

为什么 Redis 快照使用子进程 (三)

  • 2019-12-26
  • 本文字数:1404 字

    阅读完需:约 5 分钟

为什么 Redis 快照使用子进程 (三)

写时拷贝(Copy-on-Write)的出现就是为了解决这一问题,就像我们在这一节开头介绍的,写时拷贝的主要作用就是将拷贝推迟到写操作真正发生时,这也就避免了大量无意义的拷贝操作。在一些早期的 *nix 系统上,系统调用 fork 确实会立刻对父进程的内存空间进行复制,但是在今天的多数系统中,fork 并不会立刻触发这一过程:



fork 函数调用时,父进程和子进程会被 Kernel 分配到不同的虚拟内存空间中,所以在两个进程看来它们访问的是不同的内存:


  • 在真正访问虚拟内存空间时,Kernel 会将虚拟内存映射到物理内存上,所以父子进程共享了物理上的内存空间;

  • 当父进程或者子进程对共享的内存进行修改时,共享的内存才会以页为单位进行拷贝,父进程会保留原有的物理空间,而子进程会使用拷贝后的新物理空间;


在 Redis 服务中,子进程只会读取共享内存中的数据,它并不会执行任何写操作,只有父进程会在写入时才会触发这一机制,而对于大多数的 Redis 服务或者数据库,写请求往往都是远小于读请求的,所以使用 fork 加上写时拷贝这一机制能够带来非常好的性能,也让 BGSAVE 这一操作的实现变得非常简单。

总结

Redis 实现后台快照的方式非常巧妙,通过操作系统提供的 fork 和写时拷贝的特性轻而易举的就实现了这个功能,从这里我们就能看出作者对于操作系统知识的掌握还是非常扎实的,大多人在面对类似的场景时,想到的方法可能就是手动实现类似『写时拷贝』的特性,然而这不仅增加了工作量,还增加了程序出现问题的可能性。


到这里,我们简单总结一下 Redis 为什么在使用 RDB 进行快照时会通过子进程的方式进行实现:


  1. 通过 fork 创建的子进程能够获得和父进程完全相同的内存空间,父进程对内存的修改对于子进程是不可见的,两者不会相互影响;

  2. 通过 fork 创建子进程时不会立刻触发大量内存的拷贝,内存在被修改时会以页为单位进行拷贝,这也就避免了大量拷贝内存而带来的性能问题;


上述两个原因中,一个为子进程访问父进程提供了支撑,另一个为减少额外开销做了支持,这两者缺一不可,共同成为了 Redis 使用子进程实现快照持久化的原因。到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:


  • Nginx 的主进程会在运行时 fork 一组子进程,这些子进程可以分别处理请求,还有哪些服务会使用这一特性?

  • 写时拷贝其实是一个比较常见的机制,在 Redis 之外还有哪里会用到它?


如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。

Reference

相关文章


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/whys-the-design-redis-bgsave-fork


2019-12-26 17:27902

评论

发布
暂无评论
发现更多内容

鸿蒙文件传输三方库上线开源鸿蒙社区 十行代码实现大文件高速传输

最新动态

用Golang打造金融科技后端:高效与安全的双重构建

xuyinyin

京东一面:子线程如何获取父线程ThreadLocal的值

采菊东篱下

Java 编程

基于 MySQL 8.0 细粒度授权:单独授予 KILL 权限的优雅解决方案

GreatSQL

通义灵码上新推理模型,快来体验数学和编程双冠王 Qwen2.5-Max

阿里云云效

阿里云 云原生 通义灵码 AI程序员 AI程序员体验官

1688店铺所有商品API接口(1688API系列)

tbapi

1688API 1688店铺所有商品API接口

2025 全球人形机器人赛道研究分析!

机器人头条

科技 大模型 人形机器人 具身智能

120万用户背后:质变科技如何定义自主式AI数据分析?

AI数据云Relyt

数据分析 数据科学 LLM Datacloud AI分析

NTFS Disk by Omi NTFS for mac(NTFS 磁盘管理器)

Mac相关知识分享

Photoshop CC 2019 for Mac(ps cc2019直装版)

Mac相关知识分享

质变科技AI-ready Data Cloud:生成式数据分析Relyt AI全球用户突破120万

AI数据云Relyt

数据分析 Datacloud AI分析 生成式AI分析 AI数据分析

细数 List 的10个坑,保证你一定遇到过!

架构师之道

Java 编程

Spring Boot 3.0核心特性解读

秃头小帅oi

对比Jira/禅道后,我们为什么选择Leangoo做敏捷项目管理?

云端拾光

项目管理 敏捷研发 敏捷工具 看板工具 看板软件

质变科技AI-ready Data Cloud:生成式AI分析 VS ChatGPT

AI数据云Relyt

ChatGPT 生成式AI LLM ChatBI AI分析

3D LED屏幕的创新应用及未来发展方向

Dylan

应用 3D LED LED display LED显示屏

GPO 配置的 4 种常见安全错误及安全优化策略

运维有小邓

AD域管理 组策略管理 GPO管理

解密注意力机制:为什么Flash Attention这么屌?

伤感汤姆布利柏

面试官: 美团外卖的分库分表怎么设计?

架构师之道

Java 编程

【干货】零售商的商品规划策略

第七在线

韩国互联网巨头 NAVER 如何借助 StarRocks 实现实时数据洞察

StarRocks

Clickhouse StarRocks #大数据 naver

Acrobat Pro DC 2024 for mac (PDF编辑转换器)

Mac相关知识分享

让状态管理不再头疼的“管家”——Vuex

高端章鱼哥

Alfred 5 for Mac(苹果效率提升工具)

Mac相关知识分享

Keka for Mac(mac压缩解压软件)中文版

Mac相关知识分享

VNC Server for Mac(VNC远程控制软件)

Mac相关知识分享

Luminar Neo for mac(图像编辑软件)

Mac相关知识分享

DeepSeek搭建个人知识库教程

派大星

DeepSeek-R1

面试官:你工作中做过 JVM 调优吗?怎么做的?

采菊东篱下

Java 编程

解决跨域问题的这6种方案,真香!

伤感汤姆布利柏

通义灵码上新推理模型,快来体验数学和编程双冠王 Qwen2.5-Max

阿里巴巴云原生

阿里云 云原生 通义灵码 AI程序员 AI程序员体验官

为什么 Redis 快照使用子进程 (三)_语言 & 开发_Draveness_InfoQ精选文章