✅P146_性能压测-优化-中间件对性能的影响
监控指标
中间件指标
常用的中间件例如Tomcat、Weblogic等指标主要包括JVM、ThreadLocal、JDBC,具体如下:
- 当前正在运行的线程数不能超过设定的最大值。 一般情况下系统性能较好的情况下, 线程数最小值设置 50 和最大值设置 200 比较合适。
- 当前运行的 JDBC 连接数不能超过设定的最大值。 一般情况下系统性能较好的情况下,JDBC 最小值设置 50 和最大值设置 200 比较合适。
- GC 频率不能频繁, 特别是 FULL GC 更不能频繁, 一般情况下系统性能较好的情况下,JVM 最小堆大小和最大堆大小分别设置 1024M 比较合适。
数据库指标
常用的数据库例如MySQL指标主要包括SQL、吞吐量、缓存命中率、连接数等,具体如下:
- SQL 耗时越小越好, 一般情况下微秒级别。
- 命中率越高越好, 一般情况下不能低于 95%。
- 锁等待次数越低越好, 等待时间越短越好。
压测指标
具体需要压测的参数如下所示,后续压测测试会不断完善这个表格
压测内容 | 压测线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
---|---|---|---|---|
Nginx | 50 | 2335 | 11 | 944 |
Gateway | 50 | 10367 | 8 | 31 |
简单服务 | 50 | 11341 | 8 | 17 |
首页一级菜单渲染 | 50 | 270(db,thymeleaf) | 267 | 365 |
首页渲染(开缓存) | 50 | 290 | 251 | 365 |
首页渲染(开缓存、优化数据库、 关日志) | 50 | 700 | 105 | 183 |
三级分类数据获取 | 50 | 2(db)/8(加索引) | ... | .. |
三级分类( 优化业务) | 50 | 111 | 571 | 896 |
三 级 分 类 ( 使 用redis 作为缓存) | 50 | 411 | 153 | 217 |
首页全量数据获取 | 50 | 7(静态资源) | ||
Nginx+Gateway | 50 | 3126 | 30 | 125 |
Gateway+简单服务 | 50 | 7261 | 10 | 31 |
全链路(nginx->gateway->product服务) | 50 | 800 | 88 | 310 |
压测nginx
创建请求
启动JMeter:双击jmeter.bat
创建线程组,设置参数,
注意,后续所有测试的线程数均设置成50,永远循环!
新建http请求,设置参数
添加监听器
压测开始,查看结果树,
压测报告
汇总报告
聚合报告
Docker中查看nginx占用的内存、cpu使用情况,命令为:docker stats
发现nginx是cpu密集型!
请求路径404问题
问题现象
开始压测后,查看“汇总报告”异常为100%,发现结果树中的请求响应全部为404,找不到路径,
问题原因
通过ip加端口请求,被转发到Nginx,由于cfmall.conf
中配置的server_name cfmall.com;
为域名形式,导致ip请求不到。
问题解决
拷贝default.conf
中默认的server块,粘贴到cfmall.conf
中,文件位置:/mydata/nginx/conf/conf.d
此时cfmall.conf
内容如下:
server {
listen 80;
server_name cfmall.com;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
# 解决nginx代理给网关的时候,会丢失请求的host信息问题
proxy_set_header Host $host;
# 寻找nginx.conf中配置的上游服务cfmall
proxy_pass http://cfmall;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name 192.168.17.130;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
再次压测正常执行!
压测Gateway
HTTP请求
聚合报告显示吞吐量为:20354/sec
使用jvisualvm查看CPU占用与对空间占用情况,Gateway也是CPU密集型,堆内存用不满,调整Eden区的大小,GC的时间会缩短不少,吞吐量会再次增长
压测简单服务请求
新建个方法,cfmall-product/src/main/java/com/gyz/cfmall/product/web/IndexController.java
@ResponseBody
@GetMapping("/hi")
public String hi(){
return "hi";
}
配置网关
浏览器访问:
压测简单服务请求
聚合报告显示吞吐量为:17730/sec
CPU与堆空间使用情况
压测Gateway+简单服务请求
HTTP请求
聚合报告显示吞吐量为:7261/sec
压测全链路请求
HTTP请求
聚合报告显示吞吐量为:18.7/sec
总结
中间件越多,性能损失越大,大多都损失在网络交互了;优化的话,买好的网卡、网线、提升网络的带宽