测试MySQL服务器性能

测试的目的

希望了解当前MySQL Server的下面两个重要的性能指标

  • MySQL Server的并发处理能力
  • 磁盘IO
  • CPU
  • 内存

工具

  • MySQL发行版自带了一个测试程序`mysqlslap`。
  • sysbench是一款开源的测试工具
  • sysstat提供的命令`iostat`可以读取磁盘读写性能数据,便于统计分析磁盘IO
  • 使用GNUPlot 对数据进行作图

命令iostat说明

命令iostat会读取文件”/proc/diskstat‘中关于磁盘的数据[1]

iostat -kxd /dev/sda5
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda5              0.01     1.36    0.54    5.43     3.72   149.66    51.39     0.03    4.58    5.17    4.53   2.05   1.22

参数说明

参数 说明
rrqm/s 每秒中处于队列中的写操作请求数目
wrqm/s 每秒中处于队列中的读操作请求数目
r/s 每秒完成的写操作请求数目
w/s 每秒完成的读操作请求数目
rsec/s (rkB/s, rMB/s) 每秒从设备读取了多少数据(不同一列名,单位分别为sections, Kb, Mb)
rsec/s (wkB/s, wMB/s) 每秒向设备写入了多少数据(不同一列名,单位分别为sections, Kb, Mb)
avgrq-sz 向设备请求的平均大小(单位为sectors)
avgqu-sz 向设备请求的平均队列长度
await I/O的平均等待时间(从发出请求到IO操作完成)。包括I/O排队时间和I/O操作时间
r_await 读操作的平均等待时间(从发出请求到IO操作完成)。包括I/O排队时间和I/O操作时间
w_await 写操作的平均等待时间(从发出请求到IO操作完成)。包括I/O排队时间和I/O操作时间
svctm I/O操作执行的平均耗时。(此字段不可信)
%util 设备处理I/O请求时消耗的CPU时间百分比。这个值接近100%时说明设备处于満负荷工作状态

命令mysqlslap说明

mysqlslap有以下常用参数[2]:

  • -a | –auto-generate-sql 自动产生测试SQL
  • –defaults-file,配置文件存放位置
  • -c | –concurrency <int> 并发数
  • -i | –iterations <int> 迭代的实验次数

另外一些更为高级的控制:

  • –engines,引擎
  • –auto-generate-sql-load-type,测试SQL的类型。类型有mixed,update,write,key, read。
  • –number-of-queries,执行的SQL总数量
  • –number-int-cols,表内int列的数量
  • –number-char-cols,表内char列的数量
  • –socket,socket文件位置

低并发时的性能

最近看到一篇BLOG”Why MySQL Performance at Low Concurrency is Important“,其主要观点是:

  • 并发数为1时,MySQL Server的性能参数是重要的基准参数,因为1个并发时,MySQL Server不会启用多个进程并行的执行请求。在其它不同并发级别的响应时间可以与单并发的数据进行对比,以观察并发数对响应时间的响应,以及如何系统有效的提高并发性的尺度和各并发级别的响应时间。
  • 在许多情况下,MySQL的操作都是在单线程情况下进行的。如批处理操作都被设计为单线程的,MySQL的复制操作也是单线程的(5.6引入了一定的并行复制能力);大部分的MySQL维护操作,如alter table都是单线程运行的。
  • 更为重要的是,你的系统大部分时间都是在低负载下运行的。在一个正常运行的系统上系统中MySQL的线程数平均为5个或者更少,当发现系统并发数较高时,系统一般都处于过载状态。
  • 只关注高并发时的性能有什么问题呢?它可能会误导你对产品的判断。例如:一个系统在低并发时响应时间相对较长,而在高并发时明显快很多(这是一种典型案例)。如果只关注高并发时的性能,你可能不能很好的理解为什么在真实的低并发环境中性能更差。

高并发时的性能

同一个作者的另篇Blog介绍了为什么MySQL Server在高并发时的性能很重要。简言之:

虽然正常运行情况下,系统处于低并发或中并发情形下,不过当系统因为某些原因处理速度稍慢一点点(几十毫秒),需要处理的请求就会大量堆积,如果并发处理能力强,则可以顺利的挺过,系统也会快速恢复正常;如果并发处理能量差,则堆积的请求数将越来越多,最终影响用户体验,甚至导致系统崩溃必须重启。

附录

衡量性能的指标