AICon 深圳站聚焦 Agent 技术、应用与生态,大咖分享实战干货 了解详情
写点什么

为什么 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:271049

评论

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

阶跃星辰开源 130B 端到端语音大模型 Step-Audio-AQAA;MiniMax计划发布独立音频生成应用丨日报

声网

建筑一体化弧形LED显示屏

Dylan

数字 城市 LED显示屏 全彩LED显示屏 led显示屏厂家

Last Call丨全球权威轻量化大奖Altair Enlighten Award 报名即将截止!

Altair RapidMiner

仿真 hyperworks 汽车轻量化 结构优化 可持续发展

解答你关于 IoTDB 用户大会的所有问题!早鸟报名“加鸡腿”福利追加

Apache IoTDB

京东率先开启“3D信息流时代” 让购物更有趣

京东零售技术

商品中心—商品属性与状态流转的技术文档

不在线第一只蜗牛

数据库

鸿蒙便捷生活类应用上架流程一

小赵学鸿蒙

运动健康 HarmonyOS应用上架

🌟Harmony OS Next手势操作大揭秘:让你的App动感十足!🌟

Turing_010

为何京东与蚂蚁集团竞相申请稳定币牌照?

TechubNews

解读Sam Altman的“温柔奇点”

PowerVerse

AI 数据中心 去中心化 云算力 DePIN

Univar Solutions发布2024年ESG报告

财见

通过Mac电脑终端代码修改想要保存的图片格式

柠檬与橘子

鸿蒙开发笔记:Ability Kit 在美颜相机中的基础应用

yimapingchuan

鸿蒙应用开发:ArkUI构建美颜相机界面的实战解析

yimapingchuan

HarmonyOS

提升 AI 交付效率:嘉为蓝鲸 CPack 制品库 ML 模型管理功能助力 DevOps 落地

嘉为蓝鲸

DevOps 制品库 CPack

老代码别硬改!AI 秒破遗留系统重构 3 大死穴,90% 工程师踩过的坑

飞算JavaAI开发助手

鸿蒙开发实战:Accessibility Kit 在美颜相机中的无障碍优化

yimapingchuan

HarmonyOS

鸿蒙Next仓颉语言开发实战教程:订单详情

幽蓝计划

祖传代码救命指南!AI 一键解析 + 智能重构,让老系统起死回生

飞算JavaAI开发助手

鸿蒙开发笔记:Core File Kit在美颜相机中的文件管理实践

yimapingchuan

HarmonyOS

TablePlus 代码审查功能的使用

柠檬与橘子

京东零售基于Flink的推荐系统智能数据体系 |Flink Forward Asia 峰会实录分享

京东零售技术

如何从CAD外部参照快速提取表格数据?详细教程来了

在路上

HarmonyOS开发实战:ArkData在美颜相机中的数据管理实践

yimapingchuan

HarmonyOS

鸿蒙开发日记:ArkWeb在美颜相机中的Web滤镜商店集成

yimapingchuan

HarmonyOS

传统数据仓库正在被 Agentic AI 吞噬?Agentic Data Stack 初探

白鲸开源

大数据 AI 数据仓库 数据科学 Agentic AI

技术天才集结令!6/26 北京高校大模型技术交流开放日来了

京东零售技术

个人网站大更新,还是有个总站比较好

程序员郭顺发

成功案例丨Altair 数字孪生技术助力GEZE打造智能建筑新标杆

Altair RapidMiner

制造业 数字孪生 仿真 智能制造

HarmonyOS开发日记:ArkTS在美颜相机中的高效开发实践

yimapingchuan

HarmonyOS

HarmonyOS开发记录:Background Tasks Kit在美颜相机中的后台处理优化

yimapingchuan

HarmonyOS

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