J'ai utilisé un au bas de l'appel de l'appel Stack pour cette ligne de code, le moniteur de performances, indique cet appel: p> est le coupable. p> Peut-on peut-être aider s'il vous plaît expliquer "! L'application est dans .NET 4, publiée sous forme de version, IIS 7, sur Windows Server 2008. P> Merci,
Joey J. Barrett P> P> httphandler code> pour implémenter un service Web léger de poids ciblé pour des performances élevées. Il nécessite un POST CODE> avec type de contenu Application / X-www-Form-URLencodé code>. Le service Web effectue de nombreuses tâches, notamment le déchiffrement, le travail de base de données, la logique commerciale, etc. Lors des tests de charge, le moniteur de performances (fourmis et studio visuelle) pointe vers une seule ligne de code qui prend la majeure partie du temps, en fait de 67%.
3 Réponses :
Le
System.Web.Hosting.UnsafeIISMethods.MgdSyncReadRequest()
Délai de temps survient car IIS tente de lire le flux de demande du client pour récupérer des valeurs de formulaire. Ce flux est soumis à la connexion client et dans certaines causes ne reviendra même pas. J'ai vu des cas où demande.Form bloquerait plus de 5 minutes et cela ferait finalement que IIS jette finalement filetabortexception. p>
Dans notre cas, nous avions un httpmodule qui devait lire via demande.Form Valeurs (ou demander ["Touche"] qui itère également sur les valeurs de formulaire) et il bloquerait aléatoirement sur le serveur et ne reviendrait jamais. J'ai utilisé ce HTTPModule pour suivre les performances d'application sur le côté serveur, ce qui m'a fait comprendre que tout ce que je piste à l'aide de ce module dépendra également de la connectivité du client, ce qui obligerait les résultats d'exécution côté serveur. P>
Pour résoudre ce problème, vous pouvez installer le proxy http inverse devant votre application. Le proxy inverse chargera de la responsabilité de la lecture du flux de clients (et de bloquer un thread coûteux dans votre application) et d'envoyer une demande complète à votre serveur. Cela réduira la charge de votre application, car vous pouvez enregistrer vos threads d'application précieux pour traiter votre charge de travail principale plutôt que de les bloquer pour la lecture des flux de clients. p>
De plus, vous pouvez désactiver HTTPS, la balance de charge et même mettre en cache un contenu statique de votre proxy inverse (en fonction de celui que vous utilisez). P>
J'ai cherché référence référencesource, obtenez-la " solution (ne pas inspecter, peut être): implémente par le lecteur basé sur ASYNC, et gérer le temps de sortie manuellement ... p> p> mgdsyncreadrequest code> méthode bloquée API intérieure intérieure-IIS. Mais élevé géré threadabortexception code>.
Cela signifie qu'un autre thread géré peut être un appel thread.abort () code>. requierTimeOutManager ": P> http://referencesSource.microsoft.com/#system.web/requesttimeoutManager.cs.177 p>
Je serais grandement surpris si le goulot d'étranglement est request.Form Indexier. Par rapport à tout le travail que vous avez décrit cela devrait être négligeable.
Vous pouvez référencer le contexte.Fequest.Form Trop de fois, à la place ... Vous devrez peut-être cloner vos valeurs dans des variables locales
Envisagez d'envoyer en-tête au lieu de la variable de formulaire. Je soupçonne que la collection de formulaires a plus de valeurs et la récupération de l'appel fait l'appel volumineux. Vous pouvez également consulter la CPU cible lorsque vous construisez la solution .. Changer parfois à X86 élimine le goulot d'étranglement Aroung System.web.hosting.unsafeismethods.mgdsyncreArequest () ...