两种写策略的性质
回写(Write Back)把写数据先放入缓存并立即向主机确认,缓存再按内部调度落盘,因此能合并小随机写、把多次物理写压成一次,延迟明显更低。透写(Write Through)要求数据真正写到持久介质后才确认,延迟等于介质写延迟,但没有掉电丢数据窗口。两者的差别集中在一件事上:主机收到「写成功」的瞬间,数据到底安不安全。
基本信息
| 生效层次 | 可分别存在于操作系统、控制器、盘内缓存三层,任一层是回写就有风险窗口 |
|---|---|
| 回写前提 | 有 BBU / 超级电容 / 非易失缓存,且保护部件健康在监控中 |
| 透写代价 | 写延迟上升、小随机写 IOPS 明显下降,顺序写影响相对小 |
| 上层副本 | 数据库 WAL、同步复制、分布式多副本都可部分替代缓存保护的职责 |
| 性能测试口径 | 报告延迟与 IOPS 时必须注明缓存策略,否则数据不可比 |
| 变更影响 | 切策略影响全部业务 IO,须走变更窗口并留回滚步骤 |
典型使用场景
- 新阵列上线做策略定型:有保护就开回写,无保护就透写,先把结论定死再谈调优
- 电池或电容报错后的临时降级处置,评估切透写对业务的影响量级
- 数据库服务器上判断存储缓存与数据库自身 fsync 机制是否重复,避免双份持久化开销叠加
- 性能对比测试中统一口径,确保两次测试的缓存策略一致
- 跨机房复制链路带宽受限时,评估本端缓存能否吸收写突发避免链路拥塞
确认与切换策略的观察点
确认与切换策略的观察点
# 块设备层当前报告的缓存模式
cat /sys/block/sda/queue/write_cache
# 用 direct IO 绕开操作系统页缓存,单独观察存储侧表现
dd if=/dev/zero of=/data/t.bin bs=4k count=10000 oflag=direct
# 观察缓存下刷压力:脏页比例攀升说明回写缓冲被写满
cat /proc/meminfo | grep -i dirty
grep -E 'dirty_ratio|dirty_expire' /etc/sysctl.conf
# 阵列侧策略以厂商 CLI 或管理界面为准,改前记录原值以便回滚
storcli /c0/v0 show all | grep -Ei 'write|cache'选择依据速查
| 判定维度 | 倾向回写 | 倾向透写 |
|---|---|---|
| 断电保护 | BBU / 电容健康且在监控内 | 无保护或保护部件失效 |
| 写负载特征 | 小随机写密集、突发写多 | 顺序写为主、写量小 |
| 上层副本 | 已有数据库 WAL 或多副本可兜底 | 数据唯一副本、无其他保护 |
| 风险偏好 | 可接受极小概率的一致性修复成本 | 要求零掉电数据不丢 |
回写默认不是错误配置,无保护地开回写才是。很多阵列在保护部件失效时会自动切透写,业务侧表现为写延迟突然上升,此时先查保护部件状态,而不是急着去调应用。
数据唯一副本、且上电后无法承受任何重建或修复动作的场景,透写是更保守的选择:性能损失是可预估的,掉电丢数据的后果不可预估。