《高性能MySQL》笔记二:MySQL基准测试、服务器性能剖析


《高性能MySQL》笔记二:MySQL基准测试、服务器性能剖析

为什么需要基准测试?基准测试是唯一方便有效的,可以学习系统在给定工作负载下会发生什么的方法。与真实压力相比比较简单,要尽可能快地执行测试。

第二章、基准测试

1. 基准测试策略

基准测试的策略:整体测试(集成式基准测试)、单独测试(单组件式基准测试)。

集成式测试

  • 整个应用。
  • MySQL并非总是应用瓶颈。
  • 各部分缓存的影响。
  • 应用的真实表现。

只测试MySQL

  • 需要比较不同的schema或查询的性能。
  • 针对应用具体问题的测试。
  • 短期基准测试快速周期循环,检测调整的效果。

测试指标

  • 吞吐量:单位时间内的事务处理数。如TPC-C。常用测试单位每秒事务数TPS。
  • 响应时间或延迟
  • 并发性。一个web站点,可能有50000个用户访问,却只有10个并发请求到数据库。
  • 可扩展性。如给系统增加一倍的资源,就可以获得两倍的吞吐量。

2. 基准测试方法

常见错误:数据子集、错误数据分布、只做单用户、行为不匹配、反复查询同一个、没有错误检测、忽略了系统预热、使用默认的服务器配置、测试时间太短。

设计和规划:提出问题明确目标,决定是采用标准测试还是设计专用测试。

运行多长时间:足够长时间,如观察磁盘读和写吞吐量时序图,直到确认系统稳定。

获取系统性能和状态:为每一轮测试创建单独目录,保存相关结果和说明。

获取准确的测试结果。然后运行基准测试并分析结果,绘图也很重要。

3. 基准测试工具

ab:apach http服务器基准测试工具,测试http服务器每秒能够处理多少请求。

http_load

JMeter

单组件测试工具

mysqlslap:模拟服务器负载,输出计时信息。

mysql bench suite:单线程,主要测试服务器执行查询的速度。

super smack

database test suite

percona's TPCC-MySQL Tool:书作者自己写的

sysbench:多线程系统压测工具,可以根据影响服务器性能的各种因素来评估系统的性能。

MySQL的BENCHMARK函数,可以用来测试某些特定操作的执行速度。

mysql> SET @input := "leiyadi";
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT BENCHMARK(1000000,MD5(@input));
+--------------------------------+
| BENCHMARK(1000000,MD5(@input)) |
+--------------------------------+
|                              0 |
+--------------------------------+
1 row in set (0.24 sec)

mysql> SELECT BENCHMARK(1000000,SHA1(@input));
+---------------------------------+
| BENCHMARK(1000000,SHA1(@input)) |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.42 sec)

第三章、服务器性能剖析

本章将性能定义为完成一个任务所需要的时间。

CPU利用率上升了,可能是对资源的利用率上升了,能加快查询速度,也可能是出bug了。

要降低响应时间,首先就要测量时间花在什么地方。

性能剖析一般两个步骤:测量任务所花费时间、对结果进行排序。

类型:基于执行时间的分析(什么任务执行时间最长)、基于等待的分析(哪里阻塞最久)。

一些注意事项

  • 占总响应时间比重很小的查询不值得优化;成本大于收益、停止优化。

  • 没有显式要优化的也要优化,如执行次数少但每次都特别慢的任务

性能瓶颈的影响因素

  • 外部资源,调用外部web服务或搜索引擎

  • 应用需要处理大量数据,分析一个超大的xml文件

  • 循环中执行昂贵的操作:滥用正则

  • 使用低效的算法:暴力搜索算法