ITPub博客

首页 > 数据库 > > 8.13 性能测试

8.13 性能测试

作者:飘絮絮絮丶 时间:2020-05-11 10:47:53 0 删除 编辑

参考官方文档:

dev.mysql.com/doc/refma


要衡量性能,请考虑以下因素:


  • 无论您是在安静的系统上测量单个操作的速度,还是在一段时间内一组操作(“工作负载”)的工作方式。 通过简单的测试,您通常会测试如何更改一个方面(配置设置,表中的一组索引,查询中的SQL子句)会影响性能。 基准测试通常是长时间运行和精心设计的性能测试,其结果可能决定高级选择,如硬件和存储配置,或者多久升级到新的MySQL版本。
  • 对于基准测试,有时您必须模拟繁重的数据库工作负载才能获得准确的图像。
  • 性能可能因许多不同因素而异,几个百分点的差异可能不是决定性的胜利。 当您在不同的环境中测试时,结果可能会相反。
  • 取决于工作负载,某些MySQL特性有助于或无助于提高性能。 为了保持完整性,请始终在打开和关闭这些特性的情况下测试性能。 对每个工作负载尝试的两个最重要的特性是MySQL查询缓存和InnoDB表的自适应哈希索引。


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 使用你自己的基准

基准您的应用程序和数据库,找出瓶颈所在。 在修复了一个瓶颈之后(或者用一个“虚拟”模块替换它),您可以继续确定下一个瓶颈。 即使您的应用程序的整体性能目前是可以接受的,您至少应该为每个瓶颈制定一个计划,并决定如果有一天您真的需要额外的性能如何解决它。

免费的基准测试套件是开放源代码数据库基准测试版,可在

osdb.sourceforge.net/. 找到


只有当系统负载很重时,才会出现问题,这很常见。 在大多数情况下,性能问题是由于基本的数据库设计问题(例如,表扫描在高负载下不好)或操作系统或库问题。 大多数情况下,如果系统尚未投入生产,这些问题将更容易解决。


为了避免这样的问题,请在最坏的负载下对整个应用程序进行基准测试:



这些程序或软件包可能会使系统瘫痪,因此请务必仅在您的开发系统上使用它们。


8.13.3 使用performance_schema测量性能


您可以查询performance_schema数据库中的表以查看有关服务器性能特征及其运行的应用程序的实时信息。


sysbench


吞吐量,TPCC,一般测试单位是TPS(每秒事务数),TPM(每分钟事务数)。


github.com/akopytov/sys


linux下安装:

curl -s packagecloud.io/install | 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性能对比,当素数上限和线程数一致时:

  • 相同时间,比较event
  • 相同event,比较时间
  • 时间和event都相同,比较stddev(标准差)


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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42274