怎么模仿磁盘 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.
BenchmarkAverage 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 ~] 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

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

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

相关文章

1.微服务灰度发布(方案设计)

前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响现有用户的情况下,逐步将新版本的服务部署到生产环境的策略。通过灰度发布,你可以先将新版本的服务暴露给一小部分用户或特定的流量,观察其…

【开源免费】基于SpringBoot+Vue.JS安康旅游网站(JAVA毕业设计)

本文项目编号 T 098 ,文末自助获取源码 \color{red}{T098,文末自助获取源码} T098,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

基于SpringBoot的4S店汽车销售管理系统的设计与实现

一、课题背景 为汽车销售公司设计了一个汽车管理系统 技术:前台采用网页技术,后端采用SpringBoottMybatistvue 项目 描述:随着人们生活水平的不断提高,人们对汽车的消费和需求也越来越旺盛。多汽车销售公司仍然采用人工记账的传…

电子应用设计方案72:智能扫地机器人系统设计

智能扫地机器人系统设计 一、引言 智能扫地机器人作为现代智能家居的重要组成部分,旨在为用户提供便捷、高效的地面清洁服务。本设计方案将详细阐述智能扫地机器人的系统架构、功能模块及实现方式。 二、系统概述 1. 系统目标 - 自主规划清扫路径,覆盖…

路由策略

控制层流量 --- 路由协议传递路由信息时产生的流量 数据层流量 --- 设备访问目标地址时产生的流量 所谓的路由策略----在控制层面转发流量的过程中,截取流量,之后修改流量再转发或不转发的技术,最终达到影响路由器路由表的生成&#xff0c…

【CSS in Depth 2 精译_095】16.3:深入理解 CSS 动画(animation)的性能

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

数据之林的守护者:二叉搜索树的诗意旅程

文章目录 前言一. 二叉搜索树的概念1.1 二叉搜索树的定义1.1.1 为什么使用二叉搜索树? 二. 二叉搜索树的性能分析2.1 最佳与最差情况2.1.1 最佳情况2.1.2 最差情况 2.2 平衡树的优势 三.二叉搜索树的基本操作实现3.1.1 详细示例3.1.2 循环实现插入操作3.1.2.1 逻辑解…

利索能及 ▏外观专利相似度多少算侵权?

判断是否侵权前提: 双方产品属于同类产品,不属于同类产品的不能比较。 判定同类产品不仅仅要依据《国际外观设计分类表》,还要依据一般商品商品的分类标准来却确定。 简单概括来说,判定侵权前提就是被控侵权产品和外观设计专利…

【编译原理】往年题汇总(山东大学软件学院用)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀编译原理_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

适用于Synology NAS的在线办公套件:ONLYOFFICE安装指南

使用 Synology NAS 上的 ONLYOFFICE 文档,您能在私有云中直接编辑文本文档、电子表格、演示文稿和 PDF,确保工作流程既安全又高效。本指南将分步介绍如何在 Synology 上安装 ONLYOFFICE 文档。 关于 Synology Synology NAS(网络附加存储&…

SpringbBoot如何实现Tomcat集群的会话管理

在使用 Tomcat 集群时,由于每个 Tomcat 实例的 Session 存储是独立的,导致无法实现 Session 的共享,这可能影响到用户跨节点的访问。为了实现跨 Tomcat 实例共享 Session,可以使用 Spring Session 配合 Redis 进行集中式会话管理。…

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系: rl命名空间下,主要有八大模块。 搞定VS后将逐个拆解。 1、编译运行 根据报错提示,配置相应错误的库(根据每个人安装位置不同而不同,我的路径如下:) 编译所有,Release版本耗时大约10分钟。 以rlPlan运动…

零基础微信小程序开发——页面导航之声明式导航(保姆级教程+超详细)

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…

Ch9 形态学图像处理

Ch9 形态学图像处理 blog点此处&#xff01;<--------- 四大算子相应性质。 腐蚀、膨胀、开闭之间的含义、关系 文章目录 Ch9 形态学图像处理预备知识(Preliminaries)膨胀和腐蚀(Dilation and Erosion)腐蚀膨胀膨胀与腐蚀的对偶关系 开闭操作(Opening and Closing)开运算闭…

【UE5 C++课程系列笔记】14——GameInstanceSubsystem与动态多播的简单结合使用

效果 通过在关卡蓝图中触发GameInstanceSubsystem包含的委托&#xff0c;来触发所有绑定到这个委托的事件&#xff0c;从而实现跨蓝图通信。 步骤 1. 新建一个C类 这里命名为“SubsystemAndDelegate” 引入GameInstanceSubsystem.h&#xff0c;让“SubsystemAndDelegate”继承…

实战举例——vue.js组件开发

有很多人在问有关Vue的组件开发&#xff0c;虽然之前我的文章里讲过关于前端组件开发的例子&#xff0c;不过作为一个前端技术小白&#xff0c;还是有很多内容需要学习和巩固。我这里用我之前开发过的组件举例&#xff0c;再次为大家简单分享一下基于Vue2和elementUI开发的组件…

devops和ICCID简介

Devops DevOps&#xff08;Development 和 Operations 的组合&#xff09;是一种软件开发和 IT 运维的哲学&#xff0c;旨在促进开发、技术运营和质量保障&#xff08;QA&#xff09;部门之间的沟通、协作与整合。它强调自动化流程&#xff0c;持续集成&#xff08;CI&#xf…

设计宝藏解压密码

设计宝藏官网的解压密码是多少&#xff1f; 设计宝藏解压密码是&#xff1a;memm 设计宝藏一个致力于提供免费资源的宝藏网站。 无论你是Blender、After Effects (AE)、Cinema 4D (C4D)、Premiere Pro (PR)、Photoshop (PS)、Illustrator (AI)的爱好者&#xff0c;还是对CG影…

Android OpenGLES2.0开发(十):FBO离屏渲染

人生是一场单程的旅行&#xff0c;即使有些遗憾我们也没有从头再来的机会&#xff0c;与其纠结无法改变的过去不如微笑着珍惜未来。 Android OpenGLES开发&#xff1a;EGL环境搭建Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始Android OpenGLES2.0…

Magnet: 基于推送的大规模数据处理Shuffle服务

本文翻译自&#xff1a;《Magnet: Push-based Shuffle Service for Large-scale Data Processing》 摘要 在过去的十年中&#xff0c;Apache Spark 已成为大规模数据处理的流行计算引擎。与其他基于 MapReduce 计算范式的计算引擎一样&#xff0c;随机Shuffle操作&#xff08;即…