写入方式、COW 与写放大

news/2025/9/29 16:23:05/文章来源:https://www.cnblogs.com/tiantao36/p/19119002

写入方式、COW 与写放大

明白了,你希望这个文档 在博客园或者 Markdown 环境下显示效果更美观,排版整齐、表格和代码块清晰、层级逻辑一目了然。我帮你彻底优化一下格式,兼顾可读性和视觉效果:


Linux 写入方式、COW 与写放大(Write Amplification)


1️⃣ 写时复制(Copy-On-Write, COW)

定义

多个进程或对象共享同一块内存/文件页,当某个进程写入时,内核才真正复制一份新的副本,保证原有共享者不受影响。

核心思想

读共享,写复制

典型应用场景

  • fork() 子进程继承父进程地址空间(写时才复制页)

  • mmap(MAP_PRIVATE) 映射文件,写入触发复制

  • 文件系统(ZFS/Btrfs/APFS)写入数据块时生成新块,不覆盖旧块


2️⃣ 写入方式对比

写方式是否涉及 COW说明
正常写 (fwrite → write) 用户缓冲 → 内核缓冲 → 文件,独立通道
直写 (write + O_SYNC / O_DIRECT) 数据直接落盘,无共享页复制
mmap (MAP_SHARED) 修改直接影响文件,共享进程可见
mmap (MAP_PRIVATE) 写时触发 COW,进程得到私有副本

结论:COW 只在 mmap(MAP_PRIVATE) 或 fork 场景出现,正常写和直写不触发 COW。


3️⃣ 内核层控制点

写方式内核参数 / 控制点说明
正常写 vm.dirty_ratio / vm.dirty_background_ratio 控制 page cache 脏页比例,决定何时刷盘
  vm.dirty_expire_centisecs / vm.dirty_writeback_centisecs 脏页过期时间 / 后台写回间隔
  mount -o sync / O_DSYNC / fdatasync() 强制同步落盘
直写 O_SYNC / O_DSYNC / O_DIRECT 阻塞写或绕过 page cache
  文件系统挂载选项 sync 强制同步写入
  块设备参数 queue/nr_requests, scheduler I/O 调度器与队列大小影响延迟
mmap(MAP_SHARED) vm.dirty_* 系列参数 脏页写回策略,和正常写一致
  msync() / fadvise(DONTNEED) 用户显式控制写回或丢弃缓存
mmap(MAP_PRIVATE, COW) 写时复制机制 写页触发缺页异常 → 内核复制页
  overcommit_memory / overcommit_ratio fork + COW 的内存分配策略
  transparent_hugepage 大页 COW 行为,fork + THP 可能高成本
  KSM (Kernel Samepage Merging) 跨进程页合并,间接影响 COW

4️⃣ 数据库类比

数据库组件写方式类比是否触发 COW
MongoDB Diagnostic log 正常写
WiredTiger journal 直写 (O_SYNC)
MMAPv1 引擎 (已废弃) mmap ✅ MAP_PRIVATE 时事务隔离使用 COW-like 行为

5️⃣ 写放大(Write Amplification)判断方法

5.1 应用层 → 内核层

  • 症状:应用写少,但 Dirty 增长大于写入量

  • 工具strace -e trace=write,mmap -p <pid>

5.2 内核层 → 文件系统

  • 症状:块设备写量大于应用写量

  • 工具

pidstat -d -p <pid> 1
iostat -dx 1
cat /proc/diskstats

5.3 磁盘层(SSD / RAID)

  • 症状:NAND 写量 > Host 写量

  • 工具

iostat -d -k /dev/nvme0n1
smartctl -A /dev/nvme0n1 | egrep "Data_Units_Written|Host_Writes_32MiB"

写放大因子 (WAF)

WAF = 实际磁盘写入字节 / 应用写入字节
  • 理想接近 1

  • 文件系统通常 1.1~2

  • 数据库 + SSD 可能 2~5


6️⃣ 内核脏页参数调优(示例)

参数建议值说明
dirty_background_bytes 64~256 MB 后台写回启动阈值
dirty_bytes 512 MB~2 GB 应用阻塞写回阈值
dirty_ratio 5~10% 内存百分比模式
/proc/meminfo:Dirty < dirty_bytes 50% 写回调度正常
/proc/meminfo:Writeback 不长期高 I/O 系统跟不上

MongoDB Diagnostic log 场景:

  • dirty_background_bytes = 64~128MB

  • dirty_bytes = 512MB~1GB
    保证日志落盘及时、避免写放大或阻塞。


7️⃣ 可视化 & 脚本思路

可视化

  • 绘制 mmap(MAP_SHARED vs MAP_PRIVATE) 写入示意图

  • 两个进程共享文件页

  • 写入 MAP_PRIVATE 时触发缺页复制,MAP_SHARED 直接修改共享页

脚本思路

  1. 自动采集 /proc/meminfo + dirty_* 参数

  2. 统计应用写入 (pidstat)

  3. 统计块设备写入 (iostat)

  4. 查询 SSD 内部写入 (smartctl)

  5. 计算三层 WAF,输出“合理 / 偏高 / 偏低”

可以直接评估写放大是否存在,并判断系统参数是否合理。


如果你希望,我可以帮你 画一个直观的 mmap MAP_PRIVATE vs MAP_SHARED 的示意图,同时写一个 一键检测写放大的脚本,可以直接在生产环境跑。


 

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

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

相关文章

微软SSO集成中的顺序用户ID身份验证绕过漏洞剖析

本文详细分析了微软单点登录集成中因使用可预测的顺序用户ID导致的严重身份验证绕过漏洞,揭示了后端未验证令牌声明、信任客户端输入等关键设计缺陷,为开发者和安全测试人员提供了重要警示。身份验证绕过:微软SSO集…

content和text方法的区别

使用requests进行网页请求时,对页面内容进行解码和编码的时候,需要用到.content和.text。Requests对象的get和post方法都会返回一个Response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等…

完整教程:从零开始学神经网络——前馈神经网络

完整教程:从零开始学神经网络——前馈神经网络pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

shell脚本动态域名解析阿里云

下面是一个利用Shell脚本调用阿里云DNS API实现动态域名解析(DDNS)的示例。该方案适用于家庭宽带等动态公网IP环境,主要依赖阿里云的域名解析API。 🖥️ 阿里云DDNS Shell脚本示例 #!/bin/bash# 阿里云DDNS动态域…

聪明的wyk

王俞宽是个人物

Windows下进程和账户权限

一、Windows 进程创建的底层流程(六阶段深度解析) 进程创建是用户态 API 触发、内核态资源分配、子系统协同的复杂过程,核心依赖CreateProcess系列函数(实际为宏定义,映射到CreateProcessA/W),具体分为六个阶段…

论状压记忆化搜索

其实非常简单,甚至比递推写法简单 比如P2704,递推做这个比较麻烦,但状压记搜强大 #include<bits/stdc++.h> #include<bits/extc++.h> using namespace std; using namespace __gnu_cxx; using namespac…

做微视频的网站组工网站建设方案

二、学习回归 1. y y y与 f θ ( x ) f_\theta(x) fθ​(x) y y y 是实际数据x对应的值 f θ ( x ) f_\theta(x) fθ​(x)是我们构造出来的函数&#xff0c;例如 f θ ( x ) θ 0 θ 1 x f_\theta(x) \theta_0 \theta_1 x fθ​(x)θ0​θ1​x 所以我们希望这两个越接近&…

Spring Gateway动态路由实现方案 - 详解

Spring Gateway动态路由实现方案 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

postman使用总结 - 详解

postman使用总结 - 详解2025-09-29 16:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

Nordic 高性能无线SoC nRF54LM20A,专为低功耗蓝牙与Matter设计

Nordic 宣布推出新一代nRF54L系列超低功耗无线系统级芯片 (SoC)的最新成员nRF54LM20A。nRF54L系列基于Nordic创新的22nm技术平台,不仅简化设计挑战,同时实现了可靠通信、更长的电池寿命和紧凑的产品设计。 Nordic 短…

调用setState 之后发生了什么?

触发状态更新 当你在组件里调用: this.setState({ count: this.state.count + 1 });React 并不会马上修改 this.state,而是 把更新请求放到一个队列中(即所谓的异步/批量更新机制)。 合并新旧状态React 会将你传入…

网站建设考虑哪些因素沈阳妇科医院排名前十名

在线预览|GB/T 41510-2022http://c.gb688.cn/bzgk/gb/showGb?typeonline&hcno696806EC48F4105CEF7479EB32C80C9E 知识点&#xff1a; 安全等级定义&#xff0c;设计寿命&#xff0c;剩余寿命&#xff0c;使用寿命。 标准附录有应力的具体解算演示。

湖北专业网站建设市面价wordpress格子主题

A. Submission Bait&#xff08;博弈&#xff09; 题意&#xff1a;爱丽丝和鲍勃在大小为n的数组a中进行游戏&#xff0c;他们轮流进行运算&#xff0c;爱丽丝先开始&#xff0c;不能运算的一方输&#xff0c;一开始mx0&#xff0c;每次操作&#xff0c;玩家可以选择一个牵引i…

连云港做网站公司建设网站的网站空间

JAVA&#xff1a;线程总结 目录 目录 JAVA&#xff1a;线程总结 JAVA&#xff1a;线程总结 01_多线程(多线程的引入)(了解) 02_多线程(多线程并行和并发的区别)(了解) 03_多线程(Java程序运行原理和JVM的启动是多线程的吗)(了解) 04_多线程(多线程程序实现的方式1)(掌握…

做网站开发 甲方提供资料网站建设特定开发

如果能用python代替Javascript编写基于浏览器的应用&#xff0c;该有多好啊。但是&#xff0c;Javascript是唯一一种能在浏览器里执行的语言(Flash或Silverlight除外)。换个思路&#xff0c;先用Python编写代码&#xff0c;然后在通过编译器转为为Javascript脚本&#xff0c;这…

黄金分割比

不会初中数学…… 定义:将线段分为两部分,满足较大部分(a)与整体(a+b)的比值等于较小部分(b)与较大部分的比值,即 \(\frac{a}{a+b} = \frac{b}{a}(a > b)\)。 \(a^2 = ab + b^2 \Rightarrow \frac{b^2}{a^…

how create rhel8 local repository server

Repository Server ConfigurationMount DVD.iso. Create DVD repo. [BaseOS] name=DVD_BaseOS enabled=1 gpgcheck=0 baseurl=file:///mnt/BaseOS [AppStream] name=DVD_AppStream enabled=1 gpgcheck=0 baseurl=file:…