springboot内嵌tomcat调优
在springboot-configuration-metadata.json文件下面,有很多属于springboot得喷子hi属性,以下为tomcat的默认配置属性:
-
server.tomcat.accept-count:等待队列长度,默认100(队列也做缓冲池用,但也不能无限长, 不但消耗内存,而且出队入队也消耗CPU) server.tomcat.max-connections:最大可被连接数,默认10000 server.tomcat.max-threads:最大工作线程数,默认200,线程数不是越多越好,要考虑操作系统上下文切换的开销 server.tomcat.min-spare-threads:最小工作线程数,默认10(用来解决突发的容量问题,需要有一些在工作的线程),操作系统可以有充足的时间反应,先用这10个,不够的再开启就可以
注意: 默认配置下,连接超过10000后出现拒绝连接情况 默认配置下,触发的请求超过200+100后拒绝处理
一条来自网上大佬的经验:4核8G内存单进程调度线程800-1000以上之后会花费巨大的时间在CPU调度上
上面这些配置需要结合服务器配置,包括业务需求合理进行一些配置,我直接再springboot中的yml文件中进行了如下配置:
关于定制化内嵌tomcat开发
-
keepAliveTimeOut:多少毫秒不响应就断开keepalive maxKeepAliveRequests:多少次请求后keepalive断开失效 可以使用WebServerFactoryCustomizer定制化内嵌tomcat配置 package com.zbw.secondskill.config; import org.apache.catalina.connector.Connector; import org.apache.coyote.http11.Http11AprProtocol; 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; /** @ClassName WebServerConfiguration.java @Description //当容器内没有TomcatEmbeddedServletContainerFactory这个bean时,会把此bean加载进spring容器中 @Author ZBW @Date 2020年03月04日 17:33 **/ @Component public class WebServerConfiguration implements WebServerFactoryCustomizer { /** @Param [ConfigurableWebServerFactory factory]->可配置化工厂 @Return void @Description 对tomcat进行定制化 @Author zbw @Time 2020/3/4 17:37 */ @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连接 protocol.setKeepAliveTimeout(30000); //当客户端发送超过10000个请求则自动断开keepalive链接 protocol.setMaxKeepAliveRequests(10000); } }); } }
