写点什么

避坑指南 生产环境 TiKV 的 IO-Util 趋近 100% 问题定位

  • 2022 年 7 月 11 日
  • 本文字数:1595 字

    阅读完需:约 5 分钟

作者: Ann_ann 原文来源:https://tidb.net/blog/983738a8


【 TiDB 使用环境】生产环境(华为云服务器)


【 TiDB 版本】v4.0.12


【遇到的问题】三个 tikv 的 io-util 趋近 100%

问题描述

生产环境 TiDB 集群三个 TiKV 节点的磁盘 IO-Util 利用率很高趋近 100%,云硬盘出现读写慢、IO 升高、await 值变大等现象:



Ps:部分业务迁移至 TiDB,数据量不大几十 GB

查找问题方向

  • 扩容 TiKV 节点看情况是否有改善

  • 压测云硬盘,更换硬盘类型

  • 修改`raftstore.sync-log`=false 参数观察 IO 情况

定位问题过程

扩容 TiKV 节点

在测试环境扩容两个 TiKV 节点,观察后续 IO 现象(红线后是扩容两个 TiKV 节点):



发现并未改善,IO_Util 还是一如既往的高

压测云硬盘,更换云硬盘类型

在测试环境 TiDB 集群扩容两台 TiKV 节点,其中一台保持原磁盘配置(通用性 SSD),另一台使用极速 SSD 进行测试,目前测试环境 TiKV 节点服务器配置:


华为云磁盘的性能:

极速 ssd iops IOPS = min (128000, 1800 + 50 × 容量) 1800 + 50 × 500=26800 所以 500G 的极速 SSD 盘 iops 为 26800


通用 ssd iops 1800 + 12 × 500=7800


极速 ssd 吞吐量 120 + 0.5 × 500=370M/s


通用 ssd 吞吐量  min (250, 100 + 0.5 × 容量) 100 + 0.5 × 500=350M/s(最大 250M/s)

实验结果

233 节点(通用 SSD):



83 节点(极速 SSD):


云硬盘实验结果总结:

单队列模式通用 SSD 支持最高 IOPS 及吞吐量: IOPS:4k 左右 吞吐量:16M 左右



极速 SSD 支持最高 IOPS 及吞吐量: IOPS:3k 左右 吞吐量:13M 左右



与华为云技术人员沟通,通过 avgqu-sz 参数得知,tidb 只用到了单队列或少队里模式,导致单通道 io-util 接近瓶颈,而通用或极速 SSD 支持 128 队列深度,TiDB 没能利用上这种模式的云盘,华为技术人员给出的建议是替换服务器实例采用本地磁盘,可能更符合 TiDB 的使用场景。

更换云服务种类:


替换 Ir3 服务器(超高 I/O 型弹性云服务器使用高性能 NVMe SSD 本地磁盘)后测试

单队列模式压测:


超高 I/O 型弹性云服务器使用高性能 NVMe SSD 本地磁盘,提供高存储 IOPS 以及低读写时延,单队列相比测试原通用 SSD 提升差不多三倍,有明显的提升效果(ps: 本地磁盘的服务器是 100G 容量,通用 ssd 磁盘为 500G 容量)

将队列深度设置为 4:


但队列深度调为 4 跟之前差不多,几乎没改善

加入测试 TiKV 集群 iostat 测试:

粉线为本地磁盘的 ir3 服务器:

替换 I3 服务器(超高 I/O 型弹性云服务器使用高性能 NVMe SSD 本地磁盘)后测试

单队列模式压测:


超高 I/O 型弹性云服务器使用高性能 NVMe SSD 本地磁盘,提供高存储 IOPS 以及低读写时延,单队列相比测试原通用 SSD 提升差不多三倍多,有明显的提升效果(ps: 本地磁盘的服务器是 1.6T 容量,通用 ssd 磁盘为 500G 容量)

将队列深度设置为 4:


队列深度调为 4 性能大大提升

加入测试 TiKV 集群 iostat 测试:

浅绿色为 I3 类型服务器,浅紫色为 Ir3 类型服务器,均是高性能 NVMe SSD 本地磁盘:


问题结论:

差不多一样的 iops 和吞吐量,io-util 的利用率为:



官方对磁盘的要求:



TiDB 对网络及硬盘要求较高,云服务器云盘无法满足 TiDB 的高 IO 操作需要,且云盘多队列 IO 特性不适用于 TiDB,想要使 TiDB 发挥出更佳性能,高性能 NVMe SSD 本地磁盘更符合 TiDB 的使用要求,建议更换超高 I/O 型弹性云服务器使用高性能 NVMe SSD 本地磁盘作为 TiKV 节点使用。

修改 raftstore.sync-log=false 参数

官方建议:sync-log 配置是控制 TiKV 数据多副本进行 raft 协议同步的时候,如果 sync-log=false,则内存中处理完成就返回 ack,对于 3 副本来说,单节点故障是不会丢失数据的,同一个 raft 集的 2 个副本同时故障可能会出现丢数据的情况,这个问题除了金融等对数据安全性要求非常高的场景外,其他的业务场景可根据可接受程度考虑。



性能损耗:



测试后结论:效果很明显,IO-Util 骤降,性能大大提升:




Ps:此次测试在测试环境试验,生产环境并未关闭此参数~


发布于: 刚刚阅读数: 3
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
避坑指南 生产环境TiKV的IO-Util趋近100%问题定位_集群管理_TiDB 社区干货传送门_InfoQ写作社区