JMeter性能测试项目实战
第一章. Linux与MySQL性能理解
1. Linux服务器性能监控与分析
- 为什么要做服务器性能监控
- 服务器的性能命令与指标,如内存,CPU等
2. MySQL数据库性能分析
- 为什么要理解数据库性能
- 理解高性能的数据架构
- 理解海量数据下的分库方案
- MySQL慢查询相关知识点
第二章. 为什么要做服务器性能监控
1. 软件系统架构
2. 综合监控命令--top
- top命令用法
top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
top的使用方式 top [-d number] | top [-bnp]
参数解释:
-d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。 -b:以批次的方式执行top。 -n:与-b配合使用,表示需要进行几次top命令的输出结果。 -p:指定特定的pid进程号进行观察。
在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的):
?:显示在top当中可以输入的命令 P:以CPU的使用资源排序显示 M:以内存的使用资源排序显示 N:以pid排序显示 T:由进程使用的时间累计排序显示 k:给某一个pid一个信号。可以用来杀死进程 r:给某个pid重新定制一个nice值(即优先级) q:退出top(用ctrl+c也可以退出top)。
top各输出参数含义
下面是使用top命令来进行性能检测的截图:
图一(ubuntu):
图二(centos):
一、top前5行统计信息
第1行:top - 05:43:27 up 4:52, 2 users, load average: 0.58, 0.41, 0.30
第1行是任务队列信息,其参数如下:
内容 | 含义 |
---|---|
05:43:27 | 表示当前时间 |
up 4:52 | 系统运行时间 格式为时:分 |
up 4:52 | 系统运行时间 格式为时:分 |
2 users | 当前登录用户数 |
load average: 0.58, 0.41, 0.30 | 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 |
load average: 如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第2行:Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie
第3行:%Cpu(s): 37.0 us, 3.7 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
第2、3行为进程和CPU的信息
当有多个CPU时,这些内容可能会超过两行,其参数如下:
内容 | 含义 |
---|---|
159 total | 进程总数 |
1 running | 正在运行的进程数 |
158 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
37.0 us | 用户空间占用CPU百分比 |
3.7 sy | 内核空间占用CPU百分比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
59.3 id | 空闲CPU百分比 |
0.0 wa | 等待输入输出的CPU时间百分比 |
0.0 hi | 硬中断(Hardware IRQ)占用CPU的百分比 |
0.0 si | 软中断(Software Interrupts)占用CPU的百分比 |
0.0 st | |
第4行:KiB Mem: 1530752 total, 1481968 used, 48784 free, 70988 buffers | |
第5行:KiB Swap: 3905532 total, 267544 used, 3637988 free. 617312 cached Mem | |
第4、5行为内存信息 | |
其参数如下: |
内容 | 含义 |
---|---|
KiB Mem: 1530752 total | 物理内存总量 |
1481968 used | 使用的物理内存总量 |
48784 free | 空闲内存总量 |
70988 buffers(buff/cache) | 用作内核缓存的内存量 |
KiB Swap: 3905532 total | 交换区总量 |
267544 used | 使用的交换区总量 |
3637988 free | 空闲交换区总量 |
617312 cached Mem | 缓冲的交换区总量。 |
3156100 avail Mem | 代表可用于进程下一次分配的物理内存数量 |
上述最后提到的缓冲的交换区总量,这里解释一下,所谓缓冲的交换区总量,即内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。 |
计算可用内存数有一个近似的公式:
第四行的free + 第四行的buffers + 第五行的cached
二、进程信息
内容 | 含义 |
---|---|
PID | 进程id |
PPID | 父进程id |
RUSER | Real user name |
UID | 进程所有者的用户id |
USER | 进程所有者的用户名 |
GROUP | 进程所有者的组名 |
TTY | 启动进程的终端名。不是从终端启动的进程则显示为 ? |
PR | 优先级 |
NI | nice值。负值表示高优先级,正值表示低优先级 |
P | 最后使用的CPU,仅在多CPU环境下有意义 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
TIME | 进程使用的CPU时间总计,单位秒 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
%MEM | 进程使用的物理内存百分比 |
VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
SWAP | 进程使用的虚拟内存中,被换出的大小,单位kb |
RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
CODE | 可执行代码占用的物理内存大小,单位kb |
DATA | 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb |
SHR | 共享内存大小,单位kb |
nFLT | 页面错误次数 |
nDRT | 最后一次写入到现在,被修改过的页面数。 |
S | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 |
COMMAND | 命令名/命令行 |
WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 |
Flags | 任务标志 |
3. 综合监控命令--free
1、free命令使用
free命令简介
free 命令能够显示系统中物理上的空闲和已用内存,还有交换内存,同时,也能显示被内核使用的缓冲和缓存
free命令语法
语法:free [param]
1
param可以为:
-b:以Byte为单位显示内存使用情况;
-k:以KB为单位显示内存使用情况;
-m:以MB为单位显示内存使用情况;
-o:不显示缓冲区调节列;
-s<间隔秒数>:持续观察内存使用状况;
-t:显示内存总和列;
-V:显示版本信息。
free命令使用
Mem:表示物理内存统计
total:表示物理内存总数(total=used+free)
used:表示系统分配给缓存使用的数量(这里的缓存包括buffer和cache)
free:表示未分配的物理内存总数
shared:表示共享内存
buffers:系统分配但未被使用的buffers 数量。
cached:系统分配但未被使用的cache 数量。
-/+ buffers/cache:表示物理内存的缓存统计
(-buffers/cache) 内存数: (指的第一部分Mem行中的used – buffers – cached)
(+buffers/cache) 内存数: (指的第一部分Mem行中的free + buffers + cached)
(-buffers/cache)表示真正使用的内存数, (+buffers/cache) 表示真正未使用的内存数
Swap:表示硬盘上交换分区的使用情况
4. 综合监控命令--ulimit
- ulimit用于显示系统资源限制的信息
- 语法:ulimit [param]
- param参数可以为:
- -a 显示目前资源限制的设定。
- -c <core文件上限> 设定core文件的最大值,单位为区块。
- -d <数据节区大小> 程序数据节区的最大值,单位为KB。
- -f <文件大小> shell所能建立的最大文件,单位为区块。
- -H 设定资源的硬性限制,也就是管理员所设下的限制。
- -m <内存大小> 指定可使用内存的上限,单位为KB。
- -n <文件数目> 指定同一时间最多可开启的文件数。
- -p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。
- -s <堆叠大小> 指定堆叠的上限,单位为KB。
- -S 设定资源的弹性限制。
- -t <CPU时间> 指定CPU使用时间的上限,单位为秒。
- -u <程序数目> 用户最多可开启的程序数目。
- -v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB
5. 综合监控命令--iostat
iostat用于输出CPU和磁盘io的相关的统计信息
iostat
其中
avg-cpu:主要的是CPU的信息,如果是多个cpu的话是cpu的平均值,其中重点关注的是iowait,表示的是用于等待io完成请求的时间
- Device:表示的是各个磁盘io的统计
- Device:以sdX的形式显示磁盘的名称
- tps:每秒进程下发的进程的读写请求数量
- kb_read/s: 每秒从驱动器读入的数据流量以KB为单位
- kb_wrtn/s: 每秒从驱动器写入的数据量,单位是K
- kb_read: 读入的数据总量,单位是k
- kb_wrtn: 写入的数据总量,单位是K
iostat的语法
用法
iostat[选项][<时间间隔>[<次数>]]
-c: 只是单独的输出cpu的信息不包括Device的信息
-d: 单独输出Device的信息不包括CPU的信息
-k/-m: 输出的结果是以kb或者是mb为单位,而不是以扇区数为单位
-x:输出更详细的磁盘io的信息
interval/count: 每次输出的间隔时间。count表示的是输出次数,没有count表示的是循环输出
各个字段选项的含义:
- rrqm/s: 每秒对于该设备的读请求合并的次数,文件系统会对读取同块(block)的请求进行合并
- wrqm/s: 每秒对于该设备写请求的合并次数。
- r/s: 每秒完成的读次数
- w/s: 每秒完成的写次数
- rkb/s: 每秒读的数据量是以kb为单位
- wkb/s: 每秒写的数据量以kb为单位
- avgrq-sz:平均每次io操作的数据量单位是扇区为单位
- avgqu-sz:平均等待的处理io的队列长度
- await:平均每次io的请求的等待时间(包括请求时间和等待的时间,单位是毫秒)
- svctm:平均每次io请求的处理时间。单位是毫秒
- %util:采用周期内用于io的操作的时间比率,即io队列非空的时间比率
重点关注的是:
1、iowait%:表示的是cpu等待的是io时间占整个cpu周期的百分比。如果iowait%的值大于50%或者是明显的高于%system、%user、%idle 表示io可能存在问题
2、avgqu-sz表示的是磁盘io的队列长度,即io的等待个数
3、await:表示的是io请求时间,等待时间和处理时间
4、svctm:表示的是每次请求的处理的时间
5、%util表示的是磁盘的忙碌情况,如果在80%就是磁盘可能处于忙碌的状态
6. 网络监控命令--netstat
1、netstat监控命令
netstat命令是用于监控进出网络的包和网络接口统计的命令行工具
语法:netstat [param]
param参数可以为:
- -h : 查看帮助
- -r : 显示路由表
- -i : 查看网络接口
2、linux检查网络
到网络配置文件目录
cd /etc/sysconfig/network-scripts
查看目录下的文件,找到ifcfg开头的文件
ls -ll
en33这个后缀不固定,根据自己系统的查看
vi /etc/sysconfig/network-scripts/ifcfg-en33
修改ONBOOT=yes,ONBOOT是指明在系统启动时是否激活网卡,只有在激活状态的网卡才能去连接网络,进行网络通讯其中en33是设备名,设置了linux网络,需要重启网络,可以用命令:
service network restart
第三章. MySQL数据库性能分析
1. 为什么要理解数据库的性能
- 数据库是承载用户数据的核心,凡是用户的操作几乎都涉及到了数据库的交互
- 数据库读写速度的快慢,直接影响了用户体验
- 数据库的性能测试范围有哪些
- SQL语句
- 数据架构设计的合理性
- 数据库资源使用率
- 数据库性能指标
2. MySQL高性能数据库架构
- 数据库架构演变
3. 海量数据下的分库分表策略
- 拆分的原因
- 单库或者是单表的数据量太大了
- 由于客观原因硬件无法升级
- 数据库拆分方案
- 数据表拆分方案
4. 慢查询的定义与设置
- 什么是慢查询
- 字面理解:执行速度很慢的查询
- 执行速度要慢于我们定义的慢查询时间的查询
- SQL语句的执行时间要大于我们定义的慢查询时间的查询
- 慢查询开启
- 登陆MySQL所在Linux服务器后
- 编辑mysol配置文件,命令 vim/etc/mysq1/mysq1.conf.d/mysq1d.cnf
- 找到 slow_query_log=1,打开它的注释
- 文件中slow_query_1oq_file代表的是慢查询的日志路径。这个配置路径存储若慢查询语句
- long query_time是定义慢查询的时间,超过这个时间的就是慢查询了
- 设置1ag-queries-not-using-indexes=1,指的是未使用索引的sql语句也被记录到文件中
- 获得慢查询SQL
命令:mysq1dumpslow
参数:
。-s是按照什么方式进行排序
oc访问次数
ot查询时间比如:
1、mysqldumpslow-s cslow.log 返回访问次数最多的慢查询语句
2、mysgldumpslow -s tslow.log 返回按照时间排序最新的慢查询语句。-t是返回前多少条数据的意思,比如-t5,返回前5条,
综合语句 mysqldumpslow -sc-t5慢查询日志文件所在路径
第四章. JMeter性能测试项目实战
1. 性能测试需求分析
- 掌握用户使用场景
- 用户重点使用功能
- 用户重点使用时间段
- 制定性能指标
当前注册用户数
- 数据库中,注册表(用户表)里有多少条数据
PV
- 英文名:Page View,及页面访问量
- 每打开一次页面算一次,刷新也算一次
UV
- 英文名:Unique Vistor(也有理解成User View的),即独立访客数量
- 一个终端一个访客,以Cookie为判断依据
- 其他肯会听到的指标
用户点击量
- 用户点击网站的次数
用户浏览量
- 第一种理解:用户在网站查看网页的数量
- 第二种理解:用户在网站上访问资源的数量
- 制定性能指标
用户访问量
- 有多少用户访问网站
- 一般以IP为计算依据
- 我们的系统新上线没有数据怎么办?
- 借助三方根据:站长工具:
https://tool.chinaz.com/
- 查看竞品的访问量作为依据
- 根据老板或项目管理者的预期发展期望
2. 性能指标换算
- 核心原则
二八原则
- 80%的用户会在20%的时间来访问
- 80%的用户会使用20%的核心功能
- 举个例子
3. 书写性能测试计划书
http://www.fanwen118.com/info_21/fw_3389634.html
第五章. Linux综合监控工具
1. nmon基本介绍与第一种用法
- nmon是什么
- nmon可以实现一个命令轻松监控linux健康状况
- nmon收集的结果包含了以前我们讲过的所有命令的结果
- nmon可将监控结果进行保存并进行查看和分析
- nomn的安装
apt install nmon
nmon的基本使用
第一种用法:安装后直接运行nmon即可
1. Nmon 安装
根据我的操作系统和linux版本,选择对应的支持版本,如下:
2、下载方式
①、下载到本地,通过FTP上传到服务器
②、命令行 wgethttp://sourceforge.net/projects/nmon/files/nmon16e_mpginc.tar.gz
3、安装
下载完成后,执行以下命令:
#新建一个nmon文件夹
mkdirnmon
#解压
tarxvfznmon16e_mpginc.tar.gz
#改名
mvnmon_x86_64_centos7/root/nmon
#给工具授权
chomd-xnmon777
4、运行nmon
完成上面的操作后,执行./nmon命令,出现如下界面,说明安装成功:
常用快捷命令说明:
#c
查看CPU相关信息
#m
查看内存相关信息
#d
查看磁盘相关信息
#n
查看网络相关信息
#t
查看相关进程信息
#h
查看帮助相关信息
输入如上几种命令,结果如下图显示:
5、采集数据
nmon通过命令行启动监控,捕获服务器的各项数据,命令如下:
- ./nmon-ft-s10-c60-m/root/nmon
-
参数说明
- -f监控结果以文件形式输出,默认机器名+日期
- .nmon格式-F指定输出的文件名,比如test.nmon
- -s指的是采样的频率,单位为毫秒
- -c指的是采样的次数,即以上面的采样频率采集多少次
- -m指定生成的文件目录
PS:一般来说不建议对稳定性测试使用nmon监控,因为生成的nmon文件超过10M时,分析工具会由于内存不足导致报错。
如果必须进行的话,建议加大采样频次,降低采样次数(低于330次)。
6、监控结果分析
1、下载分析工具
nmon监控捕获的信息,一般用nmon_analyser来进行分析。nmon_analyser由IBM提供,使用excel的宏命令分析加载生成excel图表,展示资源占用的各项信息。
官网地址:nmon_analyser
下载你需要的版本,然后解压,解压后出现如下2个文件:
2、使用nmonanalyser工具
打开.xlsm文件,点击Analyzenmondata,打开你需要进行分析的nmon监控文件:
PS:如果提示分析文件不可用,从“工具-宏-安全性”启动宏,然后再次打开文件,即可使用该分析文件。
3、生成各种图表数据
通过分析工具生成的监控数据结果如下图:
红色标注区域为采集的监控数据,选择自己需要的类型(比如cpu),然后筛选对应的服务Pid(比如1314),选择对应的数据类型(比如CPU使用率占比),通过excel提供的各种图形生成工具,生成直观的分析结果图。比如:
以上,即监控工具nmon的介绍和基本使用方法。
第六章. JMeter业务级脚本开发
1. 启动Jmeter
安装路径-->打开bin-->找到jmeter.bat,双击
2. 创建脚本
1.新建线程组
TestPlan-->右键-->添加-->线程(用户)-->线程组
2.添加HTTP信息头管理器
线程组-->右键添加-->配置元件-->HTTP信息头管理器
将HTTP\HTTPS,请求header值填入该元件,见下图
3.添加HTTP请求默认值
线程组-->右键添加-->配置元件-->HTTP请求默认值
填写HTTP\HTTP协议、接口请求地址、端口号
4.添加HTTP请求
线程组-->右键添加-->取样器-->HTTP请求
填写请求方法、路劲、编码、入参参数(key-value格式)
5.添加察看结果树
HTTP请求-->右键添加-->监听器-->察看结果树
察看结果树可以察看HTTP请求:请求header、入参、返回结果
6.添加BeanShell后置处理程序
如果返回结果是乱码的,其中一个处理方式是添加一个BeanShell后置处理程序
HTTP请求-->右键添加-->后置处理器-->BeanShell后置处理程序
在BeanShell后置处理程序中填入prev.setDataEncoding("utf-8")
保存脚本,重新运行即可。
7.启动运行脚本
第七章. 书写性能测试计划书
- 性能测试报告组成结构:
- 项目概况(项目背景、测试目的、测试范围、指标术语定义、测试指标说明、测试责任人、测试时间)
- 测试概要(测试场景、测试环境、测试类型、测试工具)
- 测试结果(并发测试结果、压力测试结果、负载测试结果、稳定性测试结果)
- 风险及建议(如果没有,则写无、如果有,则说明情况即可 )
某某某项目性能测试报告
word 可编辑修改-可在资源里寻找下载C站资源链接
修改记录
版本号 | 发布日期 | 编制人 | 审核人/批准人 | 修改的章节号 |
---|---|---|---|---|
1.0 | YYYY-MM-DD | 张三 | ||
1.1 | YYYY-MM-DD | 李四 | ||
- 文章目录
1 性能测试概述
某某某项目性能测试报告
摘 要: 本文档为某某某项目性能测试报告,主要内容包括概述、测试环境、测试方法、测试工具等。主要的读者有性能测试脚本开发人员、性能测试执行人员、性能评估人员、开发人员、项目经理、用户代表等。
缩略语清单:
缩略语 | 全称 | 说明 |
---|---|---|
1 性能测试概述
1.1 背景
这部分写入一些项目的信息即可。
1.2 测试目标
一、本次测试的目标如下表:
测试需求表
由以上性能需求可知,系统对成功率要求非常高,均为100%,并要求每个进程的处理能力达到20000/分钟。(即在资源保证的前提下,执行一个20000的任务系统需要在1分钟之内完成)
目标1:要求程序A可以处理20000/分钟的业务量;
目标2:要求DB查询程序可以处理20000次/分钟的业务量;
目标3:调度程序的稳定性至关重要;
目标4:***********************************************************
目标5:***********************************************************
…
目标n:***********************************************************
2 测试环境
2.1 硬件环境
2.1.1 测试环境拓扑结构图
2.1.2 测试环境软/硬件配置
据目前已知的测试环境,主要如下:
测试环境资源配置表
2.2 软件环境参数配置说明
测试环境部署过程中一些关键参数的配置。例如数据库配置、线程数、使用的第三方工具是否有限制等,都需要在这部分说明。
3 测试环境差异性分析
这部分阐述测试环境与生产环境的差异和区别,并说明可能产生的影响。
4 测试方法
4.1 测试流程
性能测试计划中的测试方法部分。
4.2 测试工具及性能监控工具
性能测试计划中的测试工具和数据采集部分,这部分是对计划中细化。计划中悬而未决的都将在这部分确定和详细描述。
在测试过程中监控以下数据:
资源采集监控表
测试过程中开发的程序或脚本如下:
开发脚本列表
5 测试脚本开发
这里主要描述测试过程中使用的测试脚本的开发方法和原则,例如是否进行了参数化、关联以及其他一些业务操作。
6 测试用例执行结果
6.1 A程序
6.1.1 并发用户及稳定性测试
测试过程记录与分析:
- C模式,一个进程配置16个线程的结果:
A. 处理速度为:22419/分,处理速度达到需求。
B. 处理总量为400W,数据包大小为32K。
C. 服务器资源变化情况:CPU和内存变化没有出现异常
资源使用情况如下:
2. C模式,一个进程32个线程
A. 处理速度为:44388/分,处理速度达到需求。
B. 处理总量为3360200,数据大小为32K。
C. 服务器资源变化情况:CPU和内存变化没有出现异常
资源使用情况如下:
6.2 B程序
6.2.1 并发用户及稳定性测试
测试过程记录与分析:
C模式,一个进程32个线程
A. 结果描述。。。。。
C模式,10个进程32个线程
A. 结果描述。。。。。
6.3 DB查询服务
6.3.1 场景描述1:一次发送20个查询
该场景是对DB查询的模拟。每次发送20个请求给后台数据库。当TPS(每秒事物通过数)达到19.7时,可以满足每分钟20000的查询请求。
当压力达到TPS=19.7时(每个业务20个查询),结果如下:
整个业务DB查询的平均响应时间0.011s,其中90%的响应时间小于0.013s.
平均响应时间:
TPS数值:
数据库服务器资源使用情况:
CPU占用率大约1%(看13:48以前的数据)
数据库上的IO情况如下:
网络情况如下,对于100M网络该流量很小
6.3.2 场景描述2:一次发送1个查询
略!!!
7 性能测试过程中发现的问题
1) 在测试A程序时,发现某些时间的处理量为0,而且某些时间的处理量很少,使得处理速度为7858/分钟,经开发确认代码存在问题并修改代码后,处理速度达到了21830/分钟;
2) 在测试100个B程序并发处理时,发现程序出现了异常,经开发确认代码存在问题后修改了接口程序,异常情况已经不存在;
3) 。。。。。。。。。
8 性能测试结果分析和建议
A****程序结果分析:
1) 在C模式下,同样是单进程32线程,程序处理数据中存在图片和不存在图片结果差距很大。不存在图片的处理速度为15280/分,存在图片的处理速度为2581/分钟。有图片情况下,单独测试转换的速度为4223/分钟。经测试存储的写速度为100MB/s。测试过程中图片最大不超过8K。由次可以计算出存储并非瓶颈。转换缓慢的原因应该在程序本身。需对程序进行进一步的优化;
2) 在R模式下,不生成图片的情况下,1进程32线程和1进程256线程在运行过程中均达到90%左右。处理速度分别为80350/分钟和81603/分钟。由此可见,虽然R模式修改了代码,但至少证明,在被测系统内部,20000/分是可以达到的。同时也可以分析出,在程序充分运行的情况下,256线程并不比32线程更有优势,反而会由于线程过多导致CPU进行更多的上下文切换而占用CPU时间片。
3) …
4)…
综上所述,对于A程序,目前可以确认的结果是:不带图片处理速度至少可以达到20000/分。对于带图片的处理,无法达到20000/分。
DB****查询结果分析:
该项测试结果远远超过需求20000次/秒且响应时间迅速。
综上所述,整理的测试结果如下:
注:以上结果是在被测系统所运行的软硬件配置下得出的测试结果,无法通过一种环境下的测试结果准确的得出另一环境下的测试结果。