mysql基准测试与性能分析

一、基准测试

基准测试的作用:
  • 了解当前系统的性能,建立MySQL服务器性能基准线(为之后的性能优化提供一个超始线)
  • 模拟比当前系统更高的负载,找出系统的扩展瓶颈,为系统扩展与优化提供参考条件
  • 测试不同的硬件、软件和操作系统配置
  • 证明新的硬件设备是否配置正确和是否是最优配置
基准测试可以分为集成式测试和单组件式测试基准测试可以分为集成式测试和单组件式测试。
  • 集成式测试就是对整个应用系统进行测试,如一个网站应用系统,对整个网站系统进行测试。
  • 单组件式测试是对系统中的某个组件进行测试,如对网站中的数据库这个组件进行测试,或对web服务器这个组件进行测试等。

(一)、集成式测试工具(一)、集成式测试工具

有http_load,ab,jMeter,wrk等

1、ab的使用1、ab的使用

ab即apache bench,是apache httpd包含的一个http压测工具

(1)ab的安装(1)ab的安装

安装apache httpd即可(详细安装教程请参照:Linux下安装apache httpd及httpd常见用法

(2)ab的常用用法(2)ab的常用用法

ab [options] url

options表示参数

  • -n:请求数
  • -c:并发数(请求人数)
  • -s:超时时间

url表示压力测试的地址

如:

  1. ab -n 2000 -c 10000 http://localhost/hello.php

结果如下:

2、wrk的使用

wrk是一款简单的http压测工具,安装和使用都比较简单(推荐使用)

(1)安装(1)安装

下载地址:http://github.com/wg/wrk

  1. cd wrk
  2. make
  3. cp wrk /usr/local/bin/wrk
(2)使用(2)使用

wrk url

  • options:参数
    • -c:连接数
    • -d:压测时间(可以使用m(分钟)、s(秒)这种单位)
    • -t:使用的线程数
  • url:压测地址
  1. wrk -c20000 -t10 -d1m http://localhost/index.php

结果如下:

3、jMeter的使用3、jMeter的使用

jmeter相对于其他工具来说相对复杂,之后会有专门的文章来介绍jMeter的使用

(二)、单组件式测试工具(二)、单组件式测试工具

有mysqlslap,sysbench等

1、mysqlslap

它是mysql自带的压测工具

使用:mysqlslap

常用options详解:

  • --auto-generate-sql(或者使用-a),表示使用mysqlslap工具自己生成的sql脚本来测试并发压力
  • --concurency(或者使用-c),表示模拟的多少个客户端同时执行操作
  • --engine(或者使用-e),表示要测试的存储引擎
  • --iterations(或者使用-i),表示在不同的并发环境下,各自测试多少次
  • --number-of-queries=N,表示总的测试查询次数
    如:测试单个用户
  1. ./mysqlslap -a

或:模拟多个用户(100个)

  1. ./mysqlslap -a -c200
2、sysbench

详细使用请参照:mysql优化调优之一:发现问题-基准测试之sysbench的使用

二、性能分析

与测试一样,性能分析也包括对整个应用的性能分析和对单个组件的性能分析,针对整个应用,针对不同的开发平台,有不同的解决方案。如openresty中可以通过火焰图来分析,PHP中可以使用xhprof来分析,或者借助第三方的性能分析工具(一般是收费的,搜索APM即可)

1、应用级性能分析1、应用级性能分析

针对整个应用级的性能分析,非本文的重点,可以根据项目特性选择或开发对应的工具来分析。

2、MySQL性能分析2、MySQL性能分析
(1)分析慢查询日志(1)分析慢查询日志

可以使用mysqldumpslow或者pt-query-digest来分析,具体可参考 mysql慢查询日志分析工具的使用

(2)通过show status和show engine innodb status等(2)通过show status和show engine innodb status等

show status可以查看当前服务器的状态:

查看服务器正在执行的命令

  1. show status like 'Com_%';

查看和服务器之间来往的流量:

  1. show status like 'Bytes_%';

查看在查询执行期间创建的临时表和文件:

  1. show status like 'Created_%';

查看服务器运行时间:

  1. show status like 'uptime';
  2. show engine innodb status:查看innodb这种存储引擎的状态
(3)通过show profile

通过show profile可以查看mysql语句的性能损耗在哪些地方

第一步:要打开profiling(可以先查看是否打开)

  1. show variables like 'profiling';
  2. set profiling = 1;

第二步:执行sql

第三步:查看执行的sql的性能损耗分析报告

查看最近的一条执行结果:

  1. show profile;

查看打开profling后所有的结果:但是只显示每条的执行时间:

  1. show profiles;

例如:

  1. mysql>set profling =1;
  2. mysql>select * from population where country="cn";
  3. mysql>select * from population where city = "beijing";
  4. mysql>select * from population where population>=1000000;
  5. mysql>show profile;

查看结果:

通过上图可以看出整个执行过程每个阶段消耗的时间。

通过show profiles查看:

通过上图可以查找每条执行语句消耗的时间

(4)通过show processlist

通过show processlist可以查看目前有哪些线程进行运行,也可以认为这是查找当前mysql连接数的方法,对于出现too many connections的错误,是一个很好的排查方式。

  1. show processlist

结果如下:

  • Id:连接的编号
  • User:连接的用户
  • Host:连接的主机
  • db:连接的数据库名称
  • Command:执行的命令
  • Time:连接持续时间
  • State:连接状态
  • Info:具体执行的SQL语句

主要的State状态:(这个状态值有很多,这里只列举常用的几个,可以根据名称很容易知道其含义)

  • Locked:被其他查询锁定
  • Sending data:正在处理Select查询的记录,时时正在把结果发送给客户端
  • Connect Out:复制从服务器正在连接主服务器
  • Updating:正在搜索匹配的记录,并且修改这些数据