1.springboot压测调优

通过压测可以找到服务器的上限, ps -ef |grep java找到java的进程号,然后通过pstree -p 12569 | wc -l可以看到当前java的线程数。当我们的压测到达一定数量的时候,请求会报错:

这是可以去看下线程数:

也就是由于server端并发线程数上不去,导致客户端请求被拒。

首先看下spring-configuration-metadata.json文件,springboot内嵌tomcat容器后,很多配置都在这里,比如:

其中,我们需要注意以下参数:

server.tomcat.accept-count:等待队列长度,默认100

server.tomcat.max-connections:最大可被连接数,默认10000

server.tomcat.max-threads:最大工作线程数,默认200

server.tomcat.min-spare-threads:最小工作线程数,默认10

在默认配置下,当连接超过10000后会出现拒绝连接的情况,当并发请求数量超过200+100的时候会拒绝处理。

所以我们可以适当地增加参数:

重启后可以看到,线程数变多了

这时再进行压测,再看线程数:

通过top -H可以看到,资源都在mysql和java上

再看下参数,平均值是非常高的,看吞吐量也可以看出只能承受两百多,这当然是不行的。

 

接下来我们需要知道tomcat的keepAlive,这是长连接,也就是客户端请求完服务端后,连接并不断开,这么做的好处是降低了客户端请求服务端建立、断开连接所消耗的时间,当然也会消耗资源,但由于现在与服务端交互越来越频繁,所以长连接也很有必要,但为了保证资源,所以长连接的失效时间也是需要注意的。

keepAliveTimeOut:多少毫秒后不响应的断开keepalive

maxKeepAliveRequests:多少次请求后keepalive断开失效

但由于spring-configuration-metadata.json中并没有关于keepalive的设置,所以我们需要自己通过代码来定制。

/**
 * 当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,30秒
                protocol.setKeepAliveTimeout(30000);
                //客户端发送超过10000个请求自动断开
                protocol.setMaxKeepAliveRequests(10000);
            }
        });
    }
}

 

对於单web容器上线:

线程数量:4核8G内存单进程调度线程数在800-1000,1000以上会花费大量时间在cpu调度上。

等待队列长度:队列做缓冲池用,但也不能无限长,因为缓冲区也会消耗内存,出队入队也都消耗cpu。

而对于数据库而言,建立索引也会大大提高查询效率,出了插入以外都是一样。对于插入操作后面会进行处理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章