School - TiKV write stall
Contents
[NOTE] Updated August 7, 2018. This article may have outdated content or subject matter.
0x00 告警
- TiDB 与 TiKV 出现大量 backoff;触发 backoff 告警阈值
- 相应时间段 tidb kv error 监控趋势升高
- 相应时间段 tikv thread cpu / apply cpu 监控趋势升高
|
|
0x01 监控
如不确定趋势为正常状态,请采用划分时间对比方式评估,然后合理进行怀疑
二次确认
- {{tikv_deploy_dir}}/db/LOG 日志内搜索
Stalling writes
关键词
|
|
排查思路图
0x02 原因
Write stall
- RocksDB L0 层的文件数量超过流控阈值,默认超过 20 * region 会减缓该节点写入,超过 36 个会停止该节点写入
- L0 层文件的减少需要 compaction 操作,将 L0 文件合并排序后写入到 L1 层「粗略计算需要 region-size * 2 的 IOPS(读、压缩、写入)」
- 2.0 版本 compaction 是单线程工作;会出现 写入速度过快、compaction 跟不上或者磁盘跟不上的场景
临时解决方案 1
确定磁盘是否还有 IOPS 余量,如果无余量请扩容 TiKV 集群机器
调整
[rocksdb.writecf]
和[rocksdb.defaultcf]
以下参数1 2 3 4 5 6 7 8
# level0-file-num-compaction-trigger = 4 # 达到 4 个文件开始 compaction # level0-slowdown-writes-trigger = 20 # 达到 20 个文件,放慢写入速度 # level0-stop-writes-trigger = 36 # 达到 36 个文件,停止写入
Update: 3.0 以后版本加入
max-sub-compaction = 2
参数,加快 compaction sst 动作
- 临时解决方案 2
RocksDB 总 7 层,L0 - L1 未开启压缩
将 L0 与 L1 修改为 lz4 压缩算法;如不熟悉请勿操作
1 2 3 4 5 6 7 8 9
# compression-per-level = ["no", "no", "lz4", "lz4", "lz4", "zstd", "zstd"] ## Compression method (if any) is used to compress a block. ## no: kNoCompression ## snappy: kSnappyCompression ## zlib: kZlibCompression ## bzip2: kBZip2Compression ## lz4: kLZ4Compression ## lz4hc: kLZ4HCCompression ## zstd: kZSTD