java - pivotal - springboot guide
Spring Boot-Límite en el número de conexiones creadas (4)
Aumente maxConcurrentStreamExecution
(set 200) para HTTP / 2 en 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));
}
});
}
};
}
Desarrollé un microservicio utilizando Spring Boot. Estaba realizando pruebas de rendimiento del servicio al detener las llamadas internas. Cuando observé el recuento de hilos, veo que el número máximo de hilos que se crearon para el servicio es 20 en cualquier momento, aunque el número de llamadas realizadas sea mucho mayor. ¿Existe alguna limitación con respecto a la cantidad de llamadas que se pueden realizar a un microservicio desarrollado utilizando Spring Boot? ¿Puede orientarme sobre los pasos que debo seguir para solucionar o aumentar el número de conexiones aceptadas por el servicio?
Esta configuración se deriva del contenedor incrustado (tomcat, jetty ...).
Número de hilos de Tomcat
Puede especificar esta propiedad en su application.properties
server.tomcat.max-threads=400
Dice que contó 20 hilos, sin embargo, de acuerdo con esta otra pregunta / respuesta de , el número predeterminado de hilos debería ser 200 con tomcat, ya que el valor predeterminado de server.tomcat.max-threads es 0. Consulte la documentación de tomcat :
El número máximo de subprocesos de procesamiento de solicitud que creará este Conector, que por lo tanto determina el número máximo de solicitudes simultáneas que se pueden manejar. Si no se especifica, este atributo se establece en 200. Si un ejecutor está asociado con este conector, este atributo se ignora, ya que el conector ejecutará tareas utilizando el ejecutor en lugar de un grupo de subprocesos interno.
Además, la propiedad para:
server.undertow.worker-threads
:server.undertow.worker-threads
embarcadero :
server.jetty.acceptors
Encontrarás la lista de propiedades en la documentación de Spring.
Si bien la respuesta aceptada es muy útil, recientemente experimenté lo que creo que es el mismo problema que el póster original. Este es el único resultado de búsqueda que pude encontrar directamente relacionado con mi experiencia, así que pensé en agregar mi solución en caso de que ayude a alguien.
En mi caso, el límite de concurrencia observado de 20 fue impuesto por la configuración predeterminada de 20 para la propiedad maxConcurrentStreamExecution
en org.apache.coyote.http2.Http2Protocol
.
Si está experimentando este problema y está usando HTTP / 2, existe una buena posibilidad de que el aumento de maxConcurrentStreamExecution
ayude.
Puede encontrar más información en la Referencia de configuración de Tomcat , que en realidad establece que esto debe establecerse en 200 por defecto (no 20). Sin embargo, definitivamente puede ver la configuración predeterminada de 20 en org.apache.coyote.http2.Http2Protocol
, así que no estoy seguro de que sea un error tipográfico o simplemente algo que se presente de manera diferente en la versión integrada de Tomcat.
Tomcat - maxThreads vs maxConnections
Intente establecer la propiedad maxConnections
para que sea más de 10000.
Desde el doc :
El número máximo de conexiones que el servidor aceptará y procesará en un momento dado. Cuando se haya alcanzado este número, el servidor aceptará, pero no procesará, una conexión adicional. Esta conexión adicional se bloqueará hasta que el número de conexiones que se procesen sea inferior a maxConnections, momento en el que el servidor comenzará a aceptar y procesar nuevas conexiones nuevamente. Tenga en cuenta que una vez que se haya alcanzado el límite, el sistema operativo aún puede aceptar conexiones según la configuración de acceptCount. El valor predeterminado varía según el tipo de conector. Para BIO, el valor predeterminado es el valor de maxThreads, a menos que se utilice un Ejecutor, en cuyo caso el valor predeterminado será el valor de maxThreads desde el ejecutor. Para NIO, el valor predeterminado es
10000
. Para APR / native, el valor predeterminado es8192
.Tenga en cuenta que para APR / nativo en Windows, el valor configurado se reducirá al múltiplo más alto de 1024 que sea menor o igual que maxConnections. Esto se hace por razones de rendimiento. Si se establece en un valor de -1, la función maxConnections se desactiva y las conexiones no se cuentan.
Hay unas propiedades para el arranque por resorte, tomcat max-connection, que deben configurarse en el archivo application.properties
server.tomcat.max-connections= # Maximum number of connections that the server will accept and process at any given time.