测试MySQL服务器性能¶
工具¶
- 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个或者更少,当发现系统并发数较高时,系统一般都处于过载状态。
- 只关注高并发时的性能有什么问题呢?它可能会误导你对产品的判断。例如:一个系统在低并发时响应时间相对较长,而在高并发时明显快很多(这是一种典型案例)。如果只关注高并发时的性能,你可能不能很好的理解为什么在真实的低并发环境中性能更差。