Notre site fonctionne bien pour 90% de la journée, puis pendant nos heures de pointe lorsque le trafic est environ deux fois plus lourd que la normale, tout ralentit à une rampe. Les temps de chargement de la page qui sont normalement 1 seconde prendre 30 secondes. Vérification de nos journaux d'erreur, on dirait qu'il peut s'agir d'un problème de pool de connexion. Nous avons 3 serveurs Web connectés à 1 SQL Server DB. Le serveur SQL volait moins de 25% d'utilisation sur tous les noyaux. P>
Je regarde le compteur de connexions utilisateur sur notre serveur SQL et voyez que pendant notre pic, nous avons 400 connexions utilisateur, mais les heures exclusives d'environ 120 +. P>
Je suis à peu près sûr que nous utilisons simplement toutes les paramètres par défaut que MS fournit avec notre piscine d'app. Que puis-je faire pour tester pour voir si c'est un problème de pool d'applications? Quels sont les négatifs d'augmenter la taille de la piscine d'applications à 1000 (et comment puis-je faire cela?). P>
Merci! P>
5 Réponses :
Ceci pourrait être lié à des connexions SQL n'ayant pas correctement disposé (retourné dans la piscine). Assurez-vous que vous appelez sqlconnection.Dispose code>. P>
Ou disposer implicitement en mettant la connexion dans en utilisant () {...} code> construction.
Dans mon cas, je ne fermais pas la connexion.
Cela pourrait être dû au fait que la piscine de connexions SQL est épuisée (celle-ci est différente du pool d'applications.) Vous pouvez vérifier que par augmenter la taille de la piscine via la chaîne de connexion: Mais plus probable, votre base de données ne peut pas suivre avec le flux de requêtes entrantes. Cela entraîne la fin de la connexion à leur requête. Ajout d'autres connexions aidera à faire face à des demandes d'éclatement, mais pas à un trafic élevé soutenu. P> Voici quelques suggestions pour améliorer la performance de votre serveur SQL sous une charge élevée soutenue: p> bonne chance, ces choses peuvent être assez complexes! p> p>
Dans mon expérience, il y a 3 types de délais principaux que vous pouvez recevoir de SQL Server:
1) puis redémarrez votre service SQL. BTW, vous pouvez voir combien de threads sont actuellement alloués par SQL Server avec cette commande: P> invalidOperationException code> - une défaillance du client d'obtenir une connexion groupée à partir de sa propre piscine avant le Timeout spécifié sur la chaîne de commande (15 secondes par défaut). La piscine du client est à sa taille maximale et toutes les connexions groupées sont utilisées et restent utilisées avant le délai d'attente.
2) sqlexception code> - délai de connexion. Le pool de connexion du client crée une nouvelle connexion à la base de données, mais la base de données ne répond pas avant le délai d'attente spécifié dans la chaîne de commande (15 secondes par défaut).
3) sqlexception code> - Délai de commande. Une connexion a été obtenue, mais le temps pris pour l'instruction SQL d'exercer la commande dépassait le délai d'attente spécifié sur la propriété CommandTimeout de la commande (30 secondes)
Votre situation d'un serveur effectuant normalement jusqu'à ce que la charge soit ajoutée comme le cas n ° 1. J'ai trouvé les délais d'attente très vite - généralement 2 secondes.
J'ai trouvé la solution à ce sujet pour augmenter les threads maximum de SQL Server. La valeur par défaut est zéro - Laissez SQL Server décider. J'ai vu des cas où un serveur STOUT est assis avec peu d'utilisation de ressources alors qu'elle s'est limitée en allouant trop peu de threads.
Vous pouvez augmenter le réglage de threads max avec cette transaction-SQL:
p>
P> select sum(current_workers_count) from sys.dm_os_schedulers
Quand j'ai reçu cette erreur:
La période de délai d'attente écoulée avant d'obtenir une connexion de la bassin. Cela peut avoir eu lieu car toutes les connexions groupées étaient dans L'utilisation et la taille maximale de la piscine ont été atteintes p> blockQuote>
Il était dû au fait que j'utilisais le
sqlcommand.executequerery () code> méthode au lieu de
sqlcommand.executenonquery () code>. p>.
Par exemple: mon appel de procdre original stocké ressemble à ceci: p>
xxx pré> Le code ci-dessus est ce qui a lancé l'exception. Cependant, modifier l'appel à utiliser exécutenonquery () Correction du problème: P>
using (SqlCommand cmd = new SqlCommand()) { cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandText = "InsertSproc"; cmd.Parameters.AddWithValue("@Value", myValue); cmd.Parameters.AddWithValue("@LoggedDate", myDate); DatabaseManager.instance.ExecuteNonQuery(cmd); }
J'ai eu ce problème avec PowerShell et retour aux requêtes de retour ( invoke-sqlcmd strong> suivi d'une autre Exemple: P> invoke-sqlcmd "insert into testdb..tab1 (cname) select 'x'" -connectiontimeout 1
invoke-sqlcmd "update testdb..tab1 set ctr=ctr+1 where cname='aaa'"
Quelles versions de ASP.NET et SQL Server?
Quand j'ai lu la ligne d'objet d'abord, je pensais que tu étais un sauveteur.