J'ai une application ASP.NET 4.0 fonctionnant sur IIS 7.5 sur une machine Windows Server 2008 R2 Enterprise 64 bits avec des tas de RAM, CPU, disque, etc.
Avec chaque requête Web, l'application ASP.NET établit une connexion à un service Web de backend (via des sockets bruts), qui s'exécute sur la même machine.
Problème: il semble y avoir quelque chose qui limite le nombre de connexions simultanées au service Web principal. De manière suspecte, le nombre de connexions simultanées atteint 16.
J'ai trouvé cet article clé de Microsoft expliquant comment modifier les paramètres d'IIS pour accueillir les applications ASP.NET qui font de nombreuses demandes de service Web: http://support.microsoft.com/?id=821268#tocHeadRef
J'ai suivi les recommandations de l'article, mais toujours pas de chance. Le réglage qui est particulièrement intéressant est le maxconnection
réglage, que j'ai même grimpé à 999.
Des idées sur quoi d' autre pourrait être la limitation des connexions?
Remarque: lorsque je coupe IIS du mix et que les clients se connectent directement au service Web backend, il ouvrira avec plaisir autant de connexions que nécessaire, donc je suis sûr que le backend n'est pas le goulot d'étranglement. Ce doit être quelque chose dans IIS / ASP.NET-land.
Voici la section pertinente du machine.config
qui, j'en suis sûr, est en cours de lecture par l'application (vérifiée avec appcmd.exe
):
<system.web>
<processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" />
<httpRuntime minFreeThreads="176" minLocalRequestFreeThreads="152"/>
<httpHandlers />
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
<profile>
<providers>
<add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</profile>
<roleManager>
<providers>
<add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add name="AspNetWindowsTokenRoleProvider" applicationName="/"
type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
</system.web>
<system.net>
<connectionManagement>
<add address="*" maxconnection="999"/>
</connectionManagement>
</system.net>
la source
Réponses:
La plupart des réponses fournies ici concernent le nombre de demandes entrantes vers votre service Web backend, et non le nombre de demandes sortantes que vous pouvez effectuer depuis votre application ASP.net vers votre service backend.
Ce n'est pas votre webservice backend qui limite votre taux de requêtes ici, c'est le nombre de connexions ouvertes que votre application appelante est prête à établir vers le même point de terminaison (même URL).
Vous pouvez supprimer cette limitation en ajoutant la section de configuration suivante à votre fichier machine.config:
Vous pouvez bien sûr choisir un nombre plus raisonnable si vous le souhaitez, par exemple 50 ou 100 connexions simultanées. Mais ce qui précède l'ouvrira jusqu'à max. Vous pouvez également spécifier une adresse spécifique pour la règle de limite d'ouverture ci-dessus plutôt que le «*» qui indique toutes les adresses.
Documentation MSDN pour System.Net.connectionManagement
Une autre excellente ressource pour comprendre ConnectManagement dans .NET
J'espère que ceci résoudra votre problème!
EDIT: Oups, je vois que vous avez la gestion des connexions mentionnée dans votre code ci-dessus. Je laisserai mes informations ci-dessus car elles sont pertinentes pour les futurs demandeurs avec le même problème. Cependant, veuillez noter qu'il existe actuellement 4 fichiers machine.config différents sur la plupart des serveurs à jour!
Il existe .NET Framework v2 fonctionnant à la fois sous 32 bits et 64 bits, ainsi que .NET Framework v4 fonctionnant également sous 32 bits et 64 bits. En fonction des paramètres que vous avez choisis pour votre pool d'applications, vous pouvez utiliser l'un de ces 4 fichiers machine.config différents! Veuillez vérifier les 4 fichiers machine.config généralement situés ici:
la source
machine.config
(64 bits 4.0).Je me rends compte que la question est peut-être assez ancienne, mais vous dites que le backend fonctionne sur le même serveur. Cela signifie sur un port différent, probablement autre que le port par défaut 80.
J'ai lu que lorsque vous utilisez l 'élément de configuration "connectionManagement", vous devez spécifier le numéro de port s'il diffère du 80 par défaut.
LINK: le paramètre maxConnection peut ne pas fonctionner même autoConfig = false dans ASP.NET
Deuxièmement, si vous choisissez d'utiliser la configuration par défaut (adresse = "*") étendue avec votre propre valeur spécifique au backend, vous pouvez envisager de mettre la valeur spécifique en premier! Sinon, si une demande est faite, le * correspond en premier et la valeur par défaut de 2 connexions est prise. Tout comme lorsque vous utilisez la section dans web.config.
LINK: <remove> Élément pour la gestion de la connexion (Paramètres réseau)
J'espère que ça aide quelqu'un.
la source
Serait-il possible que vous utilisiez une référence de service Web basée sur WCF? Par défaut, le ServiceThrottlingBehavior.MaxConcurrentCalls est 16.
Vous pouvez essayer de mettre à jour l'
<serviceThrottling>
élément de comportement de votre référence de service(Notez que je recommande les paramètres ci-dessus.) Consultez MSDN pour plus d'informations sur la configuration d'un
<behavior>
élément approprié .la source
TcpClient
(le service vend des blobs binaires personnalisés, pas WCF / SOAP ou similaire). Ces options de configuration semblent avoir un impact pur sur vous si vous utilisezServiceHost
, nonTcpClient
; est-ce que je manque quelque chose?Avez-vous essayé de définir la valeur de la propriété statique DefaultConnectionLimit par programme?
Voici une bonne source d'informations sur ce véritable casse-tête ... Utilisation des threads ASP.NET sur IIS 7.5, IIS 7.0 et IIS 6.0 , avec des mises à jour pour le framework 4.0.
la source
Consultez la section «Threading» de cette page: http://msdn.microsoft.com/en-us/library/ff647786.aspx , conjointement avec la section «Connexions».
Avez-vous essayé d'augmenter l'attribut maxconnection de votre paramètre processModel?
la source
maxconnection
attribut ne s'applique pas aux appels de service Web locaux . Dans ce cas particulier, le service Web est local, mais nous avons le même problème dans un autre environnement où le service n'est pas local.minLocalRequestFreeThreads
- Ce processus de travail utilise ce paramètre pour mettre en file d'attente les demandes de l'hôte local (où une application Web appelle un service Web sur le même serveur ) si le nombre de threads disponibles dans le pool de threads tombe en dessous de ce nombre. Ce paramètre est similaire à minFreeThreads, mais il ne s'applique qu'aux demandes qui utilisent localhost .minLocalRequestFreeThreads
aussi (voir monmachine.config
dans la question.S'il n'est pas défini dans le service Web ou l'application ou le serveur (apache ou IIS) qui héberge le consommable du service Web, vous pouvez créer des connexions infinies jusqu'à l'échec
la source
tout en faisant des tests de performances, la mesure que j'utilise est RPS, c'est-à-dire combien de requêtes par seconde le serveur peut-il servir dans une latence acceptable.
théoriquement, un serveur ne peut exécuter simultanément autant de requêtes que de cœurs.
Il ne semble pas que le problème soit le modèle de thread d'ASP.net, car il peut potentiellement servir des milliers de rps. Il semble que le problème soit lié à votre application. Utilisez-vous des primitives de synchronisation?
quelle est également la latence de vos services Web, sont-ils très rapides à répondre (en quelques microsecondes), sinon vous voudrez peut-être envisager les appels asynchrones, afin de ne pas bloquer
Si cela ne répond pas à quelque chose, vous voudrez peut-être profiler votre code à l'aide de Visual Studio ou Redgate Profiler
la source