7 votes

La demande d'AspNetCore (Kestrel) a expiré.

J'ai la configuration suivante : une application Web fonctionnant dans deux conteneurs linux (construits sur aspnetcore 2.0.5) derrière un équilibreur de charge d'applications (AWS).

Un client qui fait une demande à cette api en utilisant HttpClient. Le client exécute les appels sur plusieurs tâches en parallèle. Si le nombre de tâches parallèles augmente, l'api commence à lancer des exceptions avec le message "Request timed out".

La pile d'appels est :

sur Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.PipeCompletion.ThrowFailed() à Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.Pipe.GetResult(ReadResult& result) à Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.Pipe.Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.IReadableBufferAwaiter.GetResult() à l'adresse Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.ReadableBufferAwaitable.GetResult() à l'adresse Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.d__24.MoveNext() --- Fin de la trace de la pile précédente System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1.d__2.MoveNext()

Qu'est-ce qui peut provoquer cette erreur, qui fixe un délai d'attente, comment puis-je approfondir la question ?

Edit : Si j'ai essayé fiddler pour capturer la requête défaillante, l'erreur n'est plus levée (peut-être que fiddler ouvre les connexions avec un moindre degré de parallélisme).

0voto

parag Points 1185

Une cause possible est qu'en raison d'une opération liée aux E/S, vous bloquez des threads asp.net. D'après la description du problème, il semble que votre serveur traite les demandes jusqu'à un certain point. Au-delà, il n'est plus en mesure de le faire.

Je pense que si vous utilisez Async/Await correctement, alors vous pouvez servir plus de requêtes simultanées que votre limite actuelle.

Vérifiez également que, par configuration, vous pouvez augmenter le nombre de threads Asp.Net. Asp.Net traditionnel supporte cela. Je ne sais pas si Asp.Net Core dispose de cette fonction ou non.

Enfin, puisque vous fonctionnez en mode cloud, vérifiez la faisabilité de la mise à niveau de votre configuration de serveur. Il se peut que la mise à niveau de la configuration vous permette de traiter un plus grand nombre de demandes. Évidemment, cela devrait être le dernier choix. Concentrez-vous d'abord sur l'amélioration des performances de votre application avec le matériel existant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X