TiDB 7.1 资源管控验证测试

news2024/9/20 19:38:44

作者: dba-kit 原文来源: https://tidb.net/blog/9cd7dcb3

〇、背景

我们线上使用环境和李文杰大佬比较类似,我这里就不赘述了,大家可以看 专栏 - TiDB v7.1.0 跨业务系统多租户解决方案 | TiDB 社区 ,这里比较清晰的介绍了7.1的资源管控原理和实践验证。

本文章的重点在通过实验探索资源管控的一些细节表现,详细来讲就是:TiDB的流控能力和TiKV的调度能力。

  • TiDB流控能力 :是看在tidb-server资源不足的情况,是否能正确按照Quota限制特定用户的使用资源。
  • TiKV调度能力 :是看在TiKV资源不足时候,能否优先响应高优先级的资源组请求,以及和当前tidb-server的优先级的区别。

一、测试环境准备

创建用户及资源组

CREATE RESOURCE GROUP IF NOT EXISTS rg_5000 RU_PER_SEC=5000;
CREATE RESOURCE GROUP IF NOT EXISTS rg_5000_high RU_PER_SEC=5000 PRIORITY = HIGH;

CREATE RESOURCE GROUP IF NOT EXISTS rg_3000  RU_PER_SEC = 3000;
CREATE RESOURCE GROUP IF NOT EXISTS rg_3000_burstable  RU_PER_SEC = 3000 BURSTABLE;

CREATE RESOURCE GROUP IF NOT EXISTS rg_30000_high RU_PER_SEC=30000 PRIORITY = HIGH;
CREATE RESOURCE GROUP IF NOT EXISTS rg_30000_low RU_PER_SEC=30000 PRIORITY = LOW;

CREATE USER 'usr_rg_5000'@'%' IDENTIFIED BY '123' RESOURCE GROUP rg_5000;
GRANT ALL ON *.* TO 'usr_rg_5000'@'%';

CREATE USER 'usr_rg_5000_high'@'%' IDENTIFIED BY '123' RESOURCE GROUP rg_5000_high;
GRANT ALL ON *.* TO 'usr_rg_5000_high'@'%';

CREATE USER 'usr_rg_3000'@'%' IDENTIFIED BY '123' RESOURCE GROUP rg_3000;
GRANT ALL ON *.* TO 'usr_rg_3000'@'%';

CREATE USER 'usr_rg_3000_burstable'@'%' IDENTIFIED BY '123' RESOURCE GROUP rg_3000_burstable;
GRANT ALL ON *.* TO 'usr_rg_3000_burstable'@'%';

CREATE USER 'usr_rg_30k_high'@'%' IDENTIFIED BY '123' RESOURCE GROUP rg_30000_high;
GRANT ALL ON *.* TO 'usr_rg_30k_high'@'%';

CREATE USER 'usr_rg_30k_low'@'%' IDENTIFIED BY '123' RESOURCE GROUP rg_30000_low;
GRANT ALL ON *.* TO 'usr_rg_30k_low'@'%';

准备测试数据

tiup-bench tpcc prepare --warehouses 100 -D tpcc_test --dropdata -H 172.18.x.x -U usr_rg_3000 -p 123 -P 4000 -T 50
tiup-bench tpcc prepare --warehouses 100 -D tpcc_test2 --dropdata -H 172.18.x.x -U usr_rg_3000 -p 123 -P 4000 -T 50

二、测评方案

2.1 TiDB流控测评

测试方案

测试目标:

  • 不同资源组连到同一个TiDB上,测试不同资源组之间的隔离性
  • 同一个用户连到不同TiDB上,测试同一用户的Quota是否共用
  • 同一资源组不同用户,测试同一资源组的Quota是否共用

2.1.1 不同资源组的隔离性

#! /bin/bash

# 1. 使用usr_rg_3000_burstable用户作为测试的背景噪音,令TiDB的CPU尽可能高
echo "$(date +"%F %T"): start bench use usr_rg_3000_burstable for 2h"
nohup tiup-bench tpcc run -D tpcc_test2 --host 172.18.x.x -U usr_rg_3000_burstable -p 123 -P 4000 -T 50 --time 2h  >usr_rg_3000_burstable.log &

# 2. 5-35min. 3000 for 30m (后续每隔5min启动一个测试用户进行压测)
sleep 300
echo "$(date +"%F %T"): start bench use usr_rg_3000 for 30m"
nohup tiup-bench tpcc run -D tpcc_test2 --host 172.18.x.x -U usr_rg_3000 -p 123 -P 4000 -T 50 --time 30m  >usr_rg_3000.log &

# 3. 10-45min. 5000 for 30m
sleep 300
echo "$(date +"%F %T"): start bench use usr_rg_5000 for 30m"
nohup tiup-bench tpcc run -D tpcc_test2 --host 172.18.x.x -U usr_rg_5000 -p 123 -P 4000 -T 50 --time 30m  >usr_rg_5000.log &

# 4. 15-20min. 5000 for 5m
sleep 300
echo "$(date +"%F %T"): start bench use usr_rg_5000 for 5m"
nohup tiup-bench tpcc run -D tpcc_test2 --host 172.18.x.x -U usr_rg_5000 -p 123 -P 4000 -T 50 --time 5m  >usr_rg_5000-2.log &

#5. 25-55min. 3000 high for 30m
sleep 300
echo "$(date +"%F %T"): start bench use usr_rg_3000_high for 30m"
nohup tiup-bench tpcc run -D tpcc_test2 --host 172.18.x.x -U usr_rg_3000_high -p 123 -P 4000 -T 50 --time 30m  >usr_rg_3000_high.log &

# 6. 30-35min. 5000 for 5m
sleep 300
echo "$(date +"%F %T"): start bench use usr_rg_5000 for 5m"
nohup tiup-bench tpcc run -D tpcc_test2 --host 172.18.x.x -U usr_rg_5000 -p 123 -P 4000 -T 50 --time 5m  >usr_rg_5000-2.log &

测试结果

时序图

测试结果

结果解析

  1. 阶段1:由于只有 usr_rg_3000_burstable 一个用户在使用集群,虽然Quota设置为3k,但因为设置了 BURSTABLE 可以跑到22k
  2. 阶段2-4:并发一直在增大,TiDB的负载在逐渐增加, usr_rg_3000_burstable 的流控曲线(黄色曲线)也越来越低,从22k、7.5k、6k逐步降低至4k
  3. 阶段4:虽然使用 usr_rg_5000 用户新增了一个TPCC压测进程,但是总的资源消耗不变,还是5k。
  4. 阶段5:随着 usr_rg_5000 一个压测进程结束, usr_rg_3000_burstable 的资源从4k增加到5k(不过 usr_rg_5000 总的资源消耗略有下降,从5k下降至4.8k,可能是TiDB压力太大导致的)
  5. 阶段6:继续使用 usr_rg_5000 用户新增了一个TPCC压测进程, 这一场景其实和阶段4比较类似,不过新增了 usr_rg_3000_high 资源组的压测进程,此时TiDB-Server的压力是最大的,几个资源组的曲线都略有波动,不过波动不大
  6. 阶段7-10:随着其他资源组的压测进程逐渐结束,TiDB的负载在逐渐降低, usr_rg_3000_burstable 的流控曲线(黄色曲线)也越来越高,逐步回升到24k。

由此来看,TiDB-Server层的流控还是比较符合预期的,当负载压力小的时候,允许部分用户超额使用资源,当负载压力大的时候,又能保证其他用户的Quota正常。

2.1.2 同一用户不同 tidb-server

测试命令

nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_3000 -p 123 -P 4000 -T 50 --time 5m  >usr_rg_3000.log.1 &
sleep 60;
nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_3000 -p 123 -P 14000 -T 50 --time 5m  >usr_rg_3000.log.2  &

测试结果

2023-07-04-22-56-13-image.png

2023-07-04-23-04-14-image.png

结果解析

  • 观察RU使用曲线:在第二个压测进程启动后,资源使用会短时间高于Quota;当第一个压测进程结束后,资源使用会短时间低于Quota;不过很快就会回归正常Quota。
  • 观察tidb-sever的CPU曲线:当只有一个压测进程在跑时候,单个tidb-server的CPU是正常使用的,当两个压测进程共同跑时候,两个tidb-server会平均分配负载,达到负载均衡的状态,更合理使用资源。

2.1.3 不同用户同一资源组

压测命令

CREATE USER 'usr_rg_3000_2'@'%' IDENTIFIED BY '123' RESOURCE GROUP rg_3000;
grant all on *.* to 'usr_rg_3000_2'@'%';
nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_3000 -p 123 -P 4000 -T 50 --time 5m  >usr_rg_3000.log.1 &
sleep 60;
nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_3000_2 -p 123 -P 14000 -T 50 --time 5m  >usr_rg_3000.log.2  &

压测结果

2023-07-04-23-11-01-image.png

2023-07-04-23-12-34-image.png

结果解析

通过监控曲线,可以看到同一资源组的两个不同用户,和同一用户两个不同压测进程的曲线是基本一致的,说明同一资源组内的不同用户是共享Quota的。

2.1.4 总结

因为同一资源组内不同用户是共享Quota的,所以个人理解的TiDB的流控最佳实践为:

  • 对所有资源组都设置 BURSTABLE 属性,这样才能提高TiDB-Server的资源利用率。
  • 针对OLAP场景的用户,可以设置一个较小的Quota,当资源紧张时候,让它们尽可能小的占用资源,不影响OLTP的查询。

2.2 TiKV调度能力测试

由于2.1的测试案例,只有一个TiDB-Server实例,最终的TiKV压力并不大,看不出来TiKV层的优先级调度能力。使用 tiup cluster edit-config 将tikv-server配置修改为 resource_control.cpu_quota: 400% ,降低TiKV的CPU资源。

通过 instance.tidb_force_priority 来对特定TiDB-Server上的查询来设置优先级,测试一下通过TiDB-Server隔离,和通过资源组来设置的优先级有什么区别。

mysql> show config where name like '%tidb_force_priority%';
+------+------------------+------------------------------+---------------+
| Type | Instance         | Name                         | Value         |
+------+------------------+------------------------------+---------------+
| tidb | 172.18.9.4:4000  | instance.tidb_force_priority | HIGH_PRIORITY |
| tidb | 172.18.9.4:14000 | instance.tidb_force_priority | LOW_PRIORITY  |
+------+------------------+------------------------------+---------------+
2 rows in set (0.01 sec)

测试案例包括:

  • 资源组PRIORITY不同,TiDB的PRIORITY相同
  • 资源组PRIORITY相同,TiDB的PRIORITY不同
  • 高PRIORIT的资源组连接低PRIORITY的TiDB vs. 低PRIORIT的资源组连接高PRIORITY的TiDB

2.2.1 资源组PRIORITY不同,TiDB的PRIORITY相同

为使TiKV的CPU达到瓶颈,使用大Quota的资源组来进行测试

nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_30k_low -p 123 -P 4000 -T 100 --time 5m &
sleep 120;
nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_30k_high -p 123 -P 4000 -T 100 --time 5m  &

2023-07-05-23-14-24-image.png

2.2.2 资源组PRIORITY相同,TiDB的PRIORITY不同

nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_30k_low -p 123 -P 4000 -T 100 --time 5m &
sleep 120;
nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_30k_low -p 123 -P 14000 -T 100 --time 5m  &

image.png

2023-07-05-23-21-59-image.png

2023-07-05-23-25-59-image.png

2.2.3 高PRIORIT的资源组连接低PRIORITY的TiDB vs. 低PRIORIT的资源组连接高PRIORITY的TiDB

nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_30k_low -p 123 -P 4000 -T 100 --time 5m &
sleep 120;
nohup tiup-bench tpcc run -D tpcc_test --host 172.18.9.4 -U usr_rg_30k_high -p 123 -P 14000 -T 100 --time 5m  &

2023-07-05-23-34-56-image.png

2023-07-05-23-35-29-image.png

2023-07-05-23-35-47-image.png

2.2.4 总结

综合三次测试,可以发现不管是资源组优先级还是tidb-server的优先级,在TiKV层都是同样的处理,其调度能力并不能按照预期体现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/733314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyQt---------PyQt组件的学习

1.QLabel组件 QLabel用于显示文本或图像,不提供用户交互功能,标签的视觉外观可以以各种方式配置。 举个例子吧 import sys from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QApplication, QLabel, QMainWindowclass MainWindow(QMainWindow…

大厂C++题第1辑——虚函数七题精讲之2:虚函数的作用机制

一、虚函数的常见应用场景; 二、发挥虚函数作用的语法; 三、虚函数的实现机制; 四、虚函数的性能影响。 题2-虚函数的常见应用场景 上一节我们讲了虚函数的作用,同时也演示了虚函数发挥作用的路径之一: 一个派生类对…

Docker 私有仓库 harbor 搭建

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

Vue操作Cookie

这里用的js-cookie。 很简单,安装一下就可以使用了。 npm install js-cookie --save 使用示例: import Cookies from js-cookieexport default {name: YourComponent,methods: {setCookie() {// 设置一个名为 name 的cookie,值为 value&a…

聚焦信息技术发展,博睿数据受邀出席产业链供需对接深度行北京站活动

7月6日,以“广聚群链 湾区启航”为主题的产业链供需对接深度行北京站活动圆满落幕。本次活动吸引了来自北京和广东的多家知名企业参与,博睿数据受邀出席了本次活动,同时携核心产品一体化智能可观测平台Bonree ONE参展,展示博睿数据…

Nginx配置springboot+vue项目http跳转https

java生成证书 添加依赖 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.69</version></dependency> import org.bouncycastle.asn1.ASN1Encodable; import org.bounc…

易微联2.4G通断器添加到手机步骤

蓝牙款无WIFI&#xff0c;按住通断器上的按钮&#xff0c;会先闪一下&#xff0c;再闪两下。闪一下的时候连手机&#xff0c;闪两下清码。 手机上打开易微联app&#xff0c;依次点击加号/轻智能遥控器/单按键遥控器/添加完成。 返回打开刚才添加的开关&#xff0c;在通断器闪…

基于Spring Boot的医院信息管理系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的医院信息管理系统设计与实现 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 后端&#xff1a;Java springboot框架 mybatis 数据库&#xff1a;mysql5.7 开发工具:IDEA…

Apollo星火计划城市交通大赛600分,断头路,特殊车辆绕行,借道绕行

现在解决了前六题&#xff0c;可以拿到600分&#xff0c;有兴趣一起讨论的可以私聊我交流一下。

Linux命令(41)之top

Linux命令之top 1.top介绍 linux命令top是用来实时监测服务器资源的使用状况&#xff0c;包含进程、cpu、内存等等 2.top用法 top [参数] top常用参数 参数说明-d屏幕刷新时间间隔-i<time>设置刷新时间间隔-u<user>指定用户名-p<pid>指定进程号 top命令中…

Android平台GB28181设备接入技术探讨

GB/T28181技术背景 在此之前&#xff0c;我们先对协议规范做个简单了解&#xff1a;GB28181协议是一种用于视频监控系统互联互通的国际标准&#xff0c;它定义了视频监控系统中的设备间如何进行通信、交换数据和协调控制。以下是GB28181协议的一些主要内容&#xff1a; 设备互…

有哪些数据结构与算法是程序员必须要掌握的?——“数据结构与算法”

一&#xff1a;引言 作为IT程序员&#xff0c;学习算法的原因主要有以下几点&#xff1a; 提升问题解决能力&#xff1a;算法可以帮助程序员分析、优化和解决复杂问题。了解算法原理和实现方式将有助于程序员更快地找到合适的解决方案。这对于解决实际工作中的问题是非常有帮助…

基于STM32FFT(快速傅里叶变换)音频频谱显示功能实现

+ v hezkz17进数字音频系统研究开发交流答疑 一实验效果 二 设计过程 要用C语言实现STM32频谱显示功能,可以按照以下步骤进行操作: 1 确保已经安装好了适当的开发环境和工具链,例如Keil MDK或者GCC工具链。 2 创建一个新的STM32项目,并选择适合的MCU型号。 3 配置G…

es8.8 集群安装笔记

es8.8 集群安装笔记 配置集群第一步 修改配置文件 本次安装使用centos8 3节点安装&#xff1a; 192.168.182.142 192.168.182.143 192.168.182.144 官网 可以查看详细的安装&#xff0c;安装步骤比较简单 https://www.elastic.co/guide/en/elasticsearch/reference/8.8/rpm.htm…

使用gradio库的Plot模块创建交互式绘图界面

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Mongodb-5.0.18-zip下载与安装

1.下载地址 Download MongoDB Community Server | MongoDB 2.创建一个文件夹和master.cfg的文件 说明&#xff1a;目的是让mongodb存放数据库的位置在mongodb文件里面。 2.1创建名为mongodb的文件夹 2.2master.cfg 说明&#xff1a;在mongodb5.0.18目录下创建master.cfg。 …

DeepSpeed使用体会

现在的模型越来越大&#xff0c;动辄几B甚至几百B。但是显卡显存大小根本无法支撑训练推理。例如&#xff0c;一块RTX2090的10G显存&#xff0c;光把模型加载上去&#xff0c;就会OOM&#xff0c;更别提后面的训练优化。 作为传统pytorch Dataparallel的一种替代&#xff0c;D…

Spring Cloud Alibaba 之 Nacos精讲

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

ChatGPT炒股:批量自动提取股票公告中的表格并合并数据

首先&#xff0c;在ChatGPT中输入提示词&#xff1a; 写一段Python代码&#xff1a; F盘文件夹“新三板 2023年日常性关联交易20230704”中很多个PDF文件&#xff0c;用 Tabula提取这些PDF文件中第1页中的第2个表格&#xff0c;然后保存到表格文件中&#xff0c;文件标题名和…

选读SQL经典实例笔记03_DML和元数据

1. 复制数据到另一个表 1.1. sql insert into dept_east (deptno,dname,loc)select deptno,dname,locfrom deptwhere loc in ( NEW YORK,BOSTON ) 2. 复制表定义 2.1. 复制表结构&#xff0c;而不复制数据 2.2. MySQL 2.3. PostgreSQL 2.4. Oracle 2.5. sql create ta…