为 SSD 优化数据库写入:来自 VLDB 研究的见解
现代数据库与固态硬盘 (SSD) 的交互方式往往被忽视,许多开发者仅将存储视为简单的块设备。然而,NAND flash 内存的物理特性——特别是它如何处理写入、擦除以及由此产生的“写入放大”——在理论吞吐量与实际吞吐量之间造成了巨大的性能差距。
最近发表在 VLDB (Very Large Data Bases) 上的一篇题为 "How to Write to SSDs" 的研究对 MySQL 和 PostgreSQL 等大规模数据库在 SSD 上的表现进行了深入探讨,为优化存储模式以减少磨损并提高性能提供了路线图。
写入放大的挑战
SSD 性能问题的核心在于写入放大 (write amplification) 的概念。与硬盘 (HDD) 不同,SSD 无法原地覆盖数据。相反,它们必须在重新写入之前擦除一个内存块。当数据库执行小的随机写入时,SSD 的内部控制器必须将现有的有效数据移动到新位置,以清空一个块用于新的写入。这个过程会产生一系列内部写入,这意味着来自数据库的一个逻辑写入可能会导致对 NAND flash 的多次物理写入。
这种现象不仅会因为驱动器控制器因后台垃圾回收 (garbage collection) 而过载而减慢系统速度,还会加速驱动器的磨损,缩短其寿命。
数据库性能与磨损
该研究重点关注这些写入模式对在单机上运行的大型数据库(约 800GB)的影响。通过分析 MySQL 和 PostgreSQL,研究强调了不同的存储引擎行为如何导致写入放大。
当数据库使用随机写入密集的模式时,性能下降会更加明显。研究表明,理解 SSD 的物理布局并使数据库写入与这些边界对齐,可以实现更优化的存储表格式。从理论上讲,这种优化可以允许数据库绕过 SSD 的一些内部开销,从而实现更高的持续吞吐量和更低的延迟。
行业背景与互补技术
虽然该研究对数据库层进行了批判性分析,但社区也注意到,类似的优化也正在文件系统层发生。例如,Zoned XFS 是一种专门设计用于处理数据放置以最小化与分层存储 (zoned storage) 相关的开销的 Linux 文件系统,这与 SSD 的物理特性具有类似的约束。
在 SMR (Shingled Magnetic Recording) 硬盘中也存在类似的并行情况,SMR 硬盘与 SSD 一样,需要顺序写入以避免巨大的性能惩罚。这表明存储工程领域存在一个更广泛的趋势:软件层必须对底层硬件的物理约束“感知” (aware),才能实现最大效率。
数据库设计的未来影响
这项研究的发现对数据库架构的未来具有重要意义。随着数据量的增长,针对存储介质的物理特性进行优化的能力将成为一种竞争优势。
这项研究的潜在结果包括:
- 新数据库类型:专门针对 NAND flash 的物理特性设计的存储引擎。
- 超优化实现:对现有系统(如 PostgreSQL)进行改进,以更好地处理写入放大。
- SQLite 优化:将类似的分析应用于 SQLite 等轻量级数据库,以观察在单线程环境中进行写入密集型工作负载是否会产生类似的瓶颈。
通过将关注点从将存储视为黑盒转向将其视为受管理的物理资源,开发者可以构建出既更快又更耐用的系统。