Spring Boot - ограничение на количество созданных соединений

Я разработал микросервис, используя Spring Boot. Я был тестированием производительности, завершая вызовы бэкэнда. Когда я посмотрел количество потоков, я вижу, что максимальное количество потоков, созданных для службы, составляет 20 в любой момент времени, даже если количество выполненных вызовов намного выше. Существуют ли какие-либо ограничения в отношении количества вызовов, которые могут быть сделаны для микросервиса, разработанного с использованием Spring Boot. Пожалуйста, можете ли вы указать, какие шаги мне необходимо выполнить, чтобы устранить/увеличить количество подключений, принятых службой?

Ответы

Ответ 1

Эта настройка получена из встроенного контейнера (tomcat, jetty...).

Количество потоков Tomcat

Вы можете указать это свойство в своем приложении application.properties

server.tomcat.max-threads=400

Вы говорите, что вы посчитали 20 потоков, однако в соответствии с этим fooobar.com/questions/210886/... номер по умолчанию для потока должен быть 200 с tomcat, поскольку значение по умолчанию server.tomcat.max-threads равно 0. См. Документацию tomcat:

Максимальное количество потоков обработки запросов, которые должны быть созданы этим Коннектором, что определяет максимальное количество одновременных запросов, которые могут быть обработаны. Если не указано, этот атрибут установлен в 200. Если исполнитель связан с этим соединителем, этот атрибут игнорируется, поскольку соединитель выполняет задачи с использованием исполнителя, а не пула внутренних потоков.

Кроме того, свойство для:

  • Undertow: server.undertow.worker-threads

  • пристаней: server.jetty.acceptors

Вы найдете список свойств в документации Spring

Ответ 2

Хотя принятый ответ очень полезен, недавно я столкнулся с той же проблемой, что и оригинальный постер. Это единственный результат поиска, который я нашел и который напрямую связан с моим опытом, поэтому я решил добавить свое решение на случай, если оно кому-нибудь поможет.

В моем случае наблюдаемый предел параллелизма 20 был наложен настройкой по умолчанию 20 для свойства maxConcurrentStreamExecution в org.apache.coyote.http2.Http2Protocol.

Если вы столкнулись с этой проблемой и используете HTTP/2, есть большая вероятность, что увеличение maxConcurrentStreamExecution поможет.

Вы можете найти дополнительную информацию в справочнике по настройке Tomcat, в котором фактически указывается, что по умолчанию должно быть установлено значение 200 (а не 20). Вы можете определенно увидеть настройку по умолчанию 20 в org.apache.coyote.http2.Http2Protocol, поэтому я не уверен, является ли это опечаткой или просто чем-то, что выглядит иначе во встроенной версии Tomcat.

Ответ 3

Может быть, вы можете взглянуть на конфигурацию Springboot

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

Tomcat - maxThreads vs maxConnections

Попробуйте установить свойство maxConnections более 10000.

Из документа:

Максимальное количество подключений, которые сервер будет принимать и обрабатывать в любой момент времени. Когда это число будет достигнуто, сервер будет принимать, но не обрабатывать, еще одно соединение. Это дополнительное соединение блокируется до тех пор, пока количество обрабатываемых подключений не опустится ниже maxConnections, после чего сервер снова начнет принимать и обрабатывать новые подключения. Обратите внимание, что как только предел достигнут, операционная система все еще может принимать соединения на основе параметра acceptCount. Значение по умолчанию зависит от типа коннектора. Для BIO значением по умолчанию является значение maxThreads, если не используется Executor, в этом случае значением по умолчанию будет значение maxThreads от исполнителя. Для NIO значение по умолчанию - 10000. Для APR/native значение по умолчанию - 8192.

Обратите внимание, что для APR/native в Windows сконфигурированное значение будет уменьшено до наивысшего кратного 1024, которое меньше или равно maxConnections. Это делается по соображениям производительности. Если установлено значение -1, функция maxConnections отключена и соединения не учитываются.

Есть свойства для весенней загрузки, tomcat max-connection, которая должна быть установлена в файле application.properties

server.tomcat.max-connections= # Maximum number of connections that the server will accept and process at any given time.

Дополнительная информация здесь, здесь и здесь

Ответ 5

Увеличьте maxConcurrentStreamExecution (установить 200) для HTTP/2 в Spring Boot 2:

@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));
                }
            });
        }
    };
}

Ответ 6

Если у вас есть привод, вы можете увидеть показатели

/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 там в зависимости от нагрузки