一.知识回顾
二.性能优化
2.1考虑影响服务性能的因素
数据库、应用程序,中间件(Tomcat,Nginx),网络和操作系统等
我们还得考虑当前的服务属于
- CPU密集型:计算比较影响性能—>添加CPU,加机器
- IO密集型:网络IO,磁盘IO,数据库读写IO,Redis读写IO --》缓存,加固态硬盘,添加网卡
2.2 JVM相关知识的回顾
JVM的内存结构
JVM中对象的存储和GC
三.jconsole和jvisualvm
jconsole和jvisualvm是JDK自带监控工具。可以帮助我们更好的查看服务的相关监控信息,jvisualvm功能会更加的强大些。
3.1 jconsole
搜索jconsole运行命令
进入jconsole的界面
找到需要监控的进程,进入界面
进入对应的进程
界面概览
堆内存信息
线程详细信息
类的详细信息
3.2 jvisualvm
因为是jdk6.0后自带的,我们同样的可以在cmd或者搜索框中找到
进入主页面
找到对应的进程,双击进入
查看对应的监视信息
添加Visual GC插件。
如果下载插件提示如下的错误,需要更新下载地址
先查看Java版本
进入到Visualvm官方网站,进入plugins中
进入插件中心
找到与自己JDK对应的下载地址
点击设置,更新插件中心地址
重新安装我们的Visual GC插件。—》安装成功
安装成功
安装好之后重启jvisualvm,进入监控界面,可以看到我们安装的插件
四. 各个请求链路节点中的压力测试
以下是一个完整的请求链路
4.1 Nginx压力测试
压力测试内容 | 压力测试的线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
Nginx | 100 | 5,184.43 | 33 | 96 |
4.2 网关gateway压测
压力测试内容 | 压力测试的线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
Gateway | 100 | 20,176.133 | 8 | 14 |
4.3 单独模块服务测试
压力测试内容 | 压力测试的线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
单独测试服务 | 100 | 28,208.977 | 5 | 9 |
编写测试接口
先简单的访问测试一下
然后再使用jmeter进行测试
数据展示
4.4 Gateway网关和服务模块
压力测试内容 | 压力测试的线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
Gateway+服务 | 100 | 9,360.128 | 22 | 58 |
网关模块配置请求接口的断言,重启项目
先测试一下通过网关访问服务接口
jmeter测试
结果数据展示:
4.5 Nginx+Gateway+服务
压力测试内容 | 压力测试的线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
Nginx+Gateway+服务 | 100 | 2,437.736 | 49 | 61 |
先简单访问一下是否可行
修改jmeter访问参数
压测效果:
4.6 业务逻辑-一级菜单压测
压力测试内容 | 压力测试的线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
一级菜单 | 100 | 199.876 | 532 | 542 |
设置jmeter测试参数
压测后数据展示
4.7 业务逻辑-三级菜单压测
压力测试内容 | 压力测试的线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
三级菜单 | 100 | 10.562 | 14,556 | 21,744 |
设置jmeter测试参数
压测后数据展示
补充一下:如果还想要测试获取前端页面的情况,可以在jmeter中怎么设置并测试。
4.8 总结上面各压力测试性能比较
压力测试内容 | 压力测试的线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
Nginx | 100 | 5,184.43 | 33 | 96 |
Gateway | 100 | 20,176.133 | 8 | 14 |
单独测试服务 | 100 | 28,208.977 | 5 | 9 |
Gateway+服务 | 100 | 9,360.128 | 22 | 58 |
Nginx+Gateway+服务 | 100 | 2,437.736 | 49 | 61 |
一级菜单 | 100 | 199.876 | 532 | 542 |
三级菜单 | 100 | 10.562 | 14,556 | 21,744 |
4.9 优化改进思路
中间件越多,性能损失就越大,大多数的损失都是在数据的交互
简单的优化:
中间件:单个的效率都很高,串联的中间件越多,影响越大,但是在业务面前其实就比较微弱
业务:
添加索引:
- DB
- 模板页面渲染
压力测试内容 | 压力测试的线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
Nginx | 100 | 5,184.43 | 33 | 96 |
Gateway | 100 | 20,176.133 | 8 | 14 |
单独测试服务 | 100 | 28,208.977 | 5 | 9 |
Gateway+服务 | 100 | 9,360.128 | 22 | 58 |
Nginx+Gateway+服务 | 100 | 2,437.736 | 49 | 61 |
一级菜单 | 100 | 199.876 | 532 | 542 |
三级菜单 | 100 | 10.562 | 14,556 | 21,744 |
一级菜单(DB-索引) | 100 | 62 | 26 | 35 |
三级分类压测(索引) | 100 | 4 | 10745 | 16424 |
首页全量数据(DB-Themleaf-放开缓存) | 100 | 15 | 崩盘 | 崩盘 |
五.Nginx实现动静分离
通过上面的压力测试我们可以发现如果后端服务及处理动态请求又处理静态请求那么他的吞吐量是非常有限的,这时我们可以把静态资源存储在Nginx中。
5.1 静态资源存储
进入nginx挂载目录下的html目录下,新建一个文件,static,然后将压缩好的静态文件上传到该路径下。
上传静态资源
解压静态资源文件
unzip index.zip
删除idea下的index目录
然后修改模板文件中的资源访问路径
启动访问测试一下
5.2 Nginx配置
在Nginx的配置文件中指定static开头的请求的处理方式,保存后重启Nginx服务,然后就可以访问了
再次访问页面,成功