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

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 工具。

JMeter控制台

1.2 Linux环境安装

2.初始JMeter

JMeter的组成:

测试计划

线程组:(1)断言、定时器、监听器、配置元件、后置处理器
        (2)逻辑控制器
        (3)Sampler
        
JMeter实现多并发
    线程组:负载发生器,用多线程或多进程的方式来模拟用户的使用行为。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

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
  • 慢查询日志分析
    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

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连接为控制连接和数据连接
  • TCP/IP协议:中间层协议,网络控制协议/互联网协议

  • UDP协议:用户数据协议

2. JMeter进行FTP协议接口测试

Linux搭建FTP服务器

3.性能测试用例设计及测试报告

  • 性能测试用例设计

    • 被测系统及版本
    • 测试数据
    • 测试场景(包含异常场景)
    • 预期结果
    • 预期性能指标
  • 性能测试测试报告

    • 被测系统
    • 版本号
    • 运行环境、配置
    • 测试场景(并发定义)
    • 预期性能指标
    • 实际结果
    • 测试结论
    • 测试人员
    • 如不通过说明瓶颈
    • 如通过说明最大性能指标
    • 容量规划
posted @ 2020-05-16 18:16  secoder  阅读(1198)  评论(0编辑  收藏  举报