报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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

评论

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

ActionDB 扩展 OB GIS 能力:新增 ST_PointN 函数

爱可生开源社区

GIS oceanbase actiondb

Amazon Bedrock 模型微调实践(一):微调基础篇

亚马逊云科技 (Amazon Web Services)

生成式AI

利用 AI 增强 API 和微服务的云安全性

哦豁完蛋了

方法 AI Studio API 文档

【YashanDB知识库】如何远程连接、使用YashanDB?

YashanDB

yashandb 崖山数据库 崖山DB

智谱AI给你带来了新的观赛搭子 AI马凡舒央视频陪你熬夜看奥运

技术研究院

如何构建一个大模型?看完你就知道了!

博文视点Broadview

京东API接口解析:京东商品列表数据接口

tbapi

京东API 京东商品列表数据接口 京东商品数据采集 关键词搜索京东商品列表

蚌埠住了!我把斯坦福大牛的Web安全开发指南给分享出来了!

我再BUG界嘎嘎乱杀

网络安全 安全 WEB安全 网安

NFTScan | 07.22~07.28 NFT 市场热点汇总

NFT Research

NFT\ NFTScan

ShareSDK第三方平台使用指南——QQ

MobTech袤博科技

开发者 产品动态

2款软件一键替换PPT背景,告别繁琐,你也可以!

彭宏豪95

人工智能 高效工作 PPT AIGC AI生成PPT

“新质互联网”解读:新在哪里,利在何处?

Alter

实战基于terraform-compliance实现IaC安全

我再BUG界嘎嘎乱杀

云计算 网络安全 安全 自动化运维

MobPush高效实现全球多时区定时定期推送,做中国开发者出海的坚实助力者

MobTech袤博科技

开发者 产品动态

人工智能|利用人工智能自动找bug

霍格沃兹测试开发学社

Web3 游戏周报(7.21 - 7.27)

Footprint Analytics

链游

【YashanDB知识库】如何使用yasldr导入lob类型?

YashanDB

yashandb 崖山数据库 崖山DB

交互式 PDF Q&A:一种检索-增强生成方法

哦豁完蛋了

AI 大底座 PDF 编辑器和注释器

让 AI 无处不在,英特尔揭秘 AI 与边缘技术结合的未来画卷

E科讯

taobao.item_get_desc API返回值中的商品标题与描述深度挖掘

技术冰糖葫芦

API 文档 API 测试 API 优先 API Hub

RPA是什么?探讨RPA发展的最新趋势

八爪鱼采集器︱RPA机器人

RPA RPAxAI

基于Drone实现CI/CD【0到1架构系列】

不在线第一只蜗牛

Java 架构 CI/CD

借助大语言模型快速升级你的 Java 应用程序

亚马逊云科技 (Amazon Web Services)

java

低代码应用版本管理能力探讨

鲸品堂

低代码 版本管理工具 版本管理 企业号2024年7月PK榜

开启智能化新纪元,TDengine 用户大会圆满落地:汽车、能源、烟草、电力行业洞见

TDengine

安全人士可以从CrowdStrike事件中汲取的五点教训

我再BUG界嘎嘎乱杀

网络安全 安全 网安 CrowdStrike

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