怎么模仿磁盘 IO 慢的情况?并用于MySQL进行测试

今天给大家分享一篇在测试环境或者是自己想检验自己MySQL性能的文章
实验环境:
Rocky Linux 8
镜像:Rocky-8.6-x86_64-dvd.iso

1. 创建一个大文件作为虚拟磁盘

[root@localhost ~] dd if=/dev/zero of=/tmp/slowdisk.img bs=1M count=100
记录了100+0 的读入
记录了100+0 的写出
104857600 bytes (105 MB, 100 MiB) copied, 0.334391 s, 314 MB/s

这将创建一个100MB的文件/tmp/slowdisk.img。

2. 使用losetup将文件虚拟成块设备

[root@localhost ~] losetup -f --show /tmp/slowdisk.img
/dev/loop0

这会输出一个类似于/dev/loopX(X是数字)的设备名,表示你的虚拟磁盘。
注意:确保/var/lib/mysql/目录有足够的空间,或者选择一个其他有足够空间的目录。

3. 创建文件系统并挂载

由于只是模拟,通常不会真正在这个设备上创建文件系统(因为后续我们要用特定的方式来模拟延迟,而不是真正的文件系统延迟)。但如果你真的想这么做,可以使用如下命令(以ext4为例):

[root@localhost ~] mkfs.ext4 /dev/loop0
mke2fs 1.45.6 (20-Mar-2020)
丢弃设备块: 完成                            
创建含有 102400 个块(每块 1k)和 25688 个inode的文件系统
文件系统UUID:7ea37143-3461-45a1-bbce-1b3008535be1
超级块的备份存储于下列块: 
        8193, 24577, 40961, 57345, 73729

正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(4096 个块)完成
写入超级块和文件系统账户统计信息: 已完成

[root@localhost ~] mkdir -p /tmp/slowdisk && mount /dev/loop0 /tmp/slowdisk

4. 配置MySQL

将 binlog 的位置设置到 /tmp/slow,开启双 1 刷盘参数

vim /etc/my.cnf
log-bin=/tmp/slowdisk/binlog
innodb_flush log_at_trx_commit=1

5. 用 mysqlslap 进行压力测试

mysqlslap 使用方法介绍

通过mysqlslap –help可以获得可用的选项,这里列一些主要的参数,更详细的说明参考官方手册。

1) concurrency代表并发数量,多个可以用逗号隔开,例如:concurrency=10,50,100, 并发连接线程数分别是10、50、100个并发。

2) --engines代表要测试的引擎,可以有多个,用分隔符隔开。

3) --iterations代表要运行这些测试多少次。

4) --auto-generate-sql 代表用系统自己生成的SQL脚本来测试。

5)--auto-generate-sql-load-type 代表要测试的是读还是写还是两者混合的(read,write,update,mixed)

6) --number-of-queries 代表总共要运行多少次查询。每个客户端运行的查询数量可以用查询总数/并发数来计算。

7) --debug-info 代表要额外输出CPU以及内存的相关信息。

8) --number-int-cols :创建测试表的 int 型字段数量

9) --auto-generate-sql-add-autoincrement : 代表对生成的表自动添加auto_increment列,从5.1.18版本开始

10) --number-char-cols 创建测试表的 char 型字段数量。

11) --create-schema 测试的schema,MySQL中schema也就是database。

12) --query  使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。

13) --only-print 如果只想打印看看SQL语句是什么,可以用这个选项。

开始测试

[root@localhost ~] mysqlslap --user=root --password=lmx --host=127.0.0.1  
--concurrency=50 --iterations=200 
--query="insert into a1 values()" --create="create table a1(b int primary key AUTO_INCREMENT)"

mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
        Average number of seconds to run all queries: 0.116 seconds #运行所有语句的平均秒数
        Minimum number of seconds to run all queries: 0.105 seconds #运行所有语句的最小秒数
        Maximum number of seconds to run all queries: 0.144 seconds #运行所有语句的最大秒数
        Number of clients running queries: 50 #客户端数量
        Average number of queries per client: 1 #每个客户端运行查询的平均数

通过 iostat 可以观察到 binlog 所在的块设备 IO 发生饱和:

  1. dm-0 (/dev/mapper/dm-slow) 设备的 IO 出现了排队(aqu-sz),使用率饱和。
  2. loop3 是 dm-0 背后的块设备,其 IO 还有充足的能力,可证明 dm-0 带有 IO 延迟。
[root@localhost ~] yum -y install sysstat
[root@localhost ~]iostat -x 1 -p dm-0 -p loop3

在这里插入图片描述
通过 pt-ioprofile 观察 MySQL 的 IO 消耗时间

#时区和时间一定要对
[root@localhost ~] tar -zxvf percona-toolkit-3.7.0_x86_64.tar.gz 
[root@localhost ~] yum -y install perl strace
[root@localhost ~] cd percona-toolkit-3.7.0/bin/
[root@localhost bin]./pt-ioprofile

在这里插入图片描述

  • read:从文件中读出数据。要读取的文件用文件描述符标识,数据读入一个事先定义好的缓冲区。
  • write:把缓冲区的数据写入文件中。
  • pread:由于lseek和read调用之间,内核可能会临时挂起进程,所以对同步问题造成了问题,
    调用pread相当于顺序调用了lseek和read,这两个操作相当于一个捆绑的原子操作。
  • pwrite:由于lseek和write调用之间,内核可能会临时挂起进程,所以对同步问题造成了问题,
    调用pwrite相当于顺序调用了lseek 和write,这两个操作相当于一个捆绑的原子操作。
  • fsync:确保文件所有已修改的内容已经正确同步到硬盘上,该调用会阻塞等待直到设备报告IO完成。
  • filename:与磁盘交互的文件名称

结果:
我们制造了一个慢 IO 的设备,将 MySQL binlog 放在其中,制造了 binlog IO 慢的场景。有了这个手段,之后我们可以分析 MySQL 在局部文件 IO 慢时,哪些状态量会发生变化,以及 MySQL 会发生什么行为。

下篇给大家详细的讲解 DBA如何使用pt-ioprofile

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++--------继承

一、继承的基本概念 继承是 C 中的一个重要特性&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。 #include <iostream>// 基类 class Base…

Ubuntu24.04安装NVIDIA驱动及工具包

Ubuntu24.04安装NVIDIA驱动及工具包 安装nvidia显卡驱动安装cuda驱动安装cuDNN安装Anaconda 安装nvidia显卡驱动 NVIDIA 驱动程序&#xff08;NVIDIA Driver&#xff09;是专为 NVIDIA 图形处理单元&#xff08;GPU&#xff09;设计的软件&#xff0c;它充当操作系统与硬件之间…

探秘“香水的 ChatGPT”:AI 开启嗅觉奇幻之旅!

你没有看错&#xff0c;AI也能闻到味道了&#xff01;这是一家名为Osmo公司公布的信息&#xff0c;他们成功创造出了由AI生成的李子味道&#xff0c;快跟着小编一探究竟吧~ 【图片来源于网络&#xff0c;侵删】 Osmo公司的这项技术&#xff0c;通过分析香味的化学成分和人类嗅…

vue之axios基本使用

文章目录 1. axios 网络请求库2. axiosvue 1. axios 网络请求库 <body> <input type"button" value"get请求" class"get"> <input type"button" value"post请求" class"post"> <!-- 官网提供…

高通 ISP pipeline

目录 ISP理解&#xff1a; 1. IFE : Image front-end engine&#xff08;图像前端引擎&#xff09; 1.1 相关特点 1.2 IFE作用 2. BPS : Bayer processing segment&#xff08;拜耳加工段&#xff09; 2.1 相关特点 2.2 BPS基本概念 2.3 BPS与IFE区别&#xff1a; 3. …

Linux知识点回顾(期末提分篇)

前言&#xff1a;本篇文章为WK学子量身打造&#xff0c;其余读者也可根据题目进行巩固提升。 目录 前言&#xff1a;本篇文章为WK学子量身打造&#xff0c;其余读者也可根据题目进行巩固提升。 一、Linux的内核版本每一部分的含义 二、查看当前系统中所有用户的详细信息的文…

【图像处理lec10】图像压缩

目录 一、图像压缩基础 1、图像压缩的基本概念 2、数据冗余与压缩比 3、三种主要的数据冗余类型 4、保真度评估标准&#xff08;Fidelity Criteria&#xff09; 5、应用与实践 二、图像压缩模型 1、图像压缩模型概述 &#xff08;1&#xff09;压缩系统的结构 &#…

Java和Go语言的优劣势对比

文章目录 Java和Go语言的优劣势对比一、引言二、设计哲学与语法特性1、设计哲学2、语法特性 三、性能与内存管理1、性能2、内存管理和垃圾回收 四、并发编程模型五、使用示例1、Go语言示例代码2、Java语言示例代码 六、对比表格七、总结 Java和Go语言的优劣势对比 一、引言 在…

CH340系列芯片驱动电路·CH340系列芯片驱动!!!

目录 CH340基础知识 CH340常见类型 CH340引脚功能讲解 CH340驱动电路 CH340系列芯片数据手册 编写不易&#xff0c;仅供学习&#xff0c;请勿搬运&#xff0c;感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路降压芯片驱动电路详解-CSDN博客 ME62…

[Python3] Sanic中间件

在 Sanic 中&#xff0c;中间件&#xff08;middleware&#xff09;是指在请求和响应之间执行的代码。它们是一个非常强大的工具&#xff0c;用于处理请求的预处理、响应的后处理、全局错误处理、日志记录、认证、权限校验、跨域资源共享&#xff08;CORS&#xff09;等任务。中…

pikachu靶场搭建详细步骤

一、靶场下载 点我去下载 二、靶场安装 需要的环境&#xff1a; mysqlApaches&#xff08;直接使用小皮面板Phpstudy&#xff1a;https://www.xp.cn/&#xff09;&#xff0c;启动他们 设置网站&#xff0c;把靶场的路径对应过来 对应数据库的信息 由于没有核对数据库的信…

Goland 安装与使用

GoLand安装 官方网址&#xff1a; JetBrains GoLand&#xff1a;不只是 Go IDE 1. 进入官网&#xff0c;点击下载&#xff1a; ​ 2. 如下图一步步安装 ​ ​ ​ ​ ​ 3. 如下图一步步安装

计算属性 简写和 完整写法

计算属性渲染不加上括号 methods方法和computed属性区别&#xff1a; computed只计算一次&#xff0c;然后缓存&#xff0c;后续直接拿出来使用&#xff0c;而methods每次使用每次计算&#xff0c;不会缓存 计算属性完整写法&#xff1a; 既获取又设置 slice 截取 成绩案例 …

2024最新鸿蒙开发面试题合集(二)-HarmonyOS NEXT Release(API 12 Release)

上一篇面试题链接&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/144685078 1. 鸿蒙简单介绍和发展历程 HarmonyOS 是新一代的智能终端操作系统&#xff0c;为不同设备的智能化、互联与协同提供了统一的语言。带来简洁&#xff0c;流畅&#xff0c;连续&#xff0…

【C++】——精细化哈希表架构:理论与实践的综合分析

先找出你的能力在哪里&#xff0c;然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表&#xff1a;核心概念与引入 2. 哈希表的底层机制&#xff1a;原理与挑战 2.1 核心功能解析&#xff1a;效率与灵活性的平衡 2.2 哈希冲突的本质&#x…

修改 ssh 默认访问端口

Linux 最小化安装后默认带有 ssh 服务并正常运行&#xff0c;服务默认端口为“22”。为了确保访问网络的安全&#xff0c;很多用户的网络设备对“22”端口做了限制&#xff0c;这时我们需要修改 ssh 服务默认的端口。 此步骤建议直接在服务器上通过鼠标键盘操作 修改配置文件 …

HCIA-Access V2.5_6_3_GPON组网保护

Type B单归属保护 在PON网络中&#xff0c;从OLT到ONU,整个链路上只有一根光纤&#xff0c;如果光纤出现断裂&#xff0c;业务就会中断&#xff0c;如果断的是分支链路一般主要影响个别用户&#xff0c;一旦主干光纤出现问题&#xff0c;PON口下所有的用户都会造成中断&#xf…

Mybatis-Plus中的Page方法出现Records的值大于0但是total的值一直是0

最近在学习mybatis-plus的时候&#xff0c;做分页查询&#xff0c;出现了一个诡异的情况&#xff0c;就是 Records的值大于0但是total的值一直是0&#xff0c;经过一顿百度之后发现&#xff0c;是缺少了一个分页的bean 加上这个配置类就好了&#xff0c;网上说这是个分页的插件…

Docker 安装mysql ,redis,nacos

一、Mysql 一、Docker安装Mysql 1、启动Docker 启动&#xff1a;sudo systemctl start dockerservice docker start 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 2、查询mysql docker search mysql 3、安装mysql 3.1.默认拉取最新版…

从 Coding (Jenkinsfile) 到 Docker:全流程自动化部署 Spring Boot 实战指南(简化篇)

前言 本文记录使用 Coding (以 Jenkinsfile 为核心) 和 Docker 部署 Springboot 项目的过程&#xff0c;分享设置细节和一些注意问题。 1. 配置服务器环境 在实施此过程前&#xff0c;确保服务器已配置好 Docker、MySQL 和 Redis&#xff0c;可参考下列链接进行操作&#xff1…