性能与压力测试

2020-06-13  本文已影响0人  runewbie

性能与压力测试

@[toc]

一、性能监控

1、jvm内存模型

2、堆

所有的对象实例以及数组都要在堆上分配是垃圾收集器管理的主要区域,也被称为"GC堆”;也是我们优化最多考虑的地方。堆可以细分为:

垃圾回收

从Java8开始, Hotspot已经完全将永久代(Permanent Generation)移除,取而代之的是个新的区域一元空间(MetaSpace)

3、jconsole与jvisualvm

JDK 的两个小工具 jconsolejvisualvm(升级版的jconsole) ;通过命令行启动,可监控本地和远程应用。远程应用需要配置

jconsole

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、jvisualvm能干什么

监控内存泄露跟踪垃圾回收执行时内存cpu分析线程分析

启动jvisualvm

在这里插入图片描述
在这里插入图片描述
监控内存泄露跟踪垃圾回收执行时内存cpu分析
在这里插入图片描述

线程分析

在这里插入图片描述

2、安装插件方便查看 GC

在这里插入图片描述

安装完插件需要重启 jvisualvm

`在这里插入图片描述`

4、监控指标

开发环境配置:

实体机: 开发和服务运行

在这里插入图片描述
虚拟机: 运行中间件和数据库,内存3G,1核

CentOS-7、Docker、redis、mysql:5.7、elasticsearch:7.4.2、kibana:7.4.2、nginx:1.10

1、中间件指标

nginx:

Gateway:

2、数据库指标

服务压测:

简单服务(不请求数据库)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Gateway+简单服务(不请求数据库)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

全链路(不请求数据库)

在这里插入图片描述
在这里插入图片描述

首页一级菜单渲染(不过网关)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三级分类数据获取

在这里插入图片描述
在这里插入图片描述

首页全量数据获取

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Nginx+Gateway

结果汇总:

压测内容 压测线程数 吞吐量/s 90%响应时间 99%响应时间
Nginx 50 6564 4ms 172ms
Gateway 50 12356 6 19
简单服务 50 14177 4 65
首页一级菜单渲染(未开thymeleaf缓存) 50 515 130 200
首页一级菜单渲染(开启thymeleaf缓存、优化数据库关日志) 50 607/700 101/86 118/151
三级分类数据获取 50 5/19(加索引) 11141/2764 11366/2956
三级分类数据获取(业务逻辑优化) 50 200 398 644
三级分类数据获取(使用redis缓存) 50 684 95 128
首页全量数据获取(优化前/优化后/动静分离后) 50 20/22/550 3426/2522/103 4272/3133/804
Nginx+Gateway 50
Gateway+简单服务 50 4919 21 47
全链路 50 1439 50 80

简单服务:慢的原因,一是DB,二是thymeleaf渲染。通过对比可以看到:

三级分类数据获取:慢的原因,主要是DB,存在遍历查询,多次请求服务的过程,数据库IO频繁,开发环境未关闭debug级别的日志;目前服务尚未使用数据库连接池,可配置数据库连接池进行优化,另外对于三级分类这种不会经常变动的数据,可以选择使用redis缓存起来来提高访问的效率。

首页全量数据获取:慢的原因,通过和首页一级菜单渲染进行对比可以知道,慢的原因主要是静态资源加载慢;目前我们的服务尚未做动静资源的请求分离操作,可以使用nginx做静态资源服务器来进行优化。

结论及优化:

5、 JVM 分析&调优

1、几个常用工具

2、命令示例

3、调优项

1、性能压测-优化-nginx动静分离
在这里插入图片描述

1)上传静态资源到nginx服务器

2)修改nginx配置文件并重启

# 配置静态资源访问路径 
location /static/ {
    root   /usr/share/nginx/html;
}  

3)修改本地代码,删除本地代码路径中的src\main\resources\static文件夹下的静态资源文件,同时修改index.html文件中对静态资源的引用路径。

<script src="/static/index/js/xxx.js" type="text/javascript" charset="utf-8"></script>
<link rel="stylesheet" href="/static/index/css/xxx.css">
<img src="/static/index/img/xxx.jpg" />
2、性能压测-优化-模拟线上应用内存崩溃宕机情况
1、JVM调优-设置商品服务启动参数进行比较,都以50个线程为例:

1)-Xmx100m

在这里插入图片描述
在这里插入图片描述

2)-Xmx512m

设置堆内存最大大小为512m


在这里插入图片描述
在这里插入图片描述

3)-Xmx1024m -Xms1024m -Xmn512m

设置堆内存最大和最小大小为1024m;并设置新生代(Eden+S0+S1)为512m,减少垃圾回收器进行频繁的Minor GC


在这里插入图片描述
在这里插入图片描述
2、模拟线上应用内存崩溃宕机情况

将jmeter的线程数设置到200,将服务的最大堆内存设置到-Xmx100m,进行模拟测试:
服务不可用

在这里插入图片描述

OOM异常

在这里插入图片描述
3、性能压测-优化-优化三级分类数据获取

将数据库多次查询变为一次查询,减少数据库频繁IO,可以看到50个线程,Xmx为100m的情况下,服务的吞吐量达到了200,相比之前图标中只加索引的19,性能提升约10倍

在这里插入图片描述

如果还想要进一步提升性能,就需要考虑使用数据库连接池使用缓存的情况,这个会在后面介绍到。

二、压力测试

压力测试

压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都是为了系统在线上的处理能力稳定性维持在一个标准范围内,做到心中有数。

使用压力测试,我们有希望找到很多种用其他测试方法更难发现的错误。有两种错误类型是:内存泄漏并发与同步

有效的压力测试系统将应用以下这些关键条件重复并发量级随机变化

1、性能指标

2、JMeter

1、JMeter安装

https://jmeter.apache.org/download_jmeter.cgi 下载对应的压缩包,解压运行 jmeter.bat 即可

2、JMeter压测示例

添加线程组——添加请求数:


在这里插入图片描述
在这里插入图片描述

添加取样器——添加请求接口:


在这里插入图片描述 [

添加监听器——观察执行结果:


在这里插入图片描述 在这里插入图片描述

3、JMeter Address Already in use 错误解决

windows 本身提供的端口访问机制的问题。

Windows提供给TCP/IP链接的端口为 1024-5000,并且要四分钟来循环回收他们。就导致我们在短时间内跑大量的请求时将端口占满了。

1.cmd 中,用 regedit 命令打开注册表

2.在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

1,右击 parameters,添加一个新的 DWORD,名字为 MaxUserPor

2.然后双击 MaxUserPort,输入数值数据为 65534,基数选择十进制(如果是分布式运行的话,控制机器和负载机器都需要这样操作哦)

3,修改配置完毕之后记得重启机器才会生效

https://support.microsoft.com/zh-cn/help/196271/when-you-try-to-connect-from-tcp-ports-greater-than-5000-you-receive-t

TCPTimedWaitDelay: 30

上一篇 下一篇

猜你喜欢

热点阅读