一、性能指标
1、响应时间(Response Time:RT)
- 响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。
2、HPS(Hits Per Second)
- 每秒点击次数,单位是次/秒
3、TPS(Transaction Per Second)
- 系统每秒处理交易数,单位是笔/秒
4、QPS(Query Per Second)
- 系统每秒处理查询次数,单位是次/秒。对于互联网业务中,如果某些业务有且仅有一个请求连接,那么 TPS = QPS = HPS,一般情况下用TPS来衡量整个业务流程,用QPS来衡量接口查询次数,用HPS来表示对服务器单击请求。
- 无论TPS、QPS、HPS,此指标是衡量系统处理能力非常重要的指标,越大越好,根据经验,一般情况下:
- 金融行业:1000 TPS ~ 50000 TPS,不包含互联网化的活动
- 保险行业:100 TPS ~ 100000 TPS,不包括互联网化的活动
- 制造行业:10 TPS ~ 5000 TPS
- 互联网电子商务:10000 TPS ~ 1000000 TPS
5、最大响应时间(Max Response Time)
- 指用户发出请求或者指令到系统做出反应(响应)的最大时间
6、最少响应时间(Mininum Response Time)指用户发出请求或者指令到系统做出反应(响应)的最少时间
7、90%响应时间(90% Resource Time)是指所有用户的响应时间进行排序,第90%的响应时间。
总结:性能测试主要的三个指标
1、吞吐量:每秒系统能够处理的请求数、任务数
2、响应时间:服务处理一个请求或一个任务的耗时
3、错误率:一批请求中结果出错的请求所占比率
二、JMeter
- Mac安装JMeter
brew install jmeter, 安装成功后查看版本,5.3,成功!
- 设置语言为中文
1、/usr/local/Cellar/jmeter/5.3/libexec/bin
2、vim jmeter.properties
3、language = zh_CN
- 启动JMeter
终端输入 jmeter
三、JMeter使用
1、添加程序组
添加程序组.png- 线程数:同一时间请求数
- Ramp-Up时间(秒):多长时间执行完线程数
- 循环次数:程序执行次数
2、HTTP请求
HTTP请求.png3、察看结果数
察看结果数.png4、汇总报告
汇总报告.png5、聚合报告
聚合报告.png6、汇总图
汇总图.png7、测试
HTTP请求.png 汇总报告.png 聚合报告.png 汇总图.png四、JMeter分布式系统测试
一、分布式组件
分布式组件.png二、分布式项目测试
- 1、Nginx测试 Nginx测试.png
- 2、Gateway测试 Gateway测试.png
- 3、简单服务
- 简单服务
@ResponseBody
@GetMapping("/test")
public String getTest() {
return "简单服务";
}
简单服务.png
-
4、中间件测试
中间件测试.png
- 中间件越多,吞吐量越低,响应时间越长
- 5、内存影响性能 内存影响.png
五、性能优化
首先考虑自己的应用属于 CPU 密集型 还是 IO密集型
影响性能考虑点包括
- 数据库
- 应用程序
- 中间件(Nginx、Gateway、Tomcat)
- 网络
- 操作系统
六、性能监控
1、JVM内存模型 JVM.png
2、程序计数器(Program Counter Register)
- 记录的是正在执行的虚拟机字节码指令的地址
- 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError的区域
3、虚拟机:VMStack
- 描述的是Java方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,方法接口等信息
- 局部变量表存储了编译期可知的各种基本数据类型、对象引用
- 线程请求的栈深度不够会报 StackOverflowError 异常
- 栈动态扩展的容量不够会报 OutOfMemoryError 异常
- 虚拟机栈是线程隔离的,即每个线程都有自己独立的虚拟机栈
4、本地方法:Native Stack
- 本地方法栈类似于虚拟机栈,只不过本地方法栈使用的是本地方法
5、堆:Heap
- 几乎所有的对象实例都在堆上分配内存
6、堆
所有的对象实例以及数组都要在堆上分配。堆是垃圾收集器管理的主要区域,也被成为"GC堆";也是我们优化最多考虑的地方。
堆可以细分为:
- 新生代
- Eden 空间
- From Survivor 空间
- To Survivor 空间
- 老年代
- 永久代/元空间
- Java8以前永久代,受jvm管理,Java8以后元空间,直接使用物理内存。因此默认情况下,元空间的大小仅受本地内存限制
网友评论