https://tidb.net/blog/ac7174dd#4.%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E5%87%BA%E7%8E%B0%E4%BA%86%20write%20stall

stall 是 rocksdb 的一种流控机制,当 flush/compaction 赶不上 write rate 的速度时,rocksdb 会降低 write rate,甚至停写。而 TiDB 集群中的 TiKV 组件是基于 rocksdb 开发的,因此 TiDB 集群出现 write stall 时则会表现出:集群写入变慢,甚至写入阻塞,影响业务。

笔者最近处理过几起 write stall 的问题,既有 4.0 版本,也有 5.1 版本,但是在这两个大版本上,write stall 相关日志、监控、命令不太相同,为了避免出现问题时,临时去查文档和命令,于是编写了本文档。文本主要基于 5.1.4 版本编写,部分内容会在备注中提一下 4.0 版本中的不同点。

2.常见 write stall 场景

发生 write stall 常见的三种场景是:

  • Memtable 文件数量过多,且达到阀值 写入到 RocksDB 的数据首先会记录到 WAL 日志里面,然后会插入到 memtable 里面,当 memtable 的大小到达了 write-buffer-size 限定的大小的时候,当前的 memtable 会变成只读的,然后生成一个新的 memtable 接收新的写入。只读的 memtable 会被 RocksDB 的 flush 线程(flush 线程的最大个数由参数 max-background-flushes 控制) flush 到磁盘,成为 level0 的一个 sst 文件。当 flush 线程忙不过来或者磁盘写入太慢,导致等待 flush 到磁盘的 memtable 的数量到达 max-write-buffer-number 限定的个数的时候,这时就会发生 write stall 。

  • L0 层 SST 文件数量过多,且达到阀值 当 level0 的 sst 文件个数到达 level0-slowdown-writes-trigger 指定的个数时,RocksDB 会尝试减慢写入的速度。因为 level0 的 sst 太多会导致 RocksDB 的读放大上升。当 level0 的 sst 文件个数到达 level0-stop-writes-trigger 指定的个数时,则会出现 write stall。

  • L1 ~ Ln 层待 Compaction 的 SST 文件的大小过大,并且达到阀值 当 level1 的数据量大小达到 max-bytes-for-level-base 限定的值的时候,会触发 level1 的 sst 和 level2 中有 overlap 的 sst 进行 compaction,其它 L 层的文件也会在达到阀值时往下一层 compaction 。如果从 L1 到 Ln 层合并压缩太慢,导致待 compaction 的 SST 文件的大小过大时(达到阀值)则会出现 write stall。

为了便于理解,这里借用一下 PingCAP Education 【302 TiDB 高级系统管理】视频课程里的一张图片(下图中 L 层上标记的大小随着 TiDB 集群版本的不同而不同,这里主要为了说明原理):

3.出现 write stall 阀值

针对上一节出现的三种场景的 write stall 的阀值总结如下:

场景 write stall slow 阀值 write stall stop 阀值 缓解参数
1 4(max-write-buffer-number) 5(max-write-buffer-number) write-buffer-sizemax-write-buffer-numbermax-background-flushes
2 20(level0-slowdown-writes-trigger) 36(level0-stop-writes-trigger) level0-slowdown-writes-triggerlevel0-stop-writes-triggerrocksdb.max-sub-compactions
3 192G(rocksdb.defaultcf.soft-pending-compaction-bytes-limit)192G(rocksdb.writecf.soft-pending-compaction-bytes-limit) 256G(rocksdb.defaultcf.hard-pending-compaction-bytes-limit)256G(rocksdb.writecf.hard-pending-compaction-bytes-limit) rocksdb.defaultcf.soft-pending-compaction-bytes-limitrocksdb.defaultcf.hard-pending-compaction-bytes-limitrocksdb.writecf.soft-pending-compaction-bytes-limitrocksdb.writecf.hard-pending-compaction-bytes-limitrocksdb.rate-bytes-per-secrocksdb.max-background-jobs

说明:

  • 场景表示第2节提到的三种 write stall 场景

  • write stall slow 阀值表示达到此阀值之后,TiDB 开始写入变慢

  • write stall stop 阀值表示达到此阀值之后,TiDB 开始无法写入

  • 缓解参数表示当发生 write stall 时可能需要调整的参数

小技巧:当你不知道这些默认值时,可以通过如下 SQL 查询
show config where type='tikv' and name like '%max-background-flushes%';
此 SQL 适用于 4.0 和 5.1 版本,其它版本可能会有所不同。

4.判断是否出现了 write stall

判断 TiDB 集群是否出现了 write stall 可以参考如下方法:

(1)查看集群是否出现了 server is busy 及原因

tikv-details -- errors -- server is busy

(2)查看引起 write stall 的原因

tikv-details -- rocksdb-kv -- write stall reason

说明:
4.0 版本在 tikv-details -- rocksdb-raft -- write stall reason

(3)是否有大量数据处于 compation pending 状态 tikv-detail -- rocksdb-kv -- compaction pending bytes

说明:
4.0 版本在 tikv-details -- rocksdb-raft -- compaction pending bytes

(4)分析 tikv 日志辅助判断 grep 'Stalling writes' /data3/tikv20173/data/rocksdb.info

说明:
(1) 4.0 版本 write stall 日志文件位置在 /data3/tikv20173/data/raft 目录下,以 LOG 开头的文件。
(2) 出现 write stall 场景 1 日志类似如下,日常运维过程中笔者没遇到过这种场景,下面日志是截取自网络
[default] Stalling writes because we have 4 immutable memtables (waiting for flush)
(3) 出现 write stall 场景 2 日志类似如下,下面日志是截取自真实生产环境
[default] Stalling writes because we have 20 level-0 files rate 5368709120
(4) 出现 write stall 场景 3 日志类似如下,下面日志是截取自真实生产环境
[default] Stalling writes because of estimated pending compaction bytes 130562502580 rate 8589932

5.处理方法

这里需要说明一下,当出现 write stall 时,我们还要分析一下是因为磁盘 IO 压力太大导致的,还是某些 tikv 并发刷盘参数太小导致的。

如果磁盘 IO 压力和 CPU 压力不大,适当调整第 3 节表格中的 tikv 并发刷盘参数可以解决 write stall 的问题。但是如果磁盘 IO 压力和 CPU 压力大,说明 write stall 的本质原因是磁盘 IO 跟不上导致的,调整某些参数阀值只能缓解 write stall ,无法从根本上解决问题,此时可以考虑业务端限流或者集群扩容。

还有一点需要说明一下,目前我知道的修改 TiKV 参数的方法有以下三种:

  • 修改集群拓扑文件,需要重启集群 这种是最原始的方式,需要 reload 集群,速度慢点

  • 通过 tikv-ctl 在线修改 支持在线修改,本文第3节列举的 tikv 参数只有一个 max-sub-compactions 不支持在线修改,其它均支持在线修改,速度较快

  • 通过 SQL 在线修改 支持在线修改,速度较快,具体支持哪些参数可以参考官方文档,文末参考文档中给出了链接

对于 tikv 参数,如果可以在线修改,建议使用 tikv-ctl 在线修改,无法在线修改的,只能通过修改配置文件,然后 reload 的集群方式修改。将来,通过 SQL 语句在线修改的方法成为正式特性之后,再建议大家使用。

5.1Memtable 文件数量过多

对于 Memtable 文件数量过多导致的 write stall 问题,可调整如下参数进行缓解:

参数名 默认值 含义 是否支持在线调整
rocksdb.defaultcf.write-buffer-size 128M memtable 大小 sql 方式支持tikv-ctl 方式支持
rocksdb.defaultcf.max-write-buffer-number 5 最大 memtable 个数 sql 方式支持tikv-ctl 方式支持
rocksdb.max-background-flushes 4 RocksDB 用于刷写 memtable 的最大后台线程数 sql 方式不支持tikv-ctl 方式支持

说明:

官方文档中 max-background-flushes 的默认值写的是 2 ,应该是错了。

针对上面表格参数,下面给出具体的修改示例,其它参数都可以参考这种方式修改:

  • 通过 SQL 在线修改 这里以修改参数 write-buffer-size 为例

set config "192.168.1.1:20161" `raftdb.defaultcf.write-buffer-size` = '256MiB';
show config where type='tikv' and Instance='192.168.1.1:20161' and name='raftdb.defaultcf.write-buffer-size' ;
  • 通过 tikv-ctl 在线修改 这里以修改参数 rocksdb.max-background-flushes 为例

./tikv-ctl --host=192.168.1.1:20160 modify-tikv-config -n rocksdb.max-background-flushes -v 5  #这里的5表示线程个数,不要带单位

备注:

如果你要修改的值是文件大小则需要带上单位,如下所示
./tikv-ctl --host=192.168.1.1:20161 modify-tikv-config -n rocksdb.defaultcf.soft-pending-compaction-bytes-limit -v 192GB
  • 修改集群拓扑文件 这里以修改参数 max-background-flushes 为例

(1)查看当前配置

show config where type='tikv' and name like '%max-background-flushes%';

(2)修改集群拓扑文件

server_configs:
tikv:
rocksdb.max-background-flushes: 4 #增加这一行配置

(3)集群 reload

tiup cluster reload jxs_cluster_yz -R tikv

(4)验证配置 在线查看配置是否修改

show config where type='tikv' and name like '%max-background-flushes%';

也可以登录 tikv 实例服务器查看配置文件是否多了下面这行配置

[rocksdb]
max-background-flushes = 4

5.2L0 层 SST 文件数量过多

可调参数如下

参数名 默认值 含义 是否支持在线调整
level0-slowdown-writes-trigger 20 触发 write stall 的 L0 文件最大个数 sql 方式支持tikv-ctl 方式支持
level0-stop-writes-trigger 36 完全阻停写入的 L0 文件最大个数 sql 方式支持tikv-ctl 方式支持
max-sub-compactions 3 RocksDB 进行 subcompaction 的并发个数 sql 方式不支持tikv-ctl 方式不支持

调整步骤请参考 5.1 节。

5.3L1 ~ Ln 层待 compation 的 SST 文件过大

可调参数如下

参数名 默认值 含义 是否支持在线调整
rocksdb.defaultcf.soft-pending-compaction-bytes-limit 192G pending compaction bytes 的软限制 sql 方式不支持tikv-ctl 方式支持
rocksdb.writecf.soft-pending-compaction-bytes-limit 192G pending compaction bytes 的软限制 sql 方式不支持tikv-ctl 方式支持
rocksdb.defaultcf.hard-pending-compaction-bytes-limit 256G pending compaction bytes 的硬限制 sql 方式不支持tikv-ctl 方式支持
rocksdb.writecf.hard-pending-compaction-bytes-limit 256G pending compaction bytes 的硬限制 sql 方式不支持tikv-ctl 方式支持
rocksdb.rate-bytes-per-sec 10G RocksDB compaction rate limiter 的限制速率 sql 方式不支持tikv-ctl 方式支持
rocksdb.max-background-jobs 10 RocksDB 后台线程个数 sql 方式支持tikv-ctl 方式支持

调整步骤请参考 5.1 节。

6.注意事项

目前官方不建议使用 SQL 语句在线调整 TiKV 参数,属于实验特性,详情请见官方文档

https://docs.pingcap.com/zh/tidb/v5.1/dynamic-config#%E5%9C%A8%E7%BA%BF%E4%BF%AE%E6%94%B9-tikv-%E9%85%8D%E7%BD%AE

【参考文章】

PingCAP Education 305 视频课程

https://docs.pingcap.com/zh/tidb/v5.1/tune-tikv-memory-performance#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E

https://docs.pingcap.com/zh/tidb/v5.1/tikv-configuration-file#max-background-flushes

https://docs.pingcap.com/zh/tidb/stable/tidb-troubleshooting-map#43-%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%8A%A5-server-is-busy-%E9%94%99%E8%AF%AF

https://docs.pingcap.com/zh/tidb/v5.1/dynamic-config#%E5%9C%A8%E7%BA%BF%E4%BF%AE%E6%94%B9-tikv-%E9%85%8D%E7%BD%AE

[转帖]TiDB 5.1 Write Stalls 应急文档的更多相关文章

  1. Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖)

    链接地址:http://www.cocoachina.com/bbs/read.php?tid=273479 Xcode之外的文档浏览工具--Dash    (在iOS代码库中浏览本帖)       ...

  2. C# 在word文档中复制表格并粘帖到下一页中

    C# 在word文档中复制表格并粘帖到下一页中 object oMissing = System.Reflection.Missing.Value;            Microsoft.Offi ...

  3. 【转帖】(一)unity4.6Ugui中文教程文档-------概要

    原帖至上,移步请戳:(一)unity4.6Ugui中文教程文档-------概要 unity4.6中的一个重要的升级就是GUI ,也把它称为UGUI ,废话我不多说,大家可以百度了解一下. 虽然现在处 ...

  4. [转帖]网络协议封封封之Panabit配置文档

    原帖地址:http://myhat.blog.51cto.com/391263/322378

  5. tidb 记录文档

    ansible-playbook stop.yml   / start.yml 重启集群,在ansible目录下执行 SHOW STATS_META; 查看统计信息 重启集群:ansible-play ...

  6. [转帖]UsingDiskspdforSQLServer --- 改天做下练习 官方文档.

    Using DiskSpd in SQL Server environments Writer: Robert Beene Contributors: Jose Barreto, Ramu Konid ...

  7. 内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]

    在环境里是没有问题的 就是发布网站后,会出现“/”应用程序中的服务器错误.--------------------------------------------------------------- ...

  8. 【转帖】Istio是啥?一文带你彻底了解!

    Istio是啥?一文带你彻底了解! http://www.sohu.com/a/270131876_463994 原始位置来源: https://cizixs.com 如果你比较关注新兴技术的话,那么 ...

  9. Apache DolphinScheduler&TiDB联合Meetup | 聚焦开源生态发展下的应用开发能力

    在软件开发领域有一个流行的原则:Don't Repeat Yourself(DRY),翻译过来就是:不要重复造轮子.而开源项目最基本的目的,其实就是为了不让大家重复造轮子. 尤其是在大数据这样一个高速 ...

  10. OpenStack Pike超详细搭建文档 LinuxBridge版

    前言 搭建前必须看我 本文档搭建的是分布式P版openstack(1 controller + N compute + 1 cinder)的文档. openstack版本为Pike. 搭建的时候,请严 ...

随机推荐

  1. JavaFx之场景交互(二十一)

    JavaFx之场景交互(二十一) 有parent.son两个父子窗口,父窗口可以操作子窗口,父子可以相互调用对方的对象,下面我给出两种方案,我推荐使用第二种 一.构造传参 参数比较多的话代码不优雅.而 ...

  2. PyTorch项目源码学习(1)

    PyTorch PyTorch是一个开源的深度学习框架,项目地址 https://github.com/pytorch/pytorch 在学术工作中的使用频率较高.其主体由C++开发,PyTorch是 ...

  3. C#/.NET学习值得推荐的在线论坛和技术社区

    前言 本文来源于知乎的一个提问,C#/.NET程序员学习有哪些值得推荐的在线论坛和技术社区?其实很早之前DotNetGuide就已经新增了C#/.NET/.NET Core充电站栏目,当然大家有更好的 ...

  4. MySQL事务处理特性的实现原理

    摘要:事务这个词来自于英语中的transactional这个词的翻译,这个词的含义更多的是指 "交易".在数据库系统或者软件系统中我们通常 称 transactional 为事务 ...

  5. APP 备案公钥、签名 MD5、SHA-1、SHA-256获取方法。

    ​ 公钥和 MD5 值可以通过苹果开发工具.Keytool.appuploder 等多种工具获取,最简单的就是以 appuploader为例. 1.下载 appuploader工具 ,点击此处 下载 ...

  6. 火山引擎DataTester:AB测试技术揭秘及应用分享

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   在全球软件工程创新峰会上,火山引擎DataTester 研发负责人韩云飞围绕"AB测试:让数据与业务 ...

  7. AI 0基础学习,数学名词解析

    AI学习过程中,常见的名词解析 中位数 将数据从小到大排序,奇数列,取中间值,偶数列,中间两个值的平均,可做为销售指标 众数 一组数据中,数值出现最多的那个.反映哪款产品,销量最好 平均数 比赛中,去 ...

  8. Mac问题记录

    1. "App" can't be opened because Apple cannot check it for malicious software. 一般来说,在Syste ...

  9. API 设计最佳实践(简版)

    Restful API 本文简称API,是一个种面向资源的架构.在Restful中一个API对应一个资源,资源可以是文本,图片,视频等.API特征有如下: 每一个URI代表一种资源 客户端和服务器之间 ...

  10. 以API 配置的方式来配置你的 Dubbo 应用

    package com.aswatson.csc.member.conf; import com.aswatson.csc.member.service.MemberCardService; impo ...