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

  • jettyserver.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)); } }); } }; }