MySQL性能调优与诊断

* 本篇随笔为《涂抹MySQL》一书的阅读摘抄,详细请查看正版书籍

 关键性指标

IOPS(Input/Output operations Per Second)

每秒处理的I/O请求次数

需要说明的一点,通常提到磁盘读写能力,比如形容它每秒读300M写200M这个说的是数据吞吐量(I/O能力的另一个关键指标),但是IOPS指的不是数据吞吐量,它指的是每秒能够处理的I/O请求次数。什么是一次I/O请求呢?举个例子:读写100M的文件就是一次I/O请求,写入1B的数据也是一次I/O请求。IOPS指标越高,那么单位时间内能够响应的请求自然也就越多。从理论上来讲,只要系统实际的请求数低于IOPS能力,就相当于每一个请求都能及时得到响应,那么I/O就不会是瓶颈了。如果想I/O系统的响应够快那么IOPS越高越好。IOPS指标比较高的话,就更适合要求快速响应的系统,尤其是对于短连接、小事务、轻量数据位操作特点的OLTP系统,当然吞吐量也很重要,但 吞吐量对于磁盘性能来说基本是个确定的值,没有讨论空间。

传统磁盘完成一个I/O请求所花费的时间受3个方面因素影响

  1. 寻道时间(Tseek):将磁头移动到数据所在的磁道上所需要的时间,通常都在3-15毫秒
  2. 旋转延迟时间(Trotation):将盘片旋转,使所请求的数据所在扇区移动至磁头下方所需要的时间,这个时间跟磁盘的转速密切相关,转速越快延迟越短,一般15000转的磁盘平均旋转延迟为2ms
  3. 数据传输时间(Transfer):完成传输所请求的数据所需要的时间。数据传输时间跟要传输的数据量密切相关,而传输数据块又与吞吐量密切相关。

假定数据要传输的数据量很小或者吞吐量极高,数据能在瞬间完成(忽略数据传输时间)。那么可以计算出理论上最大的IOPS,计算公式为:

IOPS=1000ms/(寻道时间+旋转延迟时间)基于这个公式计算的话单块SAS 15k转的磁盘,其最大IOPS=1000/(3+2)=200个每秒。这是理论上的最大值。

要提高IOPS,目前来看基本就是拼硬件,传统方案使用多块磁盘通过RAID条带后使IO读写能力获得提升。比如我们希望IOPS达到5000,那么理论上就需要5000/200=25块磁盘组成RAID0来实现。

RAID5每个写IO操作时间将产生4次IO,若使用RAID5条带后的存储系统写入时IOPS能达到5000个/s,那么至少需要4x5000/200=100块磁盘,实际上极少会存在纯写而不读取的系统,更多都是读写平均或者读都写少。

假如仍然是套RAID5条带过的存储系统,平均下来系统有1/3时间在做写入操作,2/3座读取操作那么实际需要的磁盘数就可能变为(2/3x5000+4x1/3x5000)/200约需要50块磁盘。总之不管是吞吐量还是IOPS组RAID时磁盘数移动要留足富裕。

扫描二维码关注公众号,回复: 5706923 查看本文章

QPS(Query Per Second)

每秒请求(查询)次数:

  可在mysql命令行下输入status或者通过mysqladmin附加status参数都能查到QPS指标
  QPS=Questions/Uptime,不过这个Uptime一般使我们自己定义的时间段

TPS(Transaction Per Second)

每秒事务数:

  TPS=(Com_commit+Com_rollback)/Seconds Seconds是我们定义的时间间隔,如果换成Uptime就是该mysql实例在本次生命周期的平均TPS

获取关键性能指标 

前面提到三个性能指标,IOPS先被跳过, 这个纯硬件的指标, 尽管对DB性能的影响关系重大, 不过硬件因素通常不是由dba能左右的, 所以我们这里重点关注QPS和TPS, 字系统资源层面, 我们重点关注CPU占用情况 , 也就是说,我们会重点统计CPU和QPS, 如果能统计到TPS(对象使用了支持事务的存储引擎), 那就顺道将TPS指标也收集一下.

手动获取性能指标:

先来获取QPS指标,按照前面所说,我们只要获取状态变量Questions的值即可, 

mysql> show global status like 'Questions';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Questions     | 3162  |
+---------------+-------+
1 row in set (0.03 sec)

自动获取性能指标:

利用mysqladmin来实现自动获取, 操作如下

$ mysqladmin -h 127.0.0.1 extended-status -r -i 1|grep 'Questions'

这条命令便是每隔一秒获取Questions的参数值, 这下定时输出的需求就算满足了, 而且更好的是, -r参数能够自动将状态变量本次输出的参数值与前次参数值相减, 输出两者之间的差值, 也就是说 这个名为我们输出的信息,就是该mysql实例的QPS

通过mysqladmin命令, 还能获取MySQL实例美妙查询, 更新 ,删除数据等指标,如美妙select,update数量:

$ mysqladmin -h 127.0.0.1 extended-status -r -i 1 |grep -E "Com_select|Com_updaate"

第一个问题解决了, 再拉看第二个问题, 怎么快速为数据库布置多项作业, 对此, 我们也可利用现成的MySQL命令行工具, mysqlslap, 一款mysql自带的专用轻量级压测工具

提示:

  在执行mysqlslap命令期间, mysqladmin命令仍需在运行, 否则就看不到它的输出了,

$ mysqlslap -h 127.0.0.1 --query='select user,host from mysql.user' --number-of-queries=100000 -c 30 -i 10 --create-schema-jssdb
  • --number-of-queries 指定测试要执行的查询语句
  • -c, -concurrency 指定测试执行请求的并行度
  • -i, --iterations 指定测试运行的次数
  • --create-schema 指定此次测试在哪个schema下执行
  • 这条命令翻译过来就是 指定在jssdb库下, 模拟30个用户连接,共执行100万次请求 

mysqlslap命令功能很强大,它在自动测试方面还有很多可配置的参数,这里就不详细介绍了

TPCC测试

TPC 全称[T]ransaction [Processing] Performance [C]ouncil

  是一家非盈利性组织,该组织制定各种商业应用的基准测试规范,任意厂商或个人, 都可以按照其规范里开发自己的应用程序

TPC-C:

  TPC-C是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业务处理系统。1992年7月发布。几乎所有在OLTP市场提供软硬平台的国外主流厂商都发布了相应的TPC-C测试结果,随着计算机技术的不断发展,这些测试结果也在不断刷新。

TPCC-MYSQL: 

tpcc-mysql是一套用于MySQL基准测试的程序,由percona基于TPC-C(下面简写成TPCC)衍生出来的产品。我们测试基本都用这一套程序, 详细使用方式这里就不作介绍了

猜你喜欢

转载自www.cnblogs.com/qq752059037/p/10620923.html