[转帖]TiDB 5.1 Write Stalls 应急文档
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 参数,属于实验特性,详情请见官方文档
【参考文章】
PingCAP Education 305 视频课程
https://docs.pingcap.com/zh/tidb/v5.1/tikv-configuration-file#max-background-flushes
[转帖]TiDB 5.1 Write Stalls 应急文档的更多相关文章
- Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖)
链接地址:http://www.cocoachina.com/bbs/read.php?tid=273479 Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖) ...
- C# 在word文档中复制表格并粘帖到下一页中
C# 在word文档中复制表格并粘帖到下一页中 object oMissing = System.Reflection.Missing.Value; Microsoft.Offi ...
- 【转帖】(一)unity4.6Ugui中文教程文档-------概要
原帖至上,移步请戳:(一)unity4.6Ugui中文教程文档-------概要 unity4.6中的一个重要的升级就是GUI ,也把它称为UGUI ,废话我不多说,大家可以百度了解一下. 虽然现在处 ...
- [转帖]网络协议封封封之Panabit配置文档
原帖地址:http://myhat.blog.51cto.com/391263/322378
- tidb 记录文档
ansible-playbook stop.yml / start.yml 重启集群,在ansible目录下执行 SHOW STATS_META; 查看统计信息 重启集群:ansible-play ...
- [转帖]UsingDiskspdforSQLServer --- 改天做下练习 官方文档.
Using DiskSpd in SQL Server environments Writer: Robert Beene Contributors: Jose Barreto, Ramu Konid ...
- 内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]
在环境里是没有问题的 就是发布网站后,会出现“/”应用程序中的服务器错误.--------------------------------------------------------------- ...
- 【转帖】Istio是啥?一文带你彻底了解!
Istio是啥?一文带你彻底了解! http://www.sohu.com/a/270131876_463994 原始位置来源: https://cizixs.com 如果你比较关注新兴技术的话,那么 ...
- Apache DolphinScheduler&TiDB联合Meetup | 聚焦开源生态发展下的应用开发能力
在软件开发领域有一个流行的原则:Don't Repeat Yourself(DRY),翻译过来就是:不要重复造轮子.而开源项目最基本的目的,其实就是为了不让大家重复造轮子. 尤其是在大数据这样一个高速 ...
- OpenStack Pike超详细搭建文档 LinuxBridge版
前言 搭建前必须看我 本文档搭建的是分布式P版openstack(1 controller + N compute + 1 cinder)的文档. openstack版本为Pike. 搭建的时候,请严 ...
随机推荐
- k8s卷管理-1
目录 卷管理-1 1. 本地存储 1.1 emptyDir 1.2 hostPath 网络存储 搭建NFS服务器 使用NFS网络存储 搭建iSCSI服务器 使用iSCSI网络存储 卷管理-1 我们之前 ...
- gmap构建离线地图,用createCustomerTiledLayer方法,瓦片地址尾部多了 ?x={x}&y={y}&z&{z} 导致无法显示地图。
gmap构建离线地图,用createCustomerTiledLayer方法,瓦片地址尾部多了 ?x={x}&y={y}&z&{z} 导致无法显示地图. function in ...
- 5大特性,带你认识化繁为简的华为云CodeArts Deploy
摘要:2月27日,华为云发布持续部署服务CodeArts Deploy,通过模块化自由编排部署流程,实现软件的自动化部署,帮助企业软件产品的快速.高效.高质量交付. 本文分享自华为云社区<化繁为 ...
- GaussDB(for Redis)揭秘:Redis存算分离架构最全解析
前言: 本文根据华为云NoSQL数据库架构师余汶龙,在今年的中国系统架构师大会SACC上的演讲整理而成,内容如下. 本次分享的大纲分成如下四个部分: 什么是GaussDB(for Redis)? 为什 ...
- Linux如何进行GPIO读写操作的?
摘要:本文介绍GPIO的读写,介绍基本原理,以及不同读写方式的性能. 本文分享自华为云社区<Linux 基于sysfs的GPIO读写操作>,作者:一颗小树x . 前言 最近接触到Linux ...
- Windows 2016 2019 显示桌面图标
运行cmd窗口 输入命令 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 弹出桌面图标设置窗口
- JAVA CRC8
Java CRC8 /** * CRC-8 * * <table width="400px" border="1" cellpadding="0 ...
- Spring Boot Admin 查看 Client 日志
日志配置如下:如何将不同业务模块产生的日志 分多文件记录 此时 Spring Boot Admin 中看不了 Client 的日志 Logfile ViewerBy default the logfi ...
- BST(二叉搜索树)
BST 基础芝士 给定一棵二叉树,每个节点有权值,定义"BST 性质"为: 对于树中的任意一个节点 \(x\) 都有: \(x\) 的权值大于 \(x\) 的左子树中任意节点的权值 ...
- Linux day2:文件和文件夹相关命令 文件内容编辑命令 Linux常用目录 Linux重要文件
目录 问题说明 前期必备知识 系统运行命令 shutdown -c 快捷方式命令 ctrl+e 目录结构相关命令 mkdir -p 文件和文件夹相关命令 创建文件 touch 查看文件和目录 ls - ...