写入放大本质是整条写入路径收的“过路费”:应用写1份,存储介质可能实际写进去两三份,压制它不能只盯着换盘,要在写入模型、存储引擎、硬件介质三层同时动手。
写入放大是怎么被高并发“喂胖”的
先把概念说清楚,写入放大系数(WAF)就是设备侧实际写入量与主机侧写入量的比值,你往数据库里插一条订单,主机记了4KB,闪存颗粒上可能搬了12KB,差出来的部分不是凭空消失,是被垃圾回收、副本复制、日志双写这些环节吃掉了。
高并发会同时踩中好几个放大器:
- 随机小写:4KB、8KB的零散写最不讨好,闪存要按块擦除,写之前先得把整块数据搬走。
- 垃圾回收:盘用得越满,能腾挪的空白块越少,GC一勤快,账单就厚。
- 多副本与校验:三副本意味着一次写变三次物理写;RAID5/6的写惩罚是行业里的老账,小写要读旧数据、算校验、再写回去。
- 预写日志:数据库的redo log、消息队列的落盘日志,常常和数据本身构成两条写入路径。
- 元数据:海量小文件场景下,元数据本身的写入量容易被忽略。
| 放大来源 | 典型触发场景 | 压制方向 |
|---|---|---|
| 随机小写 | 订单流水、埋点日志 | 批量合并、顺序化 |
| 垃圾回收 | 磁盘使用率接近写满 | 预留空间、错峰GC |
| 副本与校验 | 分布式集群、RAID阵列 | 纠删码、副本策略分层 |
| 预写日志 | 数据库事务高频提交 | 组提交、批量刷盘 |
| 元数据 | 海量小文件 | 小文件合并、对象化 |
高并发写入场景下写入放大怎么优化,从源头找答案
硬件是最后一道闸门,前面几道不修,换多贵的盘都是替放大买单。
把随机小写攒成顺序大写
这一步收益最大,成本最低,几个可落地的参数:
- Kafka:调大
batch.size(如16384以上)和linger.ms(如10到50),开启compression.type=lz4,让一批消息一次落盘。 - MySQL:事务型写入开组提交,
binlog_group_commit_sync_delay设成几十到几百微秒;对一致性要求不那么苛刻的业务,innodb_flush_log_at_trx_commit=2能明显削减刷盘次数。 - Redis:AOF 用
appendfsync everysec,重写期间避开业务高峰。
存储引擎层:LSM 与 B+ 树的取舍
LSM 树把随机写变成顺序写,代价是 compaction 带来的持续放大,层数压得越多、每层容量比设得越极端,compaction 越频繁。
- 增大 memtable,减少 flush 次数;
- 控制 L0 文件数量,避免 compaction 追着跑;
- 用
rocksdb.stats这类命令看各级 compaction 的读写字节数,别只看 QPS。
块设备与文件系统对齐
- 分区按4K对齐,文件系统优先 XFS;
- 挂载加
noatime,关掉无谓的元数据写; - 数据库和自研存储直接用
O_DIRECT,绕开页缓存的双写。
压测命令可以直接抄:
fio --name=w --rw=randwrite --bs=4k --iodepth=32 --numjobs=8 \
--size=10G --runtime=60 --filename=/data/test --direct=1
跑的时候用 iostat -x 1 看 w/s 和 %util,再隔十分钟采两次 smartctl -a /dev/nvme0 里的累计写入量,两者一除,WAF 就出来了。
SSD和机械硬盘在高并发写入下,哪个更容易被写放大拖垮
机理不同:一个怕GC,一个怕叠瓦
SSD 的放大来自 FTL 映射和垃圾回收,随机写多、空间满、长期不 TRIM 都会推高 WAF;企业级盘靠更大的预留空间和掉电保护撑住寿命,机械硬盘这边,SMR 叠瓦盘遇到随机写会触发磁道重写,放大比 CMR 盘严重得多,这是选型时最容易踩的坑。
| 维度 | SSD | 机械硬盘 |
|---|---|---|
| 放大主因 | GC搬移、映射表更新 | SMR叠瓦、RAID校验 |
| 随机小写表现 | 相对耐受,但磨损加速 | 明显劣化 |
| 压制手段 | TRIM、预留OP、顺序写 | 选CMR、避开RAID5、日志盘分离 |
| 成本关注点 | DWPD与寿命 | 单GB价格与IOPS |
企业级SSD选型的写入放大成本怎么算
别只看每GB单价,按 DWPD 换算:DWPD × 容量 就是每天可写入的容量上限,一块3.84TB、DWPD=1的盘,五年质保期内总写入量约 84 × 365 × 5,七千TB左右,如果业务把 WAF 从2压到1.2,同样一块盘能扛的写入量就多出大半,等于单价打了折,业内专家指出,全生命周期成本比采购单价更能反映真实开销,尤其在高并发写入场景里。
电商大促场景下写入放大怎么压制
大促的写入曲线不是平的,是尖峰叠尖峰,压制的思路是削峰、分流、留余量。
先压测,再谈调优
用 fio 按业务真实模型跑:读写比、块大小、队列深度、并发数都要贴近线上,压测期间同步记录设备侧写入增量,算出 WAF 基线,后续任何调参都以这个数为准,不要凭感觉。
冷热分层与批量落盘
- 订单、支付流水先顺序追加到日志文件,异步合并进主表;
- 商品详情、图片走对象存储,别塞进关系库;
- 前置消息队列削峰,让后端写入速率可控;
- 大促前把盘的使用率压到七成以下,给 GC 留出腾挪空间。
监控盯住三个指标
WAF、设备剩余寿命、GC 占比,这三个指标比单纯的 IOPS 更早暴露问题,设置告警:WAF 连续走高、剩余寿命消耗速度异常、GC 占比长期偏高,任何一条触发都该回头看写入模式。
分布式存储里那条更长的放大链
单机压完,集群层面还有一轮,三副本策略下,一次写入在网络上走三份、在磁盘上落三份;纠删码把空间省下来,代价是写放大更高、恢复更慢,日志与数据分离部署、避免同一次写入在两条路径上重复落盘,是常见做法。
北京机房分布式存储写入放大调优的几个土办法
同城多机房部署时,跨机房同步写入会把放大链拉得更长,可操作的路子包括:把 GC 和 compaction 放到业务低谷错峰执行、节点磁盘使用率统一压在七成、副本同步改为异步加批量、机柜内网络带宽按峰值写流量的两倍预留,这些不依赖厂商,自己就能调。
Q&A:高并发写入场景下的写入放大
写入放大系数多少算正常?
稳态随机写场景下,企业级 SSD 的 WAF 接近1到2比较理想;随机小写叠加盘面接近写满时,升到数倍并不罕见,行业共识认为,长期高于3就该回头查空间占用率和随机写比例,而不是继续加盘。
高并发写入场景下,加大缓存能解决写入放大吗?
能缓解,不能根治,缓存的作用是把随机小写攒成顺序大写,减少单位时间内的搬移次数;但缓存一旦写穿、或者刷盘策略过于激进,放大很快回来,缓存容量要和刷盘节奏一起调,单加内存不解决问题。
压制写入放大,先动哪一层最划算?
先看写入模式,再动存储引擎,最后换硬件,多数情况下,把4KB随机写改成批量顺序写,收益最大、成本最低;TRIM、预留空间、盘型选择属于第二梯队;换盘是最后手段,前面的问题不修,新盘照样被放大吃掉寿命。
压住写入放大,本质上是在替存储介质省“过路费”,省下来的不是一点性能数字,是盘的寿命和整条链路的成本。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/775308.html


