【第24天】SQL进阶-查询优化- performance_schema系列实战一:利用等待事件排查MySQL性能问题(SQL 小虚竹)

news2024/11/18 2:45:19

回城传送–》《32天SQL筑基》

文章目录

  • 零、前言
  • 一、背景
  • 二、performance_schema配置配置表启用等待事件的采集与记录
  • 三、sysbench基准测试工具
    • 3.1 安装和使用sysbench
      • 3.1.1 yum安装
      • 3.1.2 查看版本信息
      • 3.1.3 sysbench 使用说明
    • 3.2 sysbench 测试服务器cpu性能
    • 3.3 sysbench测试硬盘的IOPS
      • 3.3.1 准备测试数据
      • 3.3.2 开始测试
      • 3.3.3 清除测试数据
    • 3.4 实战:使用sysbench测试mysql数据库
      • 3.4.1 准备测试数据
      • 3.4.2 开始测试
      • 3.4.3 清理测试数据
  • 四、sysbench对mysql数据库执行加压
    • 4.1 准备测试数据:
    • 4.2 开始测试
  • 五、总结
  • 六、参考

零、前言

今天是学习 SQL 打卡的第 24 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。

希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。

​ 虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

今天的学习内容是:SQL进阶-查询优化- performance_schema系列实战一:利用等待事件排查MySQL性能问题

一、背景

在生产上线之前,对数据库进行增删改查的基准测试,收集基准数据,为了后续做扩容和架构升级做准备。
MySQL数据库基准测试通常选择sysbench、tpcc-mysql、workbench。

以下我们以sysbench基准测试工具压测MySQL数据库为例,介绍如何使用performance_schema的等待事件来排查数据库性能瓶颈所在。

二、performance_schema配置配置表启用等待事件的采集与记录

使用performance_schema配置表启用等待事件的采集与记录。

 use performance_schema;

在这里插入图片描述
修改setup_instruments 表的enabled和timed字段为yes,表示启用对应的instruments

update setup_instruments set enabled='yes',timed='yes' where name like 'wait/%';

在这里插入图片描述
查看修改结果,enabled和timed字段为YES即表示当前instruments已经启用(但此时采集器并不会立即采集事件数据,需要保存这些等待事件的表–consumers,启用之后才会开始采集)

select * from setup_instruments where name like 'wait/%';

在这里插入图片描述
在这里插入图片描述
启用等待事件的consumers

update setup_consumers set enabled='yes' where name like '%wait%';

在这里插入图片描述
查询结果:

select * from setup_consumers where name like '%wait%';

在这里插入图片描述

三、sysbench基准测试工具

mysql 基准测试可以理解为对mysql数据库运行时的一种压力测试。关键指标有3个方面:
TPS/QPS:衡量吞吐量。
响应时间:包括平均响应时间,最小响应时间,最大响应时间和时间百分比竺。
并发量:同时处理查询请求的数量。
sysbench支持多线程工作,并且能够跨平台安装部署。

3.1 安装和使用sysbench

3.1.1 yum安装

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash

在这里插入图片描述

sudo yum -y install sysbench

如图为安装成功。
在这里插入图片描述

3.1.2 查看版本信息

sysbench --version

在这里插入图片描述

3.1.3 sysbench 使用说明

 sysbench --help

以下中括号中的值表示默认值

option类型参数名称参数含义
通用选项threads指定线程数[1]
通用选项events限制最大请求数,0表示不限制[0]
通用选项time限制最长执行时间,0表示不限制[10] ,单位秒
通用选项forced-shutdown达到最长执行时间后还需等待多久关闭sysbench off表示禁用该功能[off]
通用选项thread-stack-size每个线程使用的栈空间大小[64K]
通用选项rate平均事务处理速率,0表示不限制[0]
通用选项report-interval每隔几秒报告一次结果,0表示禁用间隔报告[0]
通用选项config-file从文件中读取命令行选项
mysql专用选项mysql-hostmysql主机名,[localhost]
mysql专用选项mysql-portmysql端口,[3306]
mysql专用选项mysql-socket指定 socket 文件来连接
mysql专用选项mysql-user登录mysql的用户名,默认值:[sbtest]
mysql专用选项mysql-password登录mysql的密码
mysql专用选项mysql-db指定数据库名称,默认值:[sbtest]
mysql专用选项mysql-ssl使用ssl连接
mysql专用选项mysql-ssl-cipher使用ssl连接时的密码
mysql专用选项mysql-compression使用压缩算法
mysql专用选项mysql-debug跟踪所有的客户端使用,[off]
mysql专用选项mysql-ignore-errors忽略指定的错误代码或者使用all忽略所有的错误,[1213,1020,1205]
  • testname :指定要进行测试的名称。

  • command : 代表sysbench 要执行的命令,包含prepare,run和cleanup三个命令。

    • prepare :为测试提前准备数据。
    • run : 执行正式的测试。
    • cleanup: 在测试完成后对数据库进行清理。

3.2 sysbench 测试服务器cpu性能

sysbench cpu --cpu-max-prime=20000 --threads=2 run

对cpu的测试,是进行素数的加法运算测试,其中:
–cpu-max-prime:生成素数的数量上限。
–threads:启动进行素数计算的线程数。

在这里插入图片描述
说明:

Running the test with following options:
#指定线程个数
Number of threads: 2
Initializing random number generator from current time

#每个线程产生的素数上限为2万个。
Prime numbers limit: 20000

Initializing worker threads...

Threads started!

CPU speed:
#所有线程每秒完成了839.89次event
    events per second:   839.89

General statistics:
    total time:                          10.0022s 
    total number of events:              8402	#在10.0022s秒内共完成了8402次event
    

Latency (ms):
         min:                                    2.29
         avg:                                    2.38
         max:                                   10.31
         95th percentile:                        2.61  #95%的events都在2.61毫秒内完成。
         sum:                                19997.47

Threads fairness:
# 平均每完成4201.0000次event,标准差是2
    events (avg/stddev):           4201.0000/2.00
    # 每个线程平均耗时9.9987秒。
    execution time (avg/stddev):   9.9987/0.00

3.3 sysbench测试硬盘的IOPS

3.3.1 准备测试数据

sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 --max-requests=0 prepare

在这里插入图片描述
在这里插入图片描述

3.3.2 开始测试

 sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 --max-requests=0 run

执行效果:
在这里插入图片描述

IOPS的计算公式如下:

IOPS=(Throughput read +Throughput written)*1024/16KB
Throughput read :每秒的输入量
Throughput written:每秒的输出量。

从图上的测试数据可以计算出当前硬盘的IOPS为:

IOPS=( 12.31+8.21)*1024/16=1313.28

3.3.3 清除测试数据

 sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 --max-requests=0 cleanup

在这里插入图片描述

3.4 实战:使用sysbench测试mysql数据库

sysbench提供了对数据库性能测试的lua脚本。这些脚本放在: /usr/share/sysbench/目录下。
为了以树形查看结构,先安装tree命令。

sudo yum install -y tree

在这里插入图片描述

列 出lua脚本。

tree /usr/share/sysbench/ -P *.lua

在这里插入图片描述
下面实战演示使用lua脚本测试mysql数据库。

3.4.1 准备测试数据

创建测试数据库sysbenchdemo

create database sysbenchdemo;

在这里插入图片描述
准备测试数据:

sysbench /usr/share/sysbench/oltp_insert.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--tables=5 \
--table-size=100000 \
--time=180 prepare

在这里插入图片描述

说明:

使用/usr/share/sysbench/oltp_insert.lua脚本,创建了5张表,往每张表插入100000条数据。

3.4.2 开始测试

sysbench /usr/share/sysbench/oltp_insert.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--tables=5 \
--table-size=100000 \
--time=180 run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time


Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            0
        # 总的写次数
        write:                           29970
        other:                           0
        total:                           29970
        # 总的事务数和每秒事务数
    transactions:                        29970  (166.50 per sec.)
    queries:                             29970  (166.50 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
# 总的执行时间和事件数。
    total time:                          180.0018s
    total number of events:              29970
# 延时统计信息
Latency (ms):
         min:                                    3.16
         avg:                                    6.00
         max:                                  237.40
         95th percentile:                       11.24
         sum:                               179912.58

Threads fairness:
    events (avg/stddev):           29970.0000/0.00
    execution time (avg/stddev):   179.9126/0.00

3.4.3 清理测试数据

sysbench /usr/share/sysbench/oltp_insert.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--tables=5 \
--table-size=100000 \
--time=180 cleanup

在这里插入图片描述

四、sysbench对mysql数据库执行加压

逐渐增加并发线程数,直到tps、qps不再随着线程数的增加而增加为止

4.1 准备测试数据:

sysbench /usr/share/sysbench/oltp_insert.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--tables=8 \
--table-size=100000 \
--time=180 prepare

在这里插入图片描述

4.2 开始测试

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--oltp-table-size=5000000 \
--oltp-tables-count=8 \
--num-threads=16 \
--max-time=1800 \
--max-requests=0 \
--report-interval=1 run

从sysbench的输出结果中,我们可以看到在16个并发线程oltp压力下,tps可以跑到600~900,qps:15000左右,且延迟在1000ms+
在这里插入图片描述
为什么延迟这么高,使用top看下,可以看出mysql 的cpu占用率高。
在这里插入图片描述
为了方便查询等待事件统计,我们可以先创建一个视图,用于实时统计当前等待事件(非历史数据)

 use performance_schema;

在这里插入图片描述

create view sys.test_waits as select sum(TIMER_WAIT) as TIMER_WAIT,sum(NUMBER_OF_BYTES) as NUMBER_OF_BYTES, EVENT_NAME,OPERATION from events_waits_current where EVENT_NAME!='idle' group by EVENT_NAME,OPERATION;

在这里插入图片描述

select sys.format_time(TIMER_WAIT),sys.format_bytes(NUMBER_OF_BYTES),EVENT_NAME,OPERATION from sys.test_waits where sys.format_time(TIMER_WAIT) not regexp 'ns|us' order by TIMER_WAIT desc;

在这里插入图片描述
也可以直接查询events_waits_current表

select THREAD_ID,EVENT_NAME,sys.format_time(TIMER_WAIT),INDEX_NAME,NESTING_EVENT_TYPE,OPERATION,NUMBER_OF_BYTES 
from events_waits_current 
where EVENT_NAME!='idle' order by TIMER_WAIT desc;

在这里插入图片描述

从上述等待事件的查询结果中,是cpu不够,wait/synch/cond/mysqlx/scheduler_dynamic_worker_pending 调度程序动态工作程序挂起。

五、总结

本文分享了sysbench如何安装和使用,详细介绍了通过sysbench压测mysql数据库,利用等待事件排查MySQL性能问题。
哈哈哈,你学会了吗~

六、参考

应用示例荟萃 | performance_schema全方位介绍(上)

【mysql 数据库进阶实战-第10章mysql性能优化与运维管理】作者:赵渝强老师

我是虚竹哥,我们明天见~

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

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

相关文章

Hadoop 入门基础 及HiveQL

一、hadoop 解决了什么问题?即hadoop 产生背景 一个能够轻松方便、经济实惠地存储和分析大量数据的非常流行的开源项目。 二、hadoop 是如何低成本地解决大数据的存储和分析的?即hadoop 原理,hadoop 的组成部分 Hadoop的创始人、Cloudera首…

Java图形化界面---基本组件

目录 一、基本组件介绍 二、Diaolg对话框 (1)Dialog (2) FileDialog 一、基本组件介绍 Button 按钮 Canvas 用于绘图的画布 Checkbox 复选框组件 CheckboxGroup 用于将多个…

【阶段三】Python机器学习06篇:模型评估函数介绍(分类模型)

本篇的思维导图: 模型评估函数介绍(分类模型) accuracy_score()函数 作用:accuracy_score函数计算了模型准确率。在二分类或者多分类中,预测得到的标签,跟真实标签比较,计算准确率。 注意事项:在正负样本不平衡的情况下,准确率这个评价指标有很大的缺陷。比如数据样本…

数据库管理-第五十一期 新年新气象(20230108)

数据库管理 2023-01-08第五十一期 新年新气象1 新年快乐2 旧账3 软硬件对比4 新气象总结第五十一期 新年新气象 1 新年快乐 2023年来了,我也没有第一时间写一篇写文章给大家祝福,第一呢是因为某些原因元旦假期也没咋休息,其次就是因为本周又…

Allegro174版本新功能介绍之新增几种沿着目标打过孔模式

Allegro174版本新功能介绍之新增几种沿着目标打过孔模式 Allegro在低版本的时候,就已经有了沿着目标打过孔的功能,在升级到了174版本后,又新增了几种打过孔的模式,类似下图 以第一种模式举例介绍说明 点击Place

DFT知识点扫盲——DFT scan chain

先说一下tsmc的std celltsmc 7nm工艺下有专门的std synccell 命名如下:SDFSYNC1RPQD1XXXXVTSDFSYNC1SNQD1XXXXVTSDFSYNC1QD1XXXXVT不考虑VT, PWR和track,电压等差别,整个工艺库下只有这三种实际在项目中synccell一般直接上ULVT,既…

2022年第四届全国高校计算机能力挑战赛c++组决赛

A 题目描述 小丽好朋友的生日快到了,她打算做一些折纸放在幸运罐中作为生日礼物。小丽计划总共 需要a颗星星以及b只纸鹤。现在市场上卖的到的星星纸(折小星星的专用纸)一张可以折c颗小星星,一张纸鹤纸(折纸鹤的专用纸)可以折d只小纸鹤。她准备一共买k张…

【C++】模板进阶

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉非类型模…

三次握手四次挥手

三次握手&四次挥手 三次握手 四次挥手

RA-Net:一种混合深度注意感知网络,用于提取CT扫描中的肝脏和肿瘤

摘要 本文提出了一种三维混合残差注意感知分割网络,称为RA-UNet,用于提取肝脏感兴趣区域(VOI)并从这个感兴趣区域(VOI)中分割肿瘤。这个网络的基本架构为三维UNet。它结合了低层次特征图和高层次特征图提取…

【从零开始学习深度学习】39. 梯度下降优化之动量法介绍及其Pytorch实现

动量法的提出主要是为了优化在多变量目标函数中不同自变量梯度下降过程中更新速度快慢不均的问题,并且使目标函数向最优解更快移动。 目录1. 梯度下降中的问题2. 动量法介绍及原理2.1 动量法的数学解释---指数加权移动平均2.2 由指数加权移动平均理解动量法3. 从零实…

【HTML | CSS | Javascript】一款响应式精美简历模板分享(万字长文 | 附源码)

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

JS面试题--深入JavaScript运行原理

深入JavaScript运行原理 JavaScript让人迷惑的知识点 JavaScript是一门编程语言 浏览器的工作原理 一般的浏览器有以下主要部分组成:1. 用户界面包括浏览器中可见的地址输入框,浏览器前进返回按钮,打开书签,打开历史记录等用户可…

NEUQ week10 题解

P1636 Einstein学画画 题目描述 Einstein 学起了画画。 此人比较懒~~,他希望用最少的笔画画出一张画…… 给定一个无向图,包含 nnn 个顶点(编号 1∼n1 \sim n1∼n),mmm 条边,求最少用多少笔可以画出图中…

对于NPS 的学习和认知

企业存在的唯一使命是创造顾客 —— 彼得德鲁克对于现代的多数组织而言,净推荐值(NPS)是一种衡量顾客满意度的“温度计”。NPS看似是一种管理工具,其实更多的是对企业基因的一种改变,其倡导的是内生性的问题&#xff0…

Java对象内存布局

对象内存构成 当我们在Java代码中创建对象后 会在堆中分配对应的内存 在 JVM 中,Java对象保存在堆中时,由以下三部分组成: 对象头(object header):包括了关于堆对象的布局、类型、GC状态、同步状态和标识…

概率论【随机事件和概率】--猴博士爱讲课

第一课 随机事件和概率 1/6 无放回类题目(一次摸多个) 例1.盒子里有3绿4红共7个小球,无放回的摸3个试求摸出1绿2红的概率例2.钱包里有3张100元,5张10元,3张5元的纸币,随机摸3张,试求摸出1张100,2张10的概率例1.盒子里…

【虚幻引擎】UE4 Http之异步请求数据

一、BlueprintAsyncActionBase UE提供了BlueprintAsyncActionBase类,实现异步加载的方式请求数据 虚幻的很多蓝图节点都采用了异步加载的方式 比如:延迟Delay,PlayMontage都是采用异步加载的方式进行实现 接下我们就用异步加载的方式实现HTT…

类和对象3

继承 继承是三大面向对象特征之一,继承无处不在,继承不仅是代码复用,精髓之处在于用抽象思维编写代码,以达到程序更强的可扩展性。 //继承一个父类,只能继承非私有的数据(属性和方法) //prote…

大数据之Kafka基本知识和架构介绍

文章目录前言一、Kafka的基本介绍(一)Kafka的特点二、Kafka的架构总结前言 #博学谷IT学习技术支持# 本篇文章主要从Kafka的基本介绍,Kafka的架构入手,如果有不恰当或者有疑问的地方,非常欢迎各位的意见和建议&#xf…