性能与压力测试

性能与压力测试

@[toc]

一、性能监控

1、jvm内存模型

  • 程序计数器 Program Counter Register:

    • 记录的是正在执行的虚拟机字节码指令的地址

    • 此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何OutOfMemoryError的区域

  • 虚拟机栈 VMStack:

2、堆

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

  • 新生代
    • Eden空间
    • From Survivor空间
    • To Survivor空间
  • 老年代
  • 永久代/元空间
    • Java8以前永久代,受jvm管理, java8以后元空间,直接使用物理内存。因此,默认情况下,元空间的大小仅受本地内存限制。

垃圾回收

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

3、jconsole与jvisualvm

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

jconsole

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1、jvisualvm能干什么

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

启动jvisualvm

在这里插入图片描述

在这里插入图片描述

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

线程分析

在这里插入图片描述

  • 运行: 正在运行的
  • 休眠: sleep
  • 等待: wait
  • 驻留: 线程池里面的空闲线程
  • 监视: 阻塞的线程,正在等待锁

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:

  • 计算型
  • 消耗cpu


    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

Gateway:

  • 计算型
  • 比较消耗cpu


    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

2、数据库指标

  • SQL耗时越小越好,一般情况下微秒级别。
  • 命中率越高越好,一般情况下不能低于95%
  • 锁等待次数越低越好,等待时间越短越好。

服务压测:

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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渲染。通过对比可以看到:

  • 首页一级菜单渲染在开启thymeleaf缓存前后吞吐性能提升约17.86%,还是比较明显的。
  • 首页一级菜单渲染访问的时候,在关闭debug日志给where条件列加索引之后,DB请求耗时从原来的6-1085ms,提升至2-8ms,速度提升3-135倍
  • 首页一级菜单渲染开启thymeleaf缓存优化数据库(加索引)关日志之前和之后的对比可以看到吞吐量提升约35.92%

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

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

结论及优化:

  • 中间件越多,性能损失越大,大多都损失在网络交互。可以优化中间件配置,使用更快的硬件资源
  • 业务
    • DB(MySQL服务优化,索引优化)
    • 模板的渲染速度(thymeleaf开发期间是关闭缓存的,服务上线后要开启缓存;模板渲染需要CPU去计算,所以可以使用更好的CPU;服务器内存)
    • 静态资源

5、 JVM 分析&调优

1、几个常用工具

2、命令示例

3、调优项

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

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

  • 在/mydata/nginx/html/路径下创建static/文件夹
  • 将本地代码路径中的src\main\resources\static文件夹下的静态资源文件全部上传到nginx服务器中。

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

  • 修改从nginx的conf.d目录中的 default.conf 文件复制的 pafcmall.conf文件,在 location / { 之前添加静态资源文件访问路径配置:
# 配置静态资源访问路径 
location /static/ {
    root   /usr/share/nginx/html;
}  
  • 重启nginx:docker restart nginx

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

  • js:
<script src="/static/index/js/xxx.js" type="text/javascript" charset="utf-8"></script>
  • css:
<link rel="stylesheet" href="/static/index/css/xxx.css">
  • img:
<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、性能指标

  • 响应时间(Response Time:RT):响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。

  • HPS (Hits Per Second) :每秒点击次数,单位是次秒。

  • TPS (Transaction per Second) :系统每秒处理交易数,单位是笔/秒。

  • QPS (Query per Second) :系统每秒处理查询次数,单位是次/秒。

    对于互联网业务中,如果某些业务有且仅有一个请求连接,那么TPS=QPS=HPS,般情况下用TPS来衡量整个业务流程,用QPS来衡量接口查询次数,用HPS来表示对服务器单击请求。

  • 无论TPS、 QPS、 HPS,此指标是衡量系统处理能力非常重要的指标,越大越好,根据经验,一般情况下:

    金融行业: 1000TPS~50000TPS,不包括互联网化的活动

    保险行业: 100TPS~100000TPS, 不包括互联网化的活动

    制造行业: 10TPS~5000TPS

    互联网电子商务: 10000TPS-1000000TPS

    互联网中型网站: 1000TPS-50000TPS

    互联网小型网站: 500TPSM10000TPS

  • 最大响应时间(Max Response Time):指用户发出请求或者指令到系统做出反应(响应)的最大时间。

  • 最少响应时间(Mninum ResponseTime):指用户发出请求或者指令到系统做出反应(响应)的最少时间。90%响应时间(90% Response Time)是指所有用户的响应时间进行排序,第90%的响应时间。

  • 从外部看,性能测试主要关注如下三个指标:

    吞吐量:每秒钟系统能够处理的请求数、任务数。

    响应时间:服务处理一个请求或一个任务的耗时。

    错误率:一批请求中结果出错的请求所占比例。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354