通过压测可以找到服务器的上限, 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。
而对于数据库而言,建立索引也会大大提高查询效率,出了插入以外都是一样。对于插入操作后面会进行处理。