性能与压力测试
性能指标
- 响应时间:Response Time,RT 指用户从客户端发起一个请求到接收从服务端返回的响应耗费的时间。
- 每秒点击次数:Hits Per Second,HPS
- 每秒处理交易数:Transaction Per Second,TPS
- 每秒处理查询次数:Query Per Second,QPS
- 最大响应时间:Max Response Time,MRT
- 最小响应时间:Mininum Response Time
- 90% 响应时间:90% Response Time
- 错误率:一批请求中出现结果错误的比例
JMeter的安装和使用
安装好之后进入根目录下的 bin/ 目录下,双击 jmeter.bat 开始运行,在选项中切换为中文语言。
在 Test Plan 中添加一个线程组,设置该线程组的属性
这里设置 200 个线程,每个线程循环 100 次,共计 20,000 次访问测试
右击线程组生成一个 http 请求
填写 http/https 协议类型,要访问的服务器名或 ip 地址,服务所在端口号,要测试的接口路径,参数或者请求体等。
这里测试本地服务器上 10001 端口上跑的一个服务的 index 页面,该页面初始化需要查询数据库
添加几个结果分析页面
点击绿色小箭头,开始测试
几分钟后,查看汇总报告
可以看到这 20,000 个样本中测试花费时间的平均值、最小值、最大值、异常、吞吐量等。
查看聚合报告
可以看到这 20,000 个样本中 90%、95%、99% 完成所需时间
测试
注:
- Hello:一个微服务下的小请求 返回一个 hello-world 字符串,不查库
- Gateway:网关微服务,88 端口,接收前端发送的 api/ 开头的请求,功能即进行路由
- Gateway+Hello:通过网关向 Hello 发送请求
- 首页一级菜单:查询数据库一级菜单。SQL 语句为 SELECT (…) FROM pms_category WHERE parent_cid=0。查出 20 多个数据
- 三级分类:stream 流两次循环查库+数据封装,以及其他离谱操作
- 首页全量数据,包括CSS、JS、静态资源的获取
压测内容 | 压测线程数(循环) | 吞吐量/s | 90% 响应时间/ms | 99% 响应时间/ms |
---|---|---|---|---|
Hello | 50 | 20161 | 4 | 9 |
Gateway | 50 | 13584 | 6 | 11 |
Gateway+Hello | 50 | 5005 | 17 | 31 |
首页一级菜单+thymeleaf | 50 | 84 | 629 | 2686 |
三级分类 | 50 | 1.1 | 67342 | 72029 |
首页全量数据 | 未响应 | 未响应 | 未响应 | 未响应 |
– | – | – | – | – |
首页一级菜单打开缓存、日志级别、数据库索引 | 50 | 317 | 0 | 2337 |
三级分类优化、一次查库 | 50 | 6 | 13734 | 14433 |
中间件的优化
业务优化
数据库操作: 查询字段加索引,尽可能少与数据库交互
模板渲染: 打开缓存
静态资源的获取: NGINX 动静分离
日志级别: debug 级别改为 error 级别
jvisualvm 的使用与分析
使用 JDK 自带的工具 jvisualvm 来监控内存、跟踪垃圾回收、跟踪 cpu、跟踪线程。
- cmd 启动。cmd 中直接输入 jvisualvm
模拟内存溢出
JVM 优化
-Xms 1024m : JVM 启动时堆的大小
-Xmx 1024m : JVM 启动状态时堆的最大值
-Xmn 512m : 年轻代的空间大小
通过增大 Eden 区的大小,来减少 YGC 发生的次数