Qu'est-ce que la limitation du nombre de connexions simultanées mon ASP.NET l'application peut faire pour un service web?
J'ai un ASP.NET 4.0 application fonctionnant sur IIS 7.5 sur une version 64 bits de Windows Server 2008 R2 Enterprise machine avec des masses de RAM, CPU, disque, etc.
Avec chaque requête web, la ASP.NET l'application établit une connexion à une interface de service web (via les sockets raw), qui est en cours d'exécution sur la même machine.
Problème: Il semble y avoir quelque chose de limiter le nombre de connexions simultanées sur le serveur de service web. Étrangement, le nombre de connexions simultanées est cadencé à 16.
J'ai trouvé cet article-clé à partir de Microsoft expliquant comment configurer IIS " paramètres pour accueillir ASP.NET les applications qui font beaucoup de demandes de service web: http://support.microsoft.com/?id=821268#tocHeadRef
J'ai suivi l'article de recommendatinos, mais toujours pas de chance. Le paramètre qui est particulièrement intéressant, c'est la maxconnection
paramètre, j'ai même tombé à 999.
Toutes les idées que d'autre pourrait être la limitation de connexions?
Remarque: Quand je coupe IIS le mix et ont les clients de se connecter directement sur le serveur de service web, il se fera un plaisir d'ouvrir autant de connexions que j'ai besoin, donc je suis positif le backend n'est pas le goulot d'étranglement. Il doit être quelque chose dans IIS/ASP.NET-land.
Voici la section pertinente de la machine.config
qui je suis sûr est d'être lu par l'application (vérifié 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>
- a un bon point ici - comment évaluez-vous le nombre de connexions simultanées?
- Je mesure le nombre de connexions simultanées par l'exécution de TCPView sur le serveur pour voir combien de backend connexions sont faites par les processus de traitement IIS.
- Sont les clients Web s'exécutant sur des machines indépendantes ou la même machine? (En vérifiant qu'il n'y a pas de client-côté de limitation de passe.)
- Des machines séparées. 1 connexion client-serveur par machine. Aussi, nous savons qu'il n'y a pas de limitation de quelque part sur le réseau, car lorsque nous avons atteint le backend directement (ce qui se passe sur HTTP ainsi) nous n'allons pas dans le goulot d'étranglement.
- Nous avons eu ce même problème avec une application console qui a appelé un webservice et nécessaire de faire beaucoup d'appels simultanés. Nous avons découvert l'application de console a été la limitation à 2 connexions. Le Paramétrage Du Système.Net.ServicePointManager.DefaultConnectionLimit = 1000; effacé la question, mais maintenant nous sommes en utilisant le même code sur un site, et je me demandais comment ce paramètre concerne les solutions parlé ici. Qui prend la priorité?
- Rob, avez-vous jamais trouver une solution définitive à cette situation?
- Nan 🙁
- Ni la solution à l'aide de maxconnection="65535" ? Dans ASP.NET 4.5 nouvelles sections de configuration peut-être ?
Vous devez vous connecter pour publier un commentaire.
La plupart des réponses fournies ici adresse le nombre de les demandes entrantes à votre backend webservice, pas le nombre de les demandes sortantes vous pouvez faire de votre ASP.net application à votre service principal.
Ce n'est pas votre backend webservice qui est de la limitation de votre taux de demande ici, c'est le nombre de connexions ouvertes de votre application appelante est disposé à établir, à la même extrémité (même URL).
Vous pouvez supprimer cette limitation par adjonction, à la section de configuration de votre machine.fichier de configuration:
Vous pouvez bien sûr choisir un plus nombre raisonnable si vous souhaitez par exemple 50 ou 100 connexions simultanées. Mais le ci-dessus ouvre droit jusqu'à max. Vous pouvez également spécifier une adresse spécifique pour l'ouvrir règle de la limite ci-dessus plutôt que le '*' qui indique toutes les adresses.
La Documentation MSDN pour le Système.Net.connectionManagement
Une autre Grande Ressource pour la compréhension de ConnectManagement dans .NET
Espère que cela résout votre problème!
EDIT: Oups, je vois que vous avez la connexion de gestion mentionné dans votre code ci-dessus. Je vais laisser mes info ci-dessus comme il est intéressant pour les futurs enquêteurs avec le même problème. Cependant, veuillez noter il y a actuellement 4 types de machine.les fichiers de configuration sur le plus à jour des serveurs!
Il est .NET Framework v2 running en vertu à la fois 32 bits et 64 bits ainsi que les .NET Framework v4 également en cours d'exécution en vertu de 32-bit et 64-bit. Selon les paramètres que vous avez choisis pour votre pool d'applications que vous pourrait être l'aide de l'une de ces 4 types de machine.les fichiers de configuration! Veuillez cocher toutes les 4 à la machine.les fichiers de configuration généralement situé ici:
machine.config
(64 bits 4.0).Je me rends compte que la question est peut-être un peu vieux, mais vous dites que le backend est en cours d'exécution sur le même serveur. Cela signifie que sur un port différent, probablement autre que le port 80 par défaut.
J'ai lu que lorsque vous utilisez le "connectionManagement" configuration de l'élément, vous devez spécifier le numéro de port si elle est différente de la valeur par défaut 80.
LIEN: maxConnection paramètre peut ne pas fonctionner même autoConfig = false dans ASP.NET
D'autre part, si vous choisissez d'utiliser la configuration par défaut (adresse="*") étendu avec votre propre backend valeur spécifique, vous pourriez envisager de placer la valeur spécifique de la première! Sinon, si une demande est faite, * correspond à la première et à la valeur par défaut de 2 connexions est pris. Tout comme lorsque vous utilisez la section dans le web.config.
LIEN: <supprimer> Élément pour connectionManagement (Paramètres Réseau)
Espère que cela aide quelqu'un.
Pourrait-il être possible que vous êtes en utilisant un WCF service web de référence? Par défaut, le ServiceThrottlingBehavior.Paramètre est de 16 ans.
Vous pouvez essayer de mettre à jour votre service de référence du comportement
<serviceThrottling>
élément(Notez que je recommande les paramètres ci-dessus.) Voir MSDN pour plus d'informations comment faire pour configurer un approprié
<behavior>
élément.TcpClient
(le service vends binaire gouttes, pas WCF/SAVON ou similaire). Ces options de configuration semble pour être purement impact sur vous si vous utilisezServiceHost
, pasTcpClient
; suis-je raté quelque chose?Avez-vous essayé de définir la valeur de la statique DefaultConnectionLimit propriété par programme?
Ici est une bonne source d'informations sur le vrai mal de tête... ASP.NET l'Utilisation du Thread sur IIS 7.5, IIS 7.0, IIS 6.0, avec des mises à jour de framework 4.0.
Voir le "Thread" l'article de cette page: http://msdn.microsoft.com/en-us/library/ff647786.aspx, en collaboration avec la section "Connexions".
Avez-vous essayé de monter l'attribut maxconnection de votre processModel la mise en?
maxconnection
attribut ne s'applique pas aux local appels de service web. 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 à la file d'attente des demandes de localhost (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 aux requêtes qui utilisent localhost.minLocalRequestFreeThreads
(voir monmachine.config
dans la question.Si elle n'est pas définie dans le service web ou de l'application ou du serveur (apache ou IIS) qui héberge le service web consommables ensuite, vous pouvez créer une infinité de connexions jusqu'à la rupture
tout en faisant des tests de performance, la mesure, je vais par est de RPS, c'est le nombre de requêtes par seconde, peut le serveur de servir dans les temps d'attente acceptable.
théoriquement un serveur ne peut exécuter que de nombreuses demandes en même temps que le nombre de cœurs sur elle..
Il ne semble pas que le problème est ASP.net's modèle de thread, car il peut potentiellement servir à des milliers de rps. Il me semble que le problème pourrait être votre application. Êtes-vous en utilisant toutes les primitives de synchronisation ?
aussi quel est le temps de réponse de vos services web, ils sont très rapide à répondre (en quelques microsecondes), si non, alors vous pourriez envisager des appels asynchrones, de sorte que vous ne finissent blocage
Si cela ne marche pas, le rendement de quelque chose, alors vous voudrez peut le profil de votre code à l'aide de visual studio ou de redgate profiler