web-dev-qa-db-ja.com

Spring Boot-作成される接続の数の制限

Spring Bootを使用してマイクロサービスを開発しました。バックエンド呼び出しをスタブすることで、サービスのパフォーマンステストを行っていました。スレッド数を見ると、サービスに対して作成されたスレッドの最大数は、実行された呼び出しの数がはるかに多くても、いつでも20であることがわかります。 Spring Bootを使用して開発されたマイクロサービスに対して行うことができる呼び出しの数に関して制限はありますか。サービスが受け入れる接続の数をトラブルシューティング/増加させるために私が従う必要のある手順を教えてください。

30
Punter Vicky

この設定は、埋め込みコンテナ(Tomcat、jetty ...)から派生しています。

Tomcatのスレッド数

Application.propertiesでこのプロパティを指定できます

server.Tomcat.max-threads=400

Server.Tomcat.max-threadsのデフォルト値は0であるため、20個のスレッドをカウントしたと言いますが、この その他のstackoverflow question/answer によると、Tomcatのデフォルトのスレッド数は200になります。 Tomcatのドキュメント

このコネクターによって作成される要求処理スレッドの最大数。したがって、処理できる同時要求の最大数を決定します。指定しない場合、この属性は200に設定されます。executorがこのコネクタに関連付けられている場合、コネクタは内部スレッドプールではなくexecutorを使用してタスクを実行するため、この属性は無視されます。

また、次のプロパティ:

  • undertowserver.undertow.worker-threads

  • jettyserver.jetty.acceptors

プロパティのリストは Springのドキュメント にあります。

38
alexbt

受け入れられた答えは非常に有用ですが、最近、元のポスターと同じ問題だと思うことを経験しました。これは、自分の経験と直接関連する唯一の検索結果であるため、誰かに役立つ場合に備えてソリューションを追加すると思いました。

私の場合、観察された同時実行制限20は、org.Apache.coyote.http2.Http2ProtocolのthemaxConcurrentStreamExecutionプロパティのデフォルト設定の20によって課せられました。

この問題が発生していて、HTTP/2を使用している場合、maxConcurrentStreamExecutionを増やすと役立つ可能性が高くなります。

詳細は Tomcat Configuration Reference で見つけることができます。実際には、これはデフォルトで200(20ではない)に設定する必要があると述べています。ただし、org.Apache.coyote.http2.Http2Protocolでデフォルト設定の20を確実に見ることができるので、これがタイプミスなのか、Tomcatの組み込みバージョンで異なる表示をするだけなのかわかりません。

9
Derek

たぶん、あなたは springboot's config を見ることができます

server.Tomcat.accept-count=100 # Maximum queue length for incoming connection requests when all possible request processing threads are in use.
server.Tomcat.additional-tld-skip-patterns= # Comma-separated list of additional patterns that match jars to ignore for TLD scanning.
server.Tomcat.background-processor-delay=10s # Delay between the invocation of backgroundProcess methods. If a duration suffix is not specified, seconds will be used.
server.Tomcat.basedir= # Tomcat base directory. If not specified, a temporary directory is used.
server.Tomcat.max-connections=10000 # Maximum number of connections that the server accepts and processes at any given time.
server.Tomcat.max-http-header-size=0 # Maximum size in bytes of the HTTP message header.
server.Tomcat.max-http-post-size=2097152 # Maximum size in bytes of the HTTP post content.
server.Tomcat.max-threads=200 # Maximum amount of worker threads.
server.Tomcat.min-spare-threads=10 # Minimum amount of worker threads.
server.Tomcat.port-header=X-Forwarded-Port # Name of the HTTP header used to override the original port value.
server.Tomcat.protocol-header= # Header that holds the incoming protocol, usually named "X-Forwarded-Proto".
server.Tomcat.protocol-header-https-value=https # Value of the protocol header indicating whether the incoming request uses SSL.
server.Tomcat.redirect-context-root=true # Whether requests to the context root should be redirected by appending a / to the path.
server.Tomcat.remote-ip-header= # Name of the HTTP header from which the remote IP is extracted. For instance, `X-FORWARDED-FOR`.
server.Tomcat.resource.cache-ttl= # Time-to-live of the static resource cache.
server.Tomcat.uri-encoding=UTF-8 # Character encoding to use to decode the URI.
server.Tomcat.use-relative-redirects= # Whether HTTP 1.1 and later location headers generated by a call to sendRedirect will use relative or absolute redirects.

4
Bruce

Spring Boot 2でHTTP/2のmaxConcurrentStreamExecution(200に設定)を増やします。

@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> containerCustomizer() {
    return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
        @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));
                }
            });
        }
    };
}
1
oshilan

アクチュエータがある場合は、メトリックを見ることができます

/actuator/metrics/Tomcat.threads.config.max

{
  "name": "Tomcat.threads.config.max",
  "description": null,
  "baseUnit": null,
  "measurements": [{
    "statistic": "VALUE",
    "value": 200.0
  }],
  "availableTags": [{
    "tag": "name",
    "values": ["http-nio-8080"]
  }]
}

Tomcatが作成することにした実際の値は? /actuator/metrics/Tomcat.threads.current

あなたは負荷に応じてそこに10が表示される場合があります

1
Kalpesh Soni