2 votes

maxConnections ou maxThreads sur tomcat

Je cherche des conseils - j'ai lu les deux autres fils de discussion à ce sujet.

Dans mon fichier server.xml, j'ai deux endroits où maxThreads est défini en deux endroits :

  1. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="100" minSpareThreads="4"/>

ET

  1. <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="100" SSLEnabled="true" scheme="https" secure="true" connectionTimeout="600000" keystoreFile="/usr/local/tomcat/conf/keystore.p12" keystorePass="mypassword" clientAuth="false" sslProtocol="TLS" />

L'erreur que nous rencontrons fréquemment avec notre serveur est : " Timeout " : Pool vide. Impossible d'aller chercher une connexion dans 30 secondes, aucune disponible [size:100;busy:100;idle:0;lastwait:30000]". avant un arrêt fatal du système (la machine se réinitialise et redémarre - sur un cluster AWS ECS)

Lorsque j'augmente la valeur maxThreads à 300 dans la deuxième instance listée ici, nous obtenons le même message d'erreur - je ne suis donc pas sûr que la taille de la connexion ait augmenté. Le comportement du système est différent (la machine ne redémarre pas), mais les utilisateurs ne peuvent pas se connecter - un redémarrage manuel est finalement nécessaire.

Comment puis-je obtenir plus de connexions au système ou maintenir la connectivité aussi élevée que possible ?

Dans d'autres messages sur ce sujet, certains suggèrent de diminuer également le nombre de maxThreads (en supposant qu'ils se terminent rapidement) pour obtenir de meilleures performances.

UPDATE

Dans mon fichier de propriétés de l'application, j'avais les paramètres suivants :

spring.datasource.url=jdbc:postgresql://db####
spring.datasource.username=#####
spring.datasource.password=######
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=60
spring.datasource.tomcat.test-on-borrow=true

spring.jpa.show-sql=false
#spring.jpa.hibernate.ddl-auto=create-drop
#spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.show_sql=false
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

spring.jpa.hibernate.connection.provider_class=org.hibernate.c3p0.internal.C3P0ConnectionProvider
spring.jpa.properties.hibernate.c3p0.min_size=1
spring.jpa.properties.hibernate.c3p0.max_size=30
spring.jpa.properties.hibernate.c3p0.timeout=120
spring.jpa.properties.hibernate.c3p0.max_statements=20

1voto

Piotr P. Karwasz Points 5067

Votre application souffre de l'épuisement du pool de connexions de la base de données : comme vous avez plus de threads actifs dans Tomcat (100) que de connexions disponibles dans le pool de connexions (60), de nombreux threads doivent attendre qu'une connexion soit disponible. Vous devriez avoir au moins autant de connexions à la base de données que de threads actifs. Essayez avec :

spring.datasource.tomcat.max-active=200

Remarque : Depuis que votre <Connector> n'a pas de executor l'attribut <Executor> que vous avez créé n'est pas utilisé et peut être supprimé (sauf si un autre connecteur l'utilise).

Comme il n'y a pas de spring.jpa.hibernate.connection.provider_class le pool de connexion C3P0 que vous essayez de configurer n'est jamais créé : Hibernate utilisera celui qui a été configuré via la propriété spring.datasource.* propriétés. Vous pouvez donc supprimer les propriétés liées à C3P0.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X