web-dev-qa-db-fra.com

Demande AspNetCore (Kestrel) expirée

J'ai la configuration suivante: une API Web s'exécutant dans deux conteneurs Linux (construits sur aspnetcore 2.0.5) derrière un équilibreur de charge d'application (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 à générer des exceptions avec le message "Requête expirée".

La pile d'appels est: 

à 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 () à Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.ReadableBufferAwaitable.GetResult () à Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.d__24.MoveNext () --- Trace de fin de pile depuis l'emplacement précédent où une exception a été levée --- à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () à l'adresse System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche Tâche) à l'adresse Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1.d__2.MoveNext ()

Qu'est-ce qui peut causer cette erreur, qui est en train de définir un délai d'attente, comment puis-je l'explorer davantage?

Edit: Si j’ai essayé de capturer la requête en échec avec fiddler, l’erreur n’est plus générée (peut-être que fiddler ouvre les connexions avec un degré de parallélisme moindre).

6
mslliviu

Une cause possible est due au fonctionnement lié aux E/S, vous bloquez les 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 pas capable de le faire. 

Je pense que si vous utilisez correctement Async/Await, vous pouvez alors servir plus de demandes 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. Pas sûr si Asp.Net Core a cette installation ou pas.

Enfin, puisque vous utilisez le cloud, vérifiez la faisabilité de la mise à niveau de la configuration de votre serveur. Peut être mise à niveau la configuration vous aidera à serveur plus de demandes. Évidemment, cela devrait être le dernier choix. Tout d'abord, concentrez-vous sur l'amélioration des performances de votre application avec le matériel existant. 

0
parag