高性能mysql阅读笔记(二)MySQL基准测试
测试指标
1.吞吐量
在数据库中,吞吐量指的是单位时间内的事务处理数,单位是TPS(每秒事务数)
2.响应时间
通常使用百分比响应时间,如95%5ms
3.并发性
并发性基准测试需要关注的是正在工作中的并发操作,或者是同时工作中的线程数或者连接数。当并发性增加时,需要测量吞吐量是否下降,响应时间是否变长,如果是这样,应用可能就无法处理峰值压力。
4.可拓展性
可拓展性指的是,可系统增加一倍的工作,在理想情况下能得到两倍的吞吐量,用于发现应用的瓶颈。
测试工具
测试工具分为两种:集成式测试和单组件测试,前者用于对整个应用进行测试,后者用对专门对mysql或其他组件进行单独测试。
集成式测试工具
ab
是一个Apache HTTP服务器基准测试工具。它可以测试HTTP服务器每秒最多可以处理多少请求。如果测试的是Web应用服务,这个结果可以转换成整个应用每秒可以满足多少请求。这是个非常简单的工具,用途也有限,只能针对单个URL进行尽可能快的压力测试。http://httpd.apache.org/docs/2.0/programs/ab.html。
http_load
比ab要更加灵活。可以通过一个输入文件提供多个URL,http_load在这些URL中随机选择进行测试。也可以定制http_load,使其按照时间比率进行测试,而不仅仅是测试最大请求处理能力。http://www.acme.com/software/http-load/。
JMeter
学java的小伙伴应该比较熟悉,JMeterkeyiyonglaiceshi进行web应用的性能测试,也可以用来测试ftp服务器和数据库查询测试等。
jmeter比以上两种复杂得多,可以自己创建数据集进行测试,其内还自带可视化功能。http://jakarta.apache.org/jmeter/
单组件测试工具
mysqlslap
可以模拟服务器的负载,并输出计时信息。它包含在MySQL 5.1的发行包中,应该在MySQL 4.1或者更新的版本中都可以使用。测试时可以执行并发连接数,并指定SQL语句(可以在命令行上执行,也可以把SQL语句写入到参数文件中)。如果没有指定SQL语句,mysqlslap会自动生成查询schema的SELECT语句。
MySQL Benchmark Suite
MySQL Benchmark Suite中也提供了基准测试套件,但它是单用户模式的,测试的数据集很小且用户无法使用指定的数据,并且同一个测试多次运行的结果可能会相差很大。
sysbench
是一款多线程系统压测工具。它可以根据影响数据库服务器性能的各种因素来评估系统的性能。例如,可以用来测试文件I/O、操作系统调度器、内存分配和传输速度、POSIX线程,以及数据库服务器等。
测试实战
sysbench
因为博主的环境跟书中的环境已经不一样了,所以这里我们自己来使用sysbench进行测试
- 安装
Ubuntu中可以直接apt安装sysbench
apt-get install sysbench
- 测试cpu
sysbench --test=cpu --cpu-max-prime=2000 run # cpu-max-prime为最大质数发生器数量。默认是10000
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Doing CPU performance benchmark
Threads started!
Done.
Maximum prime number checked in CPU test: 2000
Test execution summary:
total time: 0.9848s // 花费时间
total number of events: 10000 // 事件数量
total time taken by event execution: 0.9839 // 事件执行花费的时间
per-request statistics: // 请求的统计
min: 0.09ms
avg: 0.10ms
max: 0.15ms
approx. 95 percentile: 0.10ms
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 0.9839/0.00
- 测试线程
sysbench --test=threads --num-threads=500 --thread-yields=100 --thread-locks=4 run # 500个线程 每个线程处理100个请求 每个线程有4个锁
Test execution summary:
total time: 1.1393s
total number of events: 10000
total time taken by event execution: 553.1746
per-request statistics:
min: 0.04ms
avg: 55.32ms
max: 601.60ms
approx. 95 percentile: 216.16ms
Threads fairness:
events (avg/stddev): 20.0000/6.30
execution time (avg/stddev): 1.1063/0.01
- 测试数据库
终于来到数据库的测试了,sysbench其实还提供了内存,IO,互斥的测试,这里就不一一测试了。
测试关系型数据库有三个阶段
1.准备生成测试表
sysbench --test=oltp --mysql-table-engine=innodb --mysql-host=127.0.0.1 --mysql-db=test --oltp-table-size=500000 --mysql-user=root --mysql-password=123 prepare
请事先创建一个test数据库,然后我们可以看到test数据库中多了一个500000行的sbtest表。
2.测试
sysbench --num-threads=16 --test=oltp --mysql-table-engine=innodb --mysql-host=127.0.0.1 --mysql-db=test --oltp-table-size=500000 --mysql-user=root --mysql-password=123 run
可以看到测试结果:
OLTP test statistics:
queries performed: // 进行的读写操作
read: 140000
write: 50000
other: 20000
total: 210000
transactions: 10000 (588.53 per sec.) // 事务总数量(每秒执行的事务数)
deadlocks: 0 (0.00 per sec.) // 死锁
read/write requests: 190000 (11181.99 per sec.)
other operations: 20000 (1177.05 per sec.)
Test execution summary:
total time: 16.9916s // 花费的时间
total number of events: 10000
total time taken by event execution: 271.7623
per-request statistics:
min: 4.10ms
avg: 27.18ms
max: 114.43ms
approx. 95 percentile: 66.86ms // 95%的事件都花费了66.86ms以上的时间
Threads fairness:
events (avg/stddev): 625.0000/7.91
execution time (avg/stddev): 16.9851/0.00
3.清理测试表
sysbench --num-threads=16 --test=oltp --mysql-table-engine=innodb --mysql-host=127.0.0.1 --mysql-db=test --oltp-table-size=500000 --mysql-user=root --mysql-password=123 cleanup