LSM 读放大与写放大:Compaction 策略深度调优

发布时间:2026/9/4 1:27:10
LSM 读放大与写放大:Compaction 策略深度调优 LSM 读放大与写放大Compaction 策略深度调优在基于 LSM-tree 的存储引擎如 TiKV、RocksDB、PebblesDB运行过程中很多运维和开发团队经常遇到令人费解的性能现象表面上写入流量只有 20 MB/s但底层 NVMe 固态硬盘的写入带宽却死死跑在 300 MB/s严重的写放大写入吞吐极其出色但点查或范围扫描Range Scan延迟却高达数十毫秒磁盘读 IOPS 居高不下严重的读放大在写入高峰期系统突然发生长达数十秒的写入卡顿Write Stall。要解决这些性能痛点核心在于深入理解 LSM-tree 的核心整理机制——Compaction压实合并并在Size-Tiered与Leveled两种主流策略之间进行精准调优。-------------------------------------------------------------------------- | LSM-tree 三大放大效应平衡三角 | -------------------------------------------------------------------------- | 写放大 (Write Amp) | | / \ | | / \ | | / \ | | 读放大 (Read Amp) ---------------------- 空间放大 (Space Amp) | -------------------------------------------------------------------------- | - Leveled Compaction: 高写放大 (~10-30x), 低读放大 (~2-5x), 低空间放大 | | - Size-Tiered (STCS): 低写放大 (~2-8x), 高读放大 (~10-30x), 高空间放大 | --------------------------------------------------------------------------1. 三大物理放大效应的定义在评估 LSM 存储引擎时系统工程师必须量化三个指标写放大Write Amplification, WA实际写入底层物理磁盘的字节数与应用层写入字节数的比例$$\text{WA} \frac{\text{Bytes Written to Disk}}{\text{Bytes Written by Application}}$$读放大Read Amplification, RA为了完成一次应用层查询存储引擎必须从磁盘物理读取的 Block 数据量与实际所需数据量的比例。在最坏情况下若需扫描 $N$ 个 SSTable 才能定位一个 Key读放大即为 $N$。空间放大Space Amplification, SA磁盘上实际占用的物理存储空间与有效数据去除历史旧版本和已删除墓碑大小的比例。任何 Compaction 策略的本质都是在这三者之间做物理 Trade-off不可能同时做到最低的写放大、最低的读放大和最低的空间放大。2. Size-Tiered Compaction Strategy (STCS) 剖析Size-Tiered 策略的理念是将大小相似的 SSTable 归为一组。当同一层积累了达到阈值数量如 4 个的 SSTable 后将它们一次性合并为一个更大的 SSTable 并晋升到下一层。优缺点分析优势低写放大每次合并只需对相同大小的文件顺序读写一次写放大通常控制在2 ~ 8之间极其适合高频追加写入的日志系统或时序数据库劣势高读放大与空间暴增同一层内的多个 SSTable 之间的 Key 范围是相互重叠的点查一个 Key 时可能需要同时检查同一层的所有 4 个文件读放大极高在合并超大 SSTable 时必须在磁盘上预留至少 50% 的空闲空间来容纳新生成的合并文件空间放大最高可达100%2.0x。3. Leveled Compaction Strategy (LCS) 剖析Leveled 策略如 RocksDB 默认将存储分为严格的层级L0, L1, L2 ... Ln每一层的容量上限按 10 倍递增例如 L1 10MB, L2 100MB, L3 1GB。其核心铁律是除 L0 层外同一层内的所有 SSTable 之间的 Key 范围严格互不重叠Strictly Partitioned Non-Overlapping。优缺点分析优势极致读性能与低空间放大点查时除 L0 外每一层最多只需要在一个 SSTable 中查找读放大被严格控制在 $O(\text{Level Count})$空间浪费通常低于10% ~ 20%劣势极高写放大当 L1 层的单个文件向下合并到 L2 时由于 L2 的 Key 范围重叠通常需要读取 L2 层的 10 个文件一起归并导致写放大高达10 ~ 30 倍大幅消耗 SSD 闪存颗粒寿命与写入带宽。4. 生产级调优实战指南针对不同的业务负载我们在底层配置中给出如下黄金调优准则场景 A写入极其密集读极少如大数据打点、监控时序库选用Size-Tiered Compaction或Universal Compaction将min_write_buffer_number_to_merge调大减少 L0 文件碎片容忍较高的磁盘空间冗余换取平稳的写入吞吐并保护 SSD 寿命。场景 B高并发点查读写混合业务如用户中心、交易订单库选用Leveled Compaction开启Dynamic Level Base Target Size让各层容量自适应数据规模增长消除写放大尖刺将Bloom Filter 配置为 10 bits/key直接过滤掉 99% 的无效 SSTable 磁盘读取增大max_background_jobs如分配 4~8 个后台 Compaction 线程防止合并速度跟不上写入速度而触发 Write Stall。深刻理解 Compaction 的物理权衡才能在大规模存储集群中收放自如。