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.
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
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
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?