Spring Boot – 限制创建的连接数
我使用Spring Boot开发了一个微服务。 我通过存根后端调用来测试服务的性能。 当我查看线程计数时,我发现在任何时间点创建到服务的最大线程数是20,即使调用的数量要高得多。 对于可以对使用Spring Boot开发的微服务进行的调用次数是否有任何限制。 请您指导我需要遵循哪些步骤来排除/增加服务接受的连接数量?
此设置源自嵌入式容器(tomcat,jetty …)。
Tomcat的线程数
您可以在application.properties中指定此属性
server.tomcat.max-threads=400
你说你计算了20个线程,但是根据这个其他stackoverflow问题/答案 ,使用tomcat的默认线程数应该是200,因为server.tomcat.max-threads的默认值是0.请参阅tomcat的文档 :
此Connector要创建的最大请求处理线程数,因此确定可以处理的最大并发请求数。 如果未指定,则此属性设置为200.如果执行程序与此连接器关联,则忽略此属性,因为连接器将使用执行程序而不是内部线程池执行任务。
此外,该财产:
-
下载 :
server.undertow.worker-threads
-
jetty :
server.jetty.acceptors
您可以在Spring的文档中找到属性列表
虽然接受的答案非常有用,但我最近经历了我认为与原始海报相同的问题。 这是我能找到的与我的经历直接相关的唯一搜索结果,所以我想我会添加我的解决方案,以防它帮助某人。
在我的例子中,观察到的并发限制为20是由org.apache.coyote.http2.Http2Protocol
maxConcurrentStreamExecution
属性的默认设置20强加的。
如果您遇到此问题而且您正在使用HTTP / 2,那么增加maxConcurrentStreamExecution
很有可能会有所帮助。
您可以在Tomcat配置参考中找到更多信息,它实际上表明默认情况下应该将其设置为200(而不是20)。 你肯定可以在org.apache.coyote.http2.Http2Protocol
看到默认设置20,所以我不确定这是一个拼写错误还是只是在嵌入式Tomcat版本中呈现出不同的东西。
Tomcat – maxThreads vs maxConnections
尝试将maxConnections
属性设置为大于10000。
从文档 :
服务器在任何给定时间接受和处理的最大连接数。 达到此数量后,服务器将接受但不处理另一个连接。 此附加连接将被阻止,直到正在处理的连接数低于maxConnections,此时服务器将再次开始接受和处理新连接。 请注意,一旦达到限制,操作系统仍可以接受基于acceptCount设置的连接。 默认值因连接器类型而异。 对于BIO,缺省值是maxThreads的值,除非使用Executor,在这种情况下,缺省值将是执行程序中maxThreads的值。 对于NIO,默认值为
10000
。 对于APR / native,默认值为8192
。请注意,对于Windows上的APR / native,配置的值将减小到1024的最大倍数,小于或等于maxConnections。 这是出于性能原因而完成的。 如果设置为值-1,则禁用maxConnectionsfunction并且不计算连接。
有一个spring boot,tomcat max-connection属性,需要在application.properties文件中设置
server.tomcat.max-connections= # Maximum number of connections that the server will accept and process at any given time.
更多信息请访问这里 , 这里和这里
在Spring Boot 2中增加HTTP / 2的maxConcurrentStreamExecution
(设置为200):
@Bean public WebServerFactoryCustomizer containerCustomizer() { return new WebServerFactoryCustomizer () { @Override public void customize(TomcatServletWebServerFactory factory) { factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { Arrays.stream(connector.getProtocolHandler().findUpgradeProtocols()) .filter(upgradeProtocol -> upgradeProtocol instanceof Http2Protocol) .map(upgradeProtocol -> (Http2Protocol) upgradeProtocol) .forEach(http2Protocol -> http2Protocol.setMaxConcurrentStreamExecution(200)); } }); } }; }