Jmeter性能测试利器
一、性能测试整体认知
1.性能测试技能树:
开发语言
操作系统
数据库
测试工具
网络知识
业务知识
性能测试的目的:
发现性能瓶颈
2.性能测试的分类
性能测试是一个非常广泛的概念,包括的很多方面的测试,也可称之为非功能测试。
自动化测试属于功能测试的范围,由于其测试方法要求测试人员拥有一定的代码能力,座椅被单独分成为一个测试模块。
-
负载测试:通过逐步加压的方法,达到既定的性能阈值的目标。阈值的设定应是小于等于某个值,如 CPU 使用率小于等于80%。
-
压力测试:通过逐步加压的方法,使得系统的某些资源达到饱和,甚至失效的状态,简单粗暴的解释就是什么条件下能把系统压崩溃。
-
并发测试:在同一时间内,多个虚拟用户同事访问同一模块、同一功能,通常的测试方法是设置集合点。
-
容量测试:通常是指数据库层面的,目标是获取数据库的最佳容量的能力。又称为容量预估,具体测试方法为在一定的并发用户,不同的基础数据量下,观察数据库的处理能力,即获取数据库的各项性能指标。
-
可靠性测试:有称为稳定性测试或疲劳测试。是指系统在高压情况下,长时间的运行系统是否稳定。如 CPU 使用率在80%以上,7*24小时运行,系统是否稳定。
-
异常测试:又称为失败测试。是指系统架构方面的测试。如在负载均衡架构中,要测试宕机、节点挂掉等情况系统的反应。
3.性能测试的工作流程
需求分析 - 性能指标制定 - 脚本开发 - 场景设置 - 监控部署 - 测试执行(并发-压力)- 性能分析 - 性能调优 - 测试执行(并发-压力)- 性能调优 - ... - 测试报告
4.常见系统应用分层架构
MVC架构,分块测试能最大程度最优滴发现性能瓶颈。自低向上测试
- 显示层(view):Web、Android、IOS、H5
- 逻辑控制层(controller):Api
- 数据存储层(model):MySQL、MongoDB、Redis...
5.性能测试指标定义
- 事务:从客户端发起的一个或多个请求(这些请求组成一个完整的操作),到客户端接收到从服务器返回的响应,是一个闭环操作的过程。
- **TPS(Transaction Per Second) **:每秒钟系统能够处理的事务数
- 请求响应时间:从客户端发起的一个请求开始,到客户端接收到从服务器返回的响应。整个过程所耗费的时间。
- 事务响应时间:事务可能是由一个或多个请求组成的,事务响应时间主要是针对于用户的角度而言,如转账(中国银行发起-招商银行接受-招商银行反馈收到-中国银行减去转账数)
- 并发:没有严格意义上的并发。并发总有先后,无论差距是1毫秒或者是1微妙,总有一个时间差。所以并发将的是一个时间范围内,比如1秒内。(如:双十一秒杀同一商品;双十一秒杀不同商品秒杀)
- 并发用户数:同一单位时间内对系统发起请求的用户数量。
- 吞吐量:一次性能测试过程中网络上传输的数据量的总和。
- 吞吐率:吞吐率=吞吐量/传输时间,单位时间内网络上传输的数据量。
- 点击率:每秒钟用户向服务器提交的请求数。这个指标是 web 应用程序特有的一个指标,可以想象为每秒钟用户总共在页面上进行多少次点击动作,但是需要注意的是一次鼠标单击的操作后,客户端有可能向服务器发送了多少次请求。
- 资源使用率:对不同的系统资源的使用情况,如 CPU、内存、IO 等
6.性能测试的需求分析
-
分析的目的:
明确测试指标 明确测试场景
-
新系统:
同行业比较 业务预期
-
老系统:
对比以往 用户使用行为及用户量
7.性能测试工具
常用工具:
LoadRunner
JMeter
二、JMeter深入了解
1.JMeter安装
1.1 Windows环境安装
1.【[JMeter下载地址](http://jmeter.apache.org/download_jmeter.cgi)】
2. 配置环境环境变量:
电脑桌面 -—> “计算机”图标 -—> 鼠标右键选择“属性” -—> 点击高级系统设置 -—> 高级 -—> 环境变量 -—> 系统变量
创建JMETER_HOME="JMeter的安装路径"
新建或编辑CLASSPATH=";%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar;"
3. 在安装目录bin目录,点击 JMeter.bat 启动 JMeter 工具。
1.2 Linux环境安装
2.初始JMeter
JMeter的组成:
测试计划
线程组:(1)断言、定时器、监听器、配置元件、后置处理器
(2)逻辑控制器
(3)Sampler
JMeter实现多并发
线程组:负载发生器,用多线程或多进程的方式来模拟用户的使用行为。JMeter是已线程的方式来进行模拟用户的并发访问的。
3.JMeter实现多并发
4.JMeter实现逻辑分支控制
逻辑控制器:用来控制测试脚本的逻辑判断,也可以理解为如何控制脚本的运行。例如:如果控制器,就是当满足什么样的条件后执行哪一步操作。
5.JMeter实现配置管理
配置元件:用来提供一些配置相关的信息,如 Http 请求头、cookie 管理,提供参数化数据。还可以进行用户自定义变量等配置,用来定义常量等。
三、Linux服务器监控性能测试
1.性能测试范围
-
测试目的:发现服务器的性能瓶颈。配置的不同能够承载的最大任务树不同,能够承载的压力也不同。
-
测试范围及性能指标:
CPU:车间工人 内存:临时存储货物的仓库 磁盘:仓库 网络:仓库外的道路 版本:仓库的智能化程度
2.测试与生产的环境配置不同?
多次压测后的性能预估
3.进程与线程
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
线程:是进程的一个实体,是CPU调度和分牌的基本单位。他是比进程更小的独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中比不可少的资源。一个线程可以创建和撤销另一个线程。
区别:
一个线程只能属于一个进程,而一个进程可以拥有多个线程。线程是进程工作的最小单位。
一个进程会分配一个地址空间,进程与进程之间不共享地址空间,即不共享内存。
同一进程下的不同的多个线程,共享父进程的地址空间。
线程在执行过程中,需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。
线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
优缺点:
进程优点:
每个进程相互独立,不影响主程序的稳定性,子进程奔溃不影响其他进程。
通过增加CPU,就可以扩大性能。
可以尽量减少线程加锁与解锁的影响,极大的提高了性能。
进程缺点:
逻辑控制复杂,需要和主程序交互。
多进程调度开销大。
线程优点:
程序逻辑和控制方式简单。
所有线程可以直接共享内存和变量等。
线程方式消耗的总资源比进程方式少。
线程缺点:
每个线程与主程序共用地址空间,最大内存地址受限。
线程之间的同步和加锁不易控制。
一个线程的崩溃可能影响到整个程序的稳定性。
4. 服务器实时内存监控
# Linux帮助命令,可以查看所有命令的使用方法
man
# 实时监控命令
top
# 实时监控系统的运行状态,并按CPU及内存等进行排序。
# -h 帮助
# -p 监控指定的进程。监控多个监控室,进程ID已逗号分隔。
# top任务区命令
# M 按内存使用率排序
# P 按CPU使用率排序
# z 彩色/黑白显示
# load average -- 系统的运行队列的平均利用率,也可认为是可运行进程的平均数(表示在最后1分钟、5分钟、15分钟的平均负载值)。
# 【备注:在单核CPU中load average的值为1时表示满负荷状态。同理在多核CPU中满负荷的load average的值为1*CPU核数】
top -hv | -bcHiOSs -d secs -n max -u | U user -p pid(s) -o field -w [cols]
# 内存监控
vmstat
# 可以监控操作系统的进程状态、内存、虚拟内存、磁盘IO、CPU的信息。
# -S 使用指定单位显示
vmstat [-a][-n][-S unit][delay[count]]
free
# 能够监控系统的内存使用状态
# 参数解释:
# total 总计屋里内存的大小
# Used 已使用的内存大小
# shared 多个进程共享的内存总额
# buffers/cached 磁盘缓存的大小
5.实时监控-CPU
# 可以查看多核心CPU中每个计算核心的统计数据
mpstat
mpstat [-P{|ALL}[internal [count]]]
# 参数解释:
# -P {|ALL}监控那个CPU,CPU的取值【0,CPU个数-1】
# internal 相邻的两次采样的间隔时间
# count 采样的次数,count只能和delay一起使用
# 使用注意:
# 当没有参数时,显示系统启动以后所有信息的平均值
# 当有internal时,第一行的信息自系统启动以来的平均是,从第二行开始输出为前一个internal时间段的平均信息。
6.实时监控-网络
# 用于显示本机网络链接、运行端口、路由表等信息
netstat
# 参数解释:
# -n 拒绝显示别名,能显示数字的全部转换为数字
# -l 仅列出有在 Listen(监听)的服务状态
# -p 显示建立相关链接的程序名
# -t 显示TCP相关选项
# -u 显示udp相关选项
# -i 显示自动匹配接口的信息
# -c 每隔一个固定时间,执行该 netstat 命令
6.实时监控-磁盘监控
# 是对系统磁盘IO操作进行监控的,它的输出主要显示磁盘的读写操作的统计信息,同时给出CPU的使用情况。
iostat
# 参数说明
# -x 输出指定要统计的磁盘设备名称,默认为所有磁盘的设备。
iostat -x sda 1
7.万能命令-sar
sar -- (System Activity Reporter 系统活动情况报告)是目前Linux上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告
(1)文件的读写情况
(2)系统的调用的使用情况
(3)磁盘I/O
(4)CPU效率
(5)内存使用状况
(6)进程活动及IPC有关的活动
# 参数说明
# n 和 t 组合定义为次数和采样间隔
# -o file将命令结果以二进制形式放在file中
# options为命令行参数
# -A 所有报告的总和
# -u CPU利用率
# -v 进程、节点、文件和锁表状态
# -r 显示系统内存的使用情况
# -B 内存分页情况
# -b 缓冲区使用情况
#
sar [options][-A][-o file] t [n]
7.进程追踪命令-strace
# 是一个集诊、调式、统计与一体的工具,用strace对应用的系统调式和信号传递的跟踪结果来对应用进行分析,以达到解决问题或是了解应用工作过程的目的。
# 参数说明
# -p 跟踪指定的程序
# -f 跟踪由fork子进程系统调用
# -c 统计每一系统调用的所执行的时间,次数和出错的次数
# -t 在输出中的每一行前加上时间信息,-tt时间确定到微秒级。
# -e 输出过滤器,通过表达式,过滤掉不想要的输出
# -o filename 默认将strace的结果输出到stdout,通过-o可以将输出写入到filename文件中
8.Linux监控工具-nmon
nmon是一种在Linux操作系统中广泛使用的监控与分析工具,nmon所记录的信息是比较全面的,能够在系统运行过程中实时地捕捉系统资源的使用情况,并且输出结果到文件中,然后通过nmon_analyzer工具产生数据文件与图形化结果。
nmon
# 参数说明:
-f 必选参数,并且必须放在第一个,就是输出文件;输出的默认文件名是hostname_date_time.nmon
-F <filename> 和-f一样,自定义文件名称
-s 采集保存数据的频率
-c 采集数据次数
-t 输出最消耗资源的进程数据
-h 查看帮助
nmon_analyser: nmon analyser的作用就是分析nmon数据采集后的结果,nmon analyser需要接祖Excel的宏。WPS默认没有安装宏,需要下载插件
9.Linux下的定时任务
crontab
crontab的启动
crontab的服务权限
crontab -e编辑定时任务的列表
四、数据驱动性能测试
数据驱动:从数据文件中读取测试数据,驱动测试过程的一种测试方法,是一种更高级的参数化。
- 特点:测试数据与测试代码分离,数据控制过程
- 优点:减少测试代码量;降低脚本开发和维护的成本;便于用例的修改和维护(不用修改代码)
- *要求:较强的代码能力;较强的分层架构设计思维;对开发框架有一定的了解
1.数据驱动的使用场景
(1)复杂的业务流程
(2)根据业务场景分流
(3)符合条件的并发场景
JMeter中的数据驱动
- 控制方式:
- 参数化(推荐使用数据库)
- 逻辑控制器(如,if控制器)
JMeter数据驱动实战
- 场景
- 登录后男人浏览电子商品
- 登录后女人浏览衣服商品
id | name | sex | age |
---|---|---|---|
1 | zhangsan | 0 | 20 |
2 | lili | 0 | 23 |
3 | wangwu | 1 | 22 |
4 | malu | 1 | 23 |
五、数据库架构设计及性能调优
1.数据库性能测试的目的及范围
- 目的:发现数据库相关的所有性能瓶颈
- 范围:
- SQL语句 - 慢查询等
- 资源使用率
- 数据库架构的合理性
- 数据库性能指标
2.数据库的常用架构
- 一主多从:减少单台服务器的压力,但有可能会存在主从延时的问题,其原理是:
- master将改变记录到二进制日志(binary log)中
- slave将master的binary log events拷贝到它的中继日志(relay log)
- salve重做中继日志中的事件,将改变反映它自己的数据
- 双机热备
3.数据库分库分表的设计方法
- 1.拆分原因:
- 单表或库数据量太大
- 硬件不能升级或无法升级
- 2.分库分表方案:
- 业务拆分:用户、商品、订单
- 垂直拆分:商品 -> 电子商品、母婴商品、床上商品
- 水平拆分(一致性哈希算法):同一张表拆成三张一样规则的表
4.MySQL数据库监控指标
拓展:MariaDB:MySQL支付创建,目标替换现有的MySQL,兼容MySQL是开源的。
- QPS:(queries per seconds 每秒查询数量 )
- 获取方法:mysql> show global status like 'Quesion%' ;
- 计算方法:Queries /seconds
- TPS(Transaction per seconds)
- 计算方法:TPS = (Com_commit + Com_rollback) / seconds
- 获取Com_commit:mysql> show global status like 'Com_commit';
- 获取Com_rollback:mysql> show global status like 'Com_rollback';
- 线程连接数
- 获取最大使用的连接数:mysql> show global status like 'Max_used_connections';
- 获取线程数:mysql> show global status like "Threads%"
- 最大连接数
- 获取最大的连接数:mysql> show variables status like 'max_connections';
- Query Cache
- 查询缓存用于缓存select查询结果,当下次收到相同查询请求时,不在执行知己查询处理而直接返回结果;适用于大量查询、很少改变表中数据
- 开启Query Cache方法:修改my.cnf文件,将query_cache_size设置为具体大小,具体大小是多少取决于查询的实际情况,最好设置为1024的倍数(参考值为32M);增加一行:query_cache_type=0/1/2(1:缓存所有结果;2:指定缓存)
- Query Cache命中率
- 获取:mysql> show status like "Qcache%";
- 计算:Query_cache_hits = (Query_hits / (Qcache_hits + Qcache_inserts)) * 100%;
- 锁定状态:
- 获取:mysql> show global status like '%lock%';
- 计算:Table_locks_waited / Table_locks_immediate 值越大代表表锁造成的阻塞越严重
- Innodb_row_lock_waits innodb行锁,太大可能是间隙锁造成的
- 主从延时:
- 查询:show salve status;
5.MySQL慢查询工作原理及操作
- 慢查询:执行速度超过定义的时间的查询;不同的系统定义不同的慢查询
- 慢查询开启:
- 编辑/etc/my.cnf,在[mysqld]域中添加
slow_query_log = 1
- 慢查询日志路径:
slow_query_log_file=/data/mysql/slow.log
- 慢查询的时长:
long_query_time = 1
- 未使用索引的查询也被记录到慢查询日志中
log_queries_not_using_indexes = 1
- 编辑/etc/my.cnf,在[mysqld]域中添加
- 慢查询日志分析:
mysqldumpslow # 参数说明: # -s 表示按何种方式排序 # c:访问计数 # l:锁定时间 # r:返回记录 # t:查询时间 # al:平均锁定时间 # ar:平均返回记录数 # at:平均查询时间 # -t 返回前面多少条的数据 # -g 后面写一个正则匹配模式,大小写不敏感
- 返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 slow.log
- 返回访问次数最多的10个SQL
mysqldumpslow -s c -t 10 slow.log
- 返回按照时间排序的前10条里面包含左连接的SQL
mysqldumpslow -s t-t 10 -g "left join" slow.log
- 返回记录集最多的10个SQL
6.SQL的分析与调优方法
explain(执行计划)
- 用法:explain select 语句
- 结果分析:
- id:select识别符,代表语句的执行顺序,一般在select嵌套查询时会不同;数字越大越先执行;null代表是结果集
- select_type:
- simple:不需要union操作或者不包含子查询的简单select查询,有连接查询时,外层的查询为simple且只有一个
- primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type纪委primary且只有一个
- union:连接的两个select查询,第一个查询时dervied派生表,除了第一个表外,第二个以后的表select_type都是union
- dependent union:与union一样,出现在union或union all语句中,但是这个查询要收到外部查询的影响。
- union result:包含union的结果集,在union和unionall语句中,因为它不需要参与查询,所以id字段为null
- subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
- dependent subquery:dependent union类似,表示这个subquery的查询要收到外部查询表查询的影响
- derived:from字句中出现的子查询,也叫派生表,其他数据库中可能叫做内联视图或嵌套select
- table
- 显示的查询表名,如果用别名就显示别名;
- 为null表示不涉及对数据表的操作;
- 显示
表示为这个是临时表
- type
- 依次好到差
system 、const 、eq_ref、ref、fulltext、ref_or_null、unique_subquery、index_subquery、range、 index_merge、index、ALL
- 除了ALL,其他的type都可以用到索引,扫描全表数据文件
- 除了index_merge外,其他只能用一个索引,常见于and或or使用了不同的索引
- system:表中只有一行或是空表,且只能用myisam和memory表
- 如果是Innodb引擎表,type列在这个情况通常都是ALL或index
- const:使用唯一索引或主键返回记录一定是1行记录的等值where条件时,通常type是const
- eq_ref:出现在要连接过这个表的查询计划中,驱动表只返回 一行数据,且这行数据时第二表的主键或者唯一索引
- ref:返回数据不唯一的等值查找就肯能出现
- fulltext:全文检索,优先级很高
- ref_or_null:与ref类似,只增加了null值的比较
- unique_subquery:用于where中in形式子查询,子查询返回不重复唯一
- index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表。
- range:索引范围扫描,常用于>,<,is null,bettwen等
- index:索引全表扫描,把索引从头到尾扫描一遍
- 依次好到差
- possible_keys:查询可能使用到的索引都会在这里列出来
- key:查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个
- key_len:用于处理查询的索引长度;单列索引全算,多列不一定全算
- ref:若果是常数等值查询,显示const;如果使用了表达式或函数,显示func
- rows:执行计划中估算的扫描行数,不是精确值
- Extra:
- distinct:select中使用了distinct
- no table used:不带from字句的查询或者From dual查询
- using filesort:排序时无法使用到索引;常见于order by或group by语句中
- using index:查询时不需要回表查询,直接通过索引查询的数据
- using intersect:使用and的各个索引的条件,表示是从处理结果去交集
- using union:使用了or的各个索引的条件,表示是从处理结果取并集
- using where:使用了where条件,表示存储引擎返回的记录不是所有的都满足查询条件,需要在server层进行过滤
7.MySQL索引概念及规范
-
索引类型
- 主键索引:特殊的唯一索引,不允许有空值(id列),创建表时确定创建
- 唯一索引 :索引列的值必须唯一,不允许空值
- 普通索引 :最基本的索引,没有任何限制
- 全文索引 :fulltext只适用于MyISAM表的一个索引类型(char、varchar、text)
match()实现全文索引 - 组合索引 :多列索引,是得多列上创建索引,最左前缀规则(id,name,age-->id、name、age,id、name,id)
-
索引创建规范
可以提高传下效率,但也会降低插入和更新的速度并占用磁盘空间,在插入和更新数据时,要重写索引文件- 单张表中索引数量不超过5个
- 单个索引中的字段数不超过5个
- 不适用更新频繁的列作为主键
- 合理创建组合索引(避免冗余)
- 不在低基数列上建立索引,如性别
- 不在索引列进行数学运算和函数运算,会是索引失效
- 不适用%前导的查询,如like "%xxx"无法使用索引
- 不适用反向查询,如not in、not like
- 选择越小的数据类型越好占用空间少,处理更快
- 在经常需要排序(order by)、分组(group by)、和distinct列上用不了索引,索引考虑加where或加limit
- 在表与表的连接条件上加索引,可以加快连接查询的速度
- 使用短索引,字段本来短
8.MySQL的存储引擎
- MyISAM:
- 优点:
- 读的性能比Innodb高很多
- 索引与数据分开,使用了压缩,提高了内存使用率
- 缺点:
- 不支持事务
- 写入数据时,直接锁表
- 优点:
- InnoDB:
- 优点:
- 支持事务
- 支持外键
- 支持行级锁
- 缺点:
- 不支持fulltext索引(全文索引)
- 行级锁并不绝对,当不确定扫描范围时,锁全表
- 索引与数据时紧密捆绑的,没使用压缩导致体积庞大
- 优点:
10.MySQL实时监控
orzdba 淘宝团队开发的
11.MySQL集群监控工具
天兔LEPUS
【下载】
简介:
12.MySQL性能测试的用例准备
13.JMeter开发MySQL性能测试脚本
14.执行测试
七、多协议接口性能测试
-
目标:
- 发现应用接口程序的性能瓶颈
- 发现数据库的性能瓶颈
-
范围:
- 应用程序各项性能指标
- 数据库各项性能指标
1.常见接口协议:
-
HTTP协议:超文本传输协议
-
HTTPS协议:安全超文本传输协议
- 默认端口:443
- 安全性的SSL加密传输协议(网站证书),可以理解为HTTP协议的安全版
- 协议栈中的位置
- HTTPS
- SSL/TLS
- TCP/IP
- 数据链路层
-
FTP协议:文件传输协议
- 默认端口:21和20
- 21:用户表示、口令、发送的命令
- 20:数据连接用于实际传输一个文件(主动模式)
- HTTP和HTTPS面向网页的,FTP面向文件的
- FTP使用两个并行TCP连接来进行文件传输
- FTP使用两个并行TCP连接为控制连接和数据连接
- 默认端口:21和20
-
TCP/IP协议:中间层协议,网络控制协议/互联网协议
-
UDP协议:用户数据协议
2. JMeter进行FTP协议接口测试
Linux搭建FTP服务器
3.性能测试用例设计及测试报告
-
性能测试用例设计:
- 被测系统及版本
- 测试数据
- 测试场景(包含异常场景)
- 预期结果
- 预期性能指标
-
性能测试测试报告:
- 被测系统
- 版本号
- 运行环境、配置
- 测试场景(并发定义)
- 预期性能指标
- 实际结果
- 测试结论
- 测试人员
- 如不通过说明瓶颈
- 如通过说明最大性能指标
- 容量规划