一、基准测试
基准测试的作用:
-
了解当前系统的性能,建立mysql服务器性能基准线(为之后的性能优化提供一个超始线)
-
模拟比当前系统更高的负载,找出系统的扩展瓶颈,为系统扩展与优化提供参考条件
-
测试不同的硬件、软件和操作系统配置
-
证明新的硬件设备是否配置正确和是否是最优配置
基准测试可以分为集成式测试和单组件式测试。
-
集成式测试就是对整个应用系统进行测试,如一个网站应用系统,对整个网站系统进行测试。
-
单组件式测试是对系统中的某个组件进行测试,如对网站中的数据库这个组件进行测试,或对web服务器这个组件进行测试等。
(一)、集成式测试工具
有http_load,ab,jMeter,wrk等
1、ab的使用
ab即apache bench,是apache httpd包含的一个http压测工具
(1)ab的安装
安装apache httpd即可(详细安装教程请参照:Linux下安装apache httpd及httpd常见用法
(2)ab的常用用法
ab [options] url
-
options表示参数
-n:请求数
-c:并发数(请求人数)
-s:超时时间
-
url表示压力测试的地址
如:
1
|
|
结果如下:
2、wrk的使用
wrk是一款简单的http压测工具,安装和使用都比较简单(推荐使用)
(1)安装
1
2
3
|
cd wrk make cp wrk /usr/local/bin/wrk |
(2)使用
wrk <options> url
-
- options:参数
-c:连接数
-d:压测时间(可以使用m(分钟)、s(秒)这种单位)
-t:使用的线程数
-
- url:压测地址
1
|
wrk -c20000 -t10 -d1m http: //localhost/index .php |
结果如下:
3、jMeter的使用
jmeter相对于其他工具来说相对复杂,之后会有专门的文章来介绍jMeter的使用
(二)、单组件式测试工具
有mysqlslap,sysbench等
1、mysqlslap
它是mysql自带的压测工具
使用:mysqlslap <options>
常用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、应用级性能分析
针对整个应用级的性能分析,非本文的重点,可以根据项目特性选择或开发对应的工具来分析。
2、MySQL性能分析
(1)分析慢查询日志
可以使用mysqldumpslow或者pt-query-digest来分析,具体可参考 mysql慢查询日志分析工具的使用
(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‘ ; |
show engine innodb status:查看innodb这种存储引擎的状态
(3)通过show profile
通过show profile可以查看mysql语句的性能损耗在哪些地方
第一步:要打开profiling(可以先查看是否打开)
1
2
|
show variables like ‘profiling‘ ; set profiling = 1; |
第二步:执行sql
第三步:查看执行的sql的性能损耗分析报告
查看最近的一条执行结果:
1
|
show profile; |
查看打开profling后所有的结果:但是只显示每条的执行时间:
1
|
show profiles; |
例如:
1
2
3
4
5
|
mysql> set profling =1; mysql> select * from population where country= "cn" ; mysql> select * from population where city = "beijing" ; mysql> select * from population where population>=1000000; 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:正在搜索匹配的记录,并且修改这些数据