✅P146_性能压测-优化-中间件对性能的影响

gong_yz大约 6 分钟谷粒商城

监控指标

中间件指标

常用的中间件例如Tomcat、Weblogic等指标主要包括JVM、ThreadLocal、JDBC,具体如下:

  • 当前正在运行的线程数不能超过设定的最大值。 一般情况下系统性能较好的情况下, 线程数最小值设置 50 和最大值设置 200 比较合适。
  • 当前运行的 JDBC 连接数不能超过设定的最大值。 一般情况下系统性能较好的情况下,JDBC 最小值设置 50 和最大值设置 200 比较合适。
  • GC 频率不能频繁, 特别是 FULL GC 更不能频繁, 一般情况下系统性能较好的情况下,JVM 最小堆大小和最大堆大小分别设置 1024M 比较合适。

数据库指标

常用的数据库例如MySQL指标主要包括SQL、吞吐量、缓存命中率、连接数等,具体如下:

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

压测指标

具体需要压测的参数如下所示,后续压测测试会不断完善这个表格

压测内容压测线程数吞吐量/s90%响应时间99%响应时间
Nginx50233511944
Gateway5010367831
简单服务5011341817
首页一级菜单渲染50270(db,thymeleaf)267365
首页渲染(开缓存)50290251365
首页渲染(开缓存、优化数据库、 关日志)50700105183
三级分类数据获取502(db)/8(加索引).....
三级分类( 优化业务)50111571896
三 级 分 类 ( 使 用redis 作为缓存)50411153217
首页全量数据获取507(静态资源)
Nginx+Gateway50312630125
Gateway+简单服务5072611031
全链路(nginx->gateway->product服务)5080088310

压测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


总结

中间件越多,性能损失越大,大多都损失在网络交互了;优化的话,买好的网卡、网线、提升网络的带宽