参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/optimize-benchmarking.html
要衡量性能,请考虑以下因素:
8.13.1 测量表达式和函数的速度
要测量特定MySQL表达式或函数的速度,请使用mysql客户端程序调用BENCHMARK()函数。 它的语法是BENCHMARK(loop_count,表达式)。 返回值总是为零,但mysql打印一行显示语句执行的时间。 例如:
mysql> SELECT BENCHMARK(1000000,1+1);
+------------------------+
| BENCHMARK(1000000,1+1) |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.32 sec)
这个结果是在Pentium II 400MHz系统上获得的。 它表明MySQL可以在0.32秒内在该系统上执行1,000,000个简单的附加表达式。
内置的MySQL函数通常是高度优化的,但可能会有一些例外。 BENCHMARK()是一个很好的工具,用于查找某些函数是否是您查询的问题所在。
8.13.2 使用你自己的基准
基准您的应用程序和数据库,找出瓶颈所在。 在修复了一个瓶颈之后(或者用一个“虚拟”模块替换它),您可以继续确定下一个瓶颈。 即使您的应用程序的整体性能目前是可以接受的,您至少应该为每个瓶颈制定一个计划,并决定如果有一天您真的需要额外的性能如何解决它。
免费的基准测试套件是开放源代码数据库基准测试版,可在
http://osdb.sourceforge.net/. 找到
只有当系统负载很重时,才会出现问题,这很常见。 在大多数情况下,性能问题是由于基本的数据库设计问题(例如,表扫描在高负载下不好)或操作系统或库问题。 大多数情况下,如果系统尚未投入生产,这些问题将更容易解决。
为了避免这样的问题,请在最坏的负载下对整个应用程序进行基准测试:
这些程序或软件包可能会使系统瘫痪,因此请务必仅在您的开发系统上使用它们。
8.13.3 使用performance_schema测量性能
您可以查询performance_schema数据库中的表以查看有关服务器性能特征及其运行的应用程序的实时信息。
sysbench
吞吐量,TPCC,一般测试单位是TPS(每秒事务数),TPM(每分钟事务数)。
https://github.com/akopytov/sysbench#linux
linux下安装:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | bash
yum -y install sysbench
安装成功,查看版本:
sysbench --version
sysbench --test=cpu --cpu-max-prime=20000 run
--cpu-max-prime:计算最大的上限值
(默认是10000,计算从1-10000 中的素数,计算1万次)
--threads: 线程数 默认是1,只启用1个线程
--time:运行时长,默认是10s
在单位事件里完成的次数最多,性能就最好 比如配合--cpu-max-prime=3,则表示第一轮算得3个素数,
如果时间还有剩就再进行一轮素数计算,直到时间耗尽。
每完成一轮就叫一个event
--events: event上限次数
- 若设置为100,则表示当完成100次event后,即使时间还有剩,也停止运行
- 默认值为0,则表示不限event次数
- 相同event次数,比较的是谁用时更少
如果有2台服务器进行CPU性能对比,当素数上限和线程数一致时:
sysbench 1.0.9 (using system LuaJIT 2.0.4)
Running the test with following options:
Number of threads: 2 // 指定线程数为2
Initializing random number generator from current time
Prime numbers limit: 20000 // 每个线程产生的素数上限均为2万个
Initializing worker threads...
Threads started!
CPU speed:
events per second: 650.74 // 所有线程每秒完成了650.74次event
General statistics:
total time: 10.0017s // 共耗时10秒
total number of events: 6510 // 10秒内所有线程一共完成了6510次event
Latency (ms):
min: 3.03 // 完成1次event的最少耗时3.03秒
avg: 3.07 // 所有event的平均耗时3.07毫秒
max: 3.27 // 完成1次event的最多耗时3.27毫秒
95th percentile: 3.13 // 95%次event在3.13秒毫秒内完成
sum: 19999.91 // 每个线程耗时10秒,2个线程叠加耗时就是20秒
Threads fairness:
events (avg/stddev): 3255.0000/44.00 // 平均每个线程完成3255次event,标准差为44
execution time (avg/stddev): 10.0000/0.00 // 每个线程平均耗时10秒,标准差为0
测试I/O
sysbench --test=fileio help
--file-num 生成测试文件的数量,默认是128
--file-block-size 测试期间文件块的大小,如果你想磁盘针对InnoDB存储引擎进行测试, 可以将其设置为16384,即InnoDB存储引擎的大小,默认是16384
--file-total-size 每个文件的大小,默认是2GB
--file-test-mode 文件测试模式,包含seqwr(顺序写)、seqrewr(顺序读写)、seqrd(顺序读)、rndrd(随即读)、rndwr(随机写)、rndrw(随机读写)
--file-io-mode 文件操作模式,同步还是异步,默认是同步
--file-fsync-all 每执行完一次写操作,就执行一次fsync,默认是off
sysbench的fileio测试需要经过prepare、run、clean三个阶段,prepare是准备阶段,生成我们需要的测试文件,run是实际测试阶段,cleanup是清理测试产生的文件
第一步是生成测试使用的数据文件:
sysbench --test=fileio --file-total-size=150G prepare
--默认会生成128个文件
第二步测试:
sysbench --test=fileio --file-total-size=150G --file-test-mode=rndrw --max-time=300 --max-requests=0 run
File operations:
reads/s: 146.83
writes/s: 97.89
fsyncs/s: 313.17
Throughput:
read, MiB/s: 2.29
written, MiB/s: 1.53
General statistics:
total time: 300.0015s
total number of events: 167370
Latency (ms):
min: 0.00
avg: 1.79
max: 2141.14
95th percentile: 1.89
sum: 299809.87
Threads fairness:
events (avg/stddev): 167370.0000/0.00
execution time (avg/stddev): 299.8099/0.00
最后清理文件:
sysbench --test=fileio --file-total-size=150G cleanup
sysbech的OLTP基准测试
find / -name oltp.lua -print
/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua
创建测试数据库:
create database test;
准备数据:
sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=127.0.0.1 --mysql-port=3306= --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=test --db-driver=mysql --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=100000 --threads=100 --time=300 --report-interval=10 prepare
执行测试:
把 prepare 换成 run
sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=127.0.0.1 --mysql-port=3306= --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=test --db-driver=mysql --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=100000 --threads=100 --time=300 --report-interval=10 run >> sysbench.log
最后清理数据:
sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=127.0.0.1 --mysql-port=3306= --mysql-user=root --mysql-password=MyNewPass4! --mysql-db=test --db-driver=mysql --oltp-tables-count=10 cleanup
--其实就是删表,直接drop database test 完事
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3128986/ ,如需转载,请注明出处,否则将追究法律责任。