压力测试

压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都 是为了系统在线上的处理能力和稳定性维持在一个标准范围内,做到心中有数。
使用压力测试,我们有希望找到很多种用其他测试方法更难发现的错误。有两种错误类型是: 内存泄漏,并发与同步
有效的压力测试系统将应用以下这些关键条件:重复并发量级随机变化

一、性能指标

  • 响应时间(ResponseTime: RT)

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

  • HPS(HitsPerSecond) :每秒点击次数,单位是次/秒。
  • TPS(TransactionperSecond):系统每秒处理交易数,单位是笔/秒。
  • QPS(Query perSecond):系统每秒处理查询次数,单位是次/秒。

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

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

金融行业:1000TPS~50000TPS,不包括互联网化的活动 保险行业:100TPS~100000TPS,不包括互联网化的活动
制造行业:10TPS~5000TPS
互联网电子商务:10000TPS~1000000TPS 互联网中型网站:1000TPS~50000TPS
互联网小型网站:500TPS~10000TPS

  • 最大响应时间(MaxResponseTime) 指用户发出请求或者指令到系统做出反应(响应) 的最大时间。
  • 最少响应时间(MininumResponseTime) 指用户发出请求或者指令到系统做出反应(响应)的最少时间。
  • 90%响应时间(90% ResponseTime) 是指所有用户的响应时间进行排序,第 90%的响应时间。
  • 从外部看,性能测试主要关注如下三个指标

吞吐量:每秒钟系统能够处理的请求数、任务数。
响应时间:服务处理一个请求或一个任务的耗时。
错误率:一批请求中结果出错的请求所占比例。

二、JMeter

安装和启动

我们使用JMeter进行压力测试。
https://jmeter.apache.org/download_jmeter.cgi
下载对应的压缩包,解压运行 jmeter.bat 即可。
可修改为中文页面:
image.png

JMeter压测示例:

1、添加线程组
在测试计划中,右键测试计划,添加线程组:
image.png
image.png
线程组参数详解:
线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里 也就是设置多少个线程数。
Ramp-UpPeriod(inseconds)准备时长:设置的虚拟用户数需要多长时间全部启动。如果线程数为 10,准备时长为 2,那么需要 2秒钟启动 10个线程,也就是每秒钟启动 5个线程。
循环次数:每个线程发送请求的次数。如果线程数为 10,循环次数为 100,那么每个线程发送 100次请求。总请求数为 10*100=1000。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。
DelayThread creation until needed:直到需要时延迟线程的创建。
调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远)
持续时间(秒):测试持续时间,会覆盖结束时间
启动延迟(秒):测试延迟启动时间,会覆盖启动时间
启动时间:测试启动时间,启动延迟会覆盖它。当启动时间已过,手动只需测试时当前时间也会覆盖它。
结束时间:测试结束时间,持续时间会覆盖它。

2、添加取样器
然后右键线程组,添加取样器,添加测试http请求:
image.png
image.png
3、添加监听器
在线程组右键,添加取样器,然后查看结果树、汇总报告、聚合报告等:
image.png
4、启动压测、查看分析结果
image.png

l 有错误率同开发确认,确定是否允许错误的发生或者错误率允许在多大的范围内;
l Throughput吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的 往下减,找到最佳的并发数;
l 压测结束,登陆相应的 web服务器查看 CPU等性能指标,进行数据的分析;
l 最大的 tps,不断的增加并发数,加到 tps达到一定值开始出现下降,那么那个值就是最大的 tps。
l 最大的并发数:最大的并发数和最大的 tps是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。
l 压测过程出现性能瓶颈,若压力机任务管理器查看到的 cpu、网络和 cpu都正常,未达到 90%以上,则可以说明服务器有问题,压力机没有问题。
l 影响性能考虑点包括
数据库、应用程序、中间件(tomact、Nginx)、网络和操作系统等方面
l 首先考虑自己的应用属于 CPU密集型还是 IO密集型

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,名字为 MaxUserPort
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

性能监控

1、JVM内存模型

image.png
JVM相关的优化,更多是在运行时数据区的堆。
image.png

2、堆

image.pngimage.pngimage.pngimage.png

3、jconsole与jvisualvm

Jdk 的两个小工具 jconsole、jvisualvm(升级版的 jconsole);通过命令行启动,可监控本地和 远程应用。远程应用需要进行相关配置。
jconsole,jkd8使用cmd窗口,输入jconsole指令运行即可。
我们使用jvisualvm,它的功能更强大。
同样,jkd8也是使用cmd窗口,输入jvisualvm即可。

jvisualvm能做什么及其界面

监控内存泄露,跟踪垃圾回收,执行时内存、cpu 分析,线程分析…
image.png
运行:正在运行的
休眠:sleep
等待:wait
驻留:线程池里面的空闲线程
监视:阻塞的线程,正在等待锁

命令行打开jvisualvm:
image.png
双击要查看的java程序:
image.png

安装插件,方便查看gc

  • cmd启动jvisualvm,
  • 工具->插件
  • 如果出现503错误,可以打开网址https://visualvm.github.io/pluginscenters.html

    1. 然后cmd查看自己的jdk版本,找到对应的:<br /> ![image.png](https://cdn.nlark.com/yuque/0/2022/png/23047184/1645872380578-e30bdef6-aaea-4834-a645-7b871379104e.png#clientId=ue548be21-7f5d-4&from=paste&height=57&id=u5683a126&margin=%5Bobject%20Object%5D&name=image.png&originHeight=114&originWidth=280&originalType=binary&ratio=1&size=32226&status=done&style=none&taskId=u2c4dde60-45b9-4e9e-8eef-0c51b891269&width=140)<br /> 复制下面查询出来的连接,并重新设置上即可。如下图:<br /> ![image.png](https://cdn.nlark.com/yuque/0/2022/png/23047184/1645872478948-99321b27-7ca0-4f6d-881d-7e89c9c3d5d2.png#clientId=ue548be21-7f5d-4&from=paste&height=84&id=u023716db&margin=%5Bobject%20Object%5D&name=image.png&originHeight=168&originWidth=414&originalType=binary&ratio=1&size=60542&status=done&style=none&taskId=ub3dfc6da-ee97-4b81-a832-6ce0d501607&width=207)

然后我们下载Visual GC这个插件:
image.png
然后点击下一步安装即可。
插件安装完成后,重启jvisualvm。
然后就可以看到GC相关:
image.png

监控指标

中间件指标

中间件对性能的影响。

image.png

中间件越多,性能损失越大,大多都损失在网络交互了 。
->所以优化,可以先考虑优化中间件,提高中间件的吞吐量,中间件的每秒传输效率要提高,比如买更好的网线,更好的网卡,使用更高效率的传输协议等。
业务相关优化:
DB相关(mysql优化);
页面渲染(theamleaf缓存等);
静态资源;

一些优化手段,比如:DB查询,给字段加索引,关闭后台打印日志(或者调低打印级别),开启页面渲染缓存,调整jvm内存(伊甸园区、新生代、老年代等),动静资源分离。
编写业务逻辑时,业务代码对性能影响很大,要避免频繁对数据进行连接。

性能优化之nginx动静分离

将要渲染的页面,动态资源和静态资源分离开,以此来提高性能。
把原本在项目路径下的静态资源分离出来,放到nginx中:
image.png
这样使静态资源直接由nginx返回,不用经过后台服务。
这样就需要:
1.所有项目的静态资源,都放在nginx里面;
2.规则: /static/* 这样的所有请求,都由nginx直接返回
这里,页面上所有访问静态资源的地方,都需要加上 /static/ 的前缀,然后要在nginx的配置文件中,配置上静态文件访问,windows的如下:**
image.png

性能优化之JVM分析和调优

通过nginx的动静分离,优化了一些性能,但是通过jvisualvm可以发现,jvm不断的进行gc,老年代几乎已经要满了,每次小gc,老年代都会有一次full gc。 这可以发现,现在所有的慢都来自于老年代的gc。现在的主要优化,应该放在jvm上。

由于现在老年代经常容易爆满,伊甸园区也经常爆满,导致伊甸园区经常进行垃圾回收。
首先,我们把gulimall-product运行到最大内存-Xmx调成1024m,之前为了节省内存,设置为了100m。-Xms最小运行内存也设置为1024,这样子等于固定好了,占用1024m。同时,设置参数-Xmn为512, -Xmn中的n代表新生代,即伊甸园区和幸存者区,把它调大,使其不进行频繁的垃圾回收:
image.png