9
votes

La période de délai d'attente s'est écoulée avant d'obtenir une connexion de la piscine

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.

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 +.

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?).

Merci!


2 commentaires

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.


5 Réponses :


7
votes

Ceci pourrait être lié à des connexions SQL n'ayant pas correctement disposé (retourné dans la piscine). Assurez-vous que vous appelez sqlconnection.Dispose .


2 commentaires

Ou disposer implicitement en mettant la connexion dans en utilisant () {...} construction.


Dans mon cas, je ne fermais pas la connexion.



5
votes

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: xxx

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.

Voici quelques suggestions pour améliorer la performance de votre serveur SQL sous une charge élevée soutenue:

  • lancer du matériel sur le problème (en particulier la RAM sur le serveur SQL)
  • Attachez le profileur SQL Server sur le serveur, obtenez une trace d'une période de charge élevée et suivez ses index suggérées
  • à partir du journal de trace, examinez de longues requêtes et améliorez celles avec un développeur T-SQL

    bonne chance, ces choses peuvent être assez complexes!


0 commentaires

15
votes

Dans mon expérience, il y a 3 types de délais principaux que vous pouvez recevoir de SQL Server:

1) 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> xxx pré>

puis redémarrez votre service SQL.

P>

BTW, vous pouvez voir combien de threads sont actuellement alloués par SQL Server avec cette commande: P>

select sum(current_workers_count) from sys.dm_os_schedulers


0 commentaires

1
votes

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);
}


0 commentaires

1
votes

J'ai eu ce problème avec PowerShell et retour aux requêtes de retour ( invoke-sqlcmd strong> suivi d'une autre invoke-sqlcmd strong>). Les deux requêtes concernaient des modifications de données. Résolu en ajoutant -connectiontime 1 fort> à l'appel de paramètre.

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'"


0 commentaires