TiKV作为TiDB的分布式存储引擎,基于LSM树(日志结构合并树)实现数据存储,compaction是LSM树维持读写性能的核心机制,而write stall是TiKV在写入压力过大时触发的保护性限流机制,二者存在直接关联。

TiKV compaction与level层级基础
TiKV使用的RocksDB作为单机存储引擎,LSM树的层级从0到N依次递增,不同level的compaction规则不同:
- L0层存放刚写入的MemTable flush后的SST文件,文件之间可能存在key范围重叠
- L1到Lmax层,每一层的SST文件按照key有序排列,层与层之间文件范围不重叠,且上层大小通常是下层的若干倍
- compaction的过程就是将上层的小SST文件合并到下层,清理过期数据和重复key,减少读放大
compaction分为两种类型,分别是L0->L1的compaction和Ln->Ln+1的层级compaction,不同层级的compaction触发条件和资源消耗差异很大。
level层级与write stall的触发关系
write stall的触发主要和以下几个level相关的阈值有关:
| 触发场景 | 关联level | 阈值说明 |
|---|---|---|
| L0文件数量过多 | L0 | 默认L0文件数达到4个触发L0 compaction,达到20个时强制触发write stall |
| 待合并文件过多 | 所有层级 | 某个level的待compact文件总大小超过该层软阈值时触发限速,超过硬阈值触发write stall |
| compaction pending bytes过多 | 所有层级 | 所有待compact的文件总大小超过阈值时,触发write stall限制写入 |
当L0层文件堆积过快,L0到L1的compaction速度跟不上写入速度,L0文件数达到硬阈值,就会直接触发write stall。如果下层level的compaction速度慢,导致pending bytes持续上涨,也会触发write stall。
write stall的缓解方案
1. 调整compaction相关参数
可以根据业务写入特点调整RocksDB的compaction参数,提升compaction效率:
-- 查看当前TiKV的RocksDB compaction相关配置 SHOW CONFIG WHERE type = 'tikv' AND name LIKE '%compaction%'; -- 动态调整L0触发compaction和write stall的阈值,提升L0 compaction触发频率,避免L0文件堆积 SET CONFIG tikv rocksdb.defaultcf.l0_compaction_trigger = 3; SET CONFIG tikv rocksdb.defaultcf.l0_slowdown_writes_trigger = 15; SET CONFIG tikv rocksdb.defaultcf.l0_stop_writes_trigger = 18;
2. 优化写入模式
避免大量热点key集中写入,热点写入会导致L0文件快速生成,compaction来不及处理。可以通过业务侧拆分热点key,或者调整TiDB的tidb_batch_insert等参数,控制单批次写入量,降低瞬时写入压力。
3. 提升硬件IO能力
compaction是重IO操作,如果磁盘IO性能不足,compaction速度会远低于写入速度。可以将TiKV的部署磁盘更换为NVMe SSD,提升磁盘读写吞吐量,加快compaction执行速度。
4. 分离compaction与写入IO
如果条件允许,可以将RocksDB的WAL日志、SST文件、compaction临时文件分别部署到不同的磁盘,避免compaction和正常写入的IO竞争,提升整体处理效率。
总结
TiKV的write stall本质是LSM树compaction机制跟不上写入速度时的保护策略,和L0层文件数量、各level的pending compaction大小直接相关。通过合理调整compaction参数、优化写入模式、提升硬件IO能力等方式,可以有效缓解write stall问题,保障TiDB的写入性能稳定。
TiDBTiKVcompactionwrite_stall修改时间:2026-06-30 12:54:24