web-dev-qa-db-fra.com

délai de connexion croissant pour Tomcat au démarrage du printemps

Comment peut-on augmenter le délai d'attente de sorte que, jusqu'au traitement de la réponse, la demande n'expire pas?

Paramètres Tomcat dans Spring Boot -

server.Tomcat.max-connections=2000
server.Tomcat.max-threads=200
server.connection-timeout=1200000

Les requêtes par seconde ont été portées à constantUsersPerSec(20) during (15) à 300 au cours des 15 secondes et toutes les demandes ont été servies comme indiqué dans le graphique ci-dessous à partir de gatling (en bleu). 

scn.inject(
      constantUsersPerSec(20) during (15), 
    )

Ceci est dû à max-connections = 2000 qui a traité 300 demandes à l'aide de threads de travail 200

Le contrôleur est écrit dans Spring MVC qui renvoie DeferredResult qui effectue le traitement des demandes asynchrones et reprendra donc la réponse une fois que la réponse est traitée.

 Requests Per Sec

Mais même si server.connection-timeout est défini sur le nombre élevé 1200000, il y a beaucoup de 503 vers la fin (rouge)

> status.find.in(200,304,201,202,203,204,205,206,207,208,209), b     78 (100.0%)
ut actually found 503

 Response Per Sec

Gatling.conf est également configuré pour un délai d'expiration plus long -

   timeOut {
      simulation = 8640000 # Absolute timeout, in seconds, of a simulation
    }
    ahc {
      #keepAlive = true                                # Allow pooling HTTP connections (keep-alive header automatically added)
      connectTimeout = 600000                          # Timeout when establishing a connection
      handshakeTimeout = 600000                        # Timeout when performing TLS hashshake
      pooledConnectionIdleTimeout = 600000             # Timeout when a connection stays unused in the pool
      readTimeout = 600000                             # Timeout when a used connection stays idle
      #maxRetry = 2                                    # Number of times that a request should be tried again
      requestTimeout = 600000           
3
fortm

Selon les commentaires de Rcordoval -

Vérifiez cette propriété: spring.mvc.async.request-timeout = # Quantité de Minutes avant l'expiration du traitement de la demande asynchrone 

Ce paramètre aide avec le reste des configurations gatling

spring.mvc.async.request-timeout=1200000

Cependant, la cause principale est que, lorsque les demandes sont nombreuses, tous les threads de travail (200) s'emploient à télécharger des connexions ouvertes (2000) (le contrôleur utilise MultipartFile en tant qu'argument et renvoie un DeferredResult). 

Je pense que DeferredResult se démarque lorsque la logique de traitement des demandes est rapide et que la logique métier est lente (s'exécute sur forkjoin.commonPool). Cela ne convient pas vraiment aux envois MultiPartFile (bloquant et lent) et plus encore lorsque les tailles de fichier sont grandes, car les réponses ne sont pas rapidement reprises (comme on peut le voir dans le graphique de réponse par seconde ci-dessus, après quelques secondes, les réponses recommencent depuis les connexions ouvertes sont 2000 et les travailleurs seulement 200). Si le nombre d'employés augmente, les avantages du traitement asynchrone sont alors atténués.

Dans ce cas, le traitement des demandes (téléchargement et blocage) était lent et la logique métier rapide. les réponses se préparaient, mais tous les threads de travail (200) sont tellement occupés à traiter de plus en plus de demandes que les réponses ne sont pas reprises ni expirées.

Cela justifie probablement d'avoir un pool séparé pour request serve et response resume en traitement asynchrone avec DeferredResult?

0
fortm