秒杀项目系列之二: jmeter压力测试以及tomcat参数调优

  1. 使用jmeter进行压力测试
    jmeter使用链接
  • 配置http请求参数
    在这里插入图片描述
    在这里插入图片描述
  • 查看结果树
    在这里插入图片描述
  • 查看聚合报告(主要关注95线和TPS吞吐量)
    在这里插入图片描述
  1. 测试压测极限并进行tomcat配置参数调优
  • 将线程数和循环次数设置为较大数,并运行在这里插入图片描述

  • 在阿里云服务器端通过如下命令查看java进程开启的线程数

    # 可以看到java进程id为1381
    [root@iZbp173307hpk4paw146d2Z etc]# ps -ef|grep java
    root        1381       1  1 16:48 ?        00:02:18 java -Xms400m -Xms400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar --spring.config.addition-location=/var/www/miaosha/application.yml
    root        2434    1873  0 19:50 pts/2    00:00:00 grep --color=auto java
    ...
    ...
    [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
    110
    [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
    111
    [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
    112
    [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
    112
    [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
    113
    [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
    113
    [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
    117
    [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
    117
    [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
    

    可以看到线程数的极限数量为120左右,这限制了客户端的请求数.

  • 查看内嵌tomcat配置

    • 使用指令shift+command+O(mac指令)在idea项目搜索spring-configuration-metadata.json文件,有三个文件,选择最大的文件.该文件中配置了一些tomcat的默认参数.主要参数如下:
      在这里插入图片描述
      tomcat最大连接数取决于maxConnections这个值加上acceptCount.当连接数达到最大值maxConnections后,系统会继续接收连接,但不会超过acceptCount的值。
  • 修改阿里云服务器application.yml进行tomcat默认配置调优

    server:
    	port: 8090
    	tomcat:
    		accept-count: 1000   # 等待队列长度
    		max-threads: 200     # 1核2G的最大线程数经验值为200,4核8G经验值为800,如果线程数太多,那么线程切换占用太多时间,反而是个拖累
    		min-spare-threads: 100   # 为了解决突发容量问题,先开100个线程先用着
    
  • 重新启动并进行jmeter测试,看聚合报告结果是否有改善(主要看95线和TPS吞吐量)

    # 查看java进程pid,为1381
    [root@iZbp173307hpk4paw146d2Z miaosha]# ps -ef|grep java
    root        1381       1  0 16:48 ?        00:02:21 java -Xms400m -Xms400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar --spring.config.addition-location=/var/www/miaosha/application.yml
    root        2529    2485  0 20:46 pts/0    00:00:00 grep --color=auto java
    # 杀掉java进程
    [root@iZbp173307hpk4paw146d2Z miaosha]# kill 1381
    # 执行脚本文件启动jar包
    [root@iZbp173307hpk4paw146d2Z miaosha]# ./deploy.sh &
    
  1. 定制化内嵌tomcat开发
  • 除了上面accept-account、max-connections、max-threads、min-spare-threads等springboot中明确指定的tomcat参数,还有一些比较重要的但是spring-configuration-metadata.json文件中并没有明确展示的参数.比如:

    # 避免客户端没什么请求但是却一直保持与服务器连接
    keepAliveTimeOut: 多少毫秒后不响应就断开keepalive
    # 避免DNS攻击等行为
    maxKeepAliveRequests: 多少次请求后keepalive断开失效
    
  • 使用WebServerFactoryCustomizer < ConfigurableWebServerFactory > 定制化内嵌tomcat配置

    package com.kenai.config;
    import org.apache.catalina.connector.Connector;
    import org.apache.coyote.http11.Http11NioProtocol;
    import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
    import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.boot.web.server.ConfigurableWebServerFactory;
    import org.springframework.boot.web.server.WebServerFactoryCustomizer;
    import org.springframework.stereotype.Component;
    
    // 当spring容器中没有TomcatEmbeddedServletContainerFactory这个bean时,会把此bean加载进spring容器中
    @Component
    public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
          
          
        @Override
        public void customize(ConfigurableWebServerFactory factory) {
          
          
            // 使用对应工厂类提供给我们的接口定制化我们的tomcat connector
            ((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
          
          
                @Override
                public void customize(Connector connector) {
          
          
                    Http11NioProtocol protocol = (Http11NioProtocol)connector.getProtocolHandler();
                    // 定制化keepalivetimeout,30s内没有请求,自动断开keepalive连接.默认15s
                    protocol.setKeepAliveTimeout(30000);
                    // 定制化maxKeepAliveRequests,当客户端发送超过10000个请求,则自动断开keepalive连接.默认100
                    protocol.setMaxKeepAliveRequests(10000);
                }
            });
        }
    }
    
  • 修改源码后要重新生成jar包上传到服务器

  1. 容量问题优化方向
  • 单web容器上限

    • 线程数量: 4核8G内存的单进程调度线程数800-1000以上会话费巨大的时间在CPU调度上
    • 等待队列长度: 队列做缓冲池用,但也不能无限长,消耗内存,出队入队也耗CPU. 一般设置为1000-2000
  • mysql数据库QPS容量问题

    • QPS全称Queries Per Second,意思是“每秒查询率”,是一台服务器每秒能够响应的查询次数
    • 主键查询: 千万级别数据: 响应时间1-10毫秒. 主键一般是聚簇索引,另外主键查询容易被缓存命中
    • 唯一索引查询: 千万级别数据: 响应时间10-100毫秒.
    • 非唯一索引查询: 千万级别数据: 响应时间100-1000毫秒.
    • 无索引: 百万级别数据: 响应时间1000毫秒+.
  • mysql数据库TPS容量问题

    • TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。TPS包括一条消息入和一条消息出,加上一次用户数据库访问。
    • QPS和TPS的区别
      QPS基本类似于Tps,但是不同的是,对于一个页面的一次访问,形成一个TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。
      例如:访问一个页面会请求服务器3次,一次放,产生一个“T”,产生3个“Q”
    • 非插入的更新删除操作: 同查询
    • 插入操作: 1w-10w TPS(依赖配置优化)

猜你喜欢

转载自blog.csdn.net/qq_26496077/article/details/112714554
今日推荐