Base de données sous une charge plus lourde - Toutes les requêtes SQL commencent à synchroniser après une période de heures / jours
-
02-11-2019 - |
Question
Je fais une application Web qui a connu une forte croissance au cours de la semaine dernière et il semble que ma base de données se saisisse à cause de cela.
Vous pouvez voir que tout semblait être correct jusqu'à environ 3 heures du matin ce matin, puis toutes mes demandes ont commencé à synchroniser. Ce n'est pas la première fois que cela se produit, mais après avoir poussé de nouvelles modifications au serveur, cela recommence à nouveau. Cela ne semble pas se produire sous une faible charge, mais a également fonctionné à une charge élevée pendant des heures parfaitement bien. Je ne pense pas que 3h du matin soit un temps de chargement particulièrement élevé.
Des choses que j'ai faites / pour noter:
Server dédié, MSSQL et j'utilise Nhibernate comme ORM pour générer mes requêtes.
Le serveur est à peu près juste un magasin de données. 99% des requêtes sont des insert / sélections très basiques. J'ai un insert en vrac pour créer une grande quantité d'éléments de playlist.
J'ai activé le lot. Il est défini sur 50 par défaut et 200 si> 1000 éléments de playlist sont sur le point d'être écrits dans la base de données. Cela a réduit les pointes des temps de réponse de ma base de données.
J'ai mon délai d'expiration de commande à 5 secondes. Il a été défini par défaut, 30 secondes, et je ressentais toujours le problème. Le problème semble être resté à l'écart pendant plus longtemps après l'avoir mis à 5 secondes.
J'ai essayé de courir
exec sp_updatestats
Comme décrit ici: https://stackoverflow.com/questions/8602395/timeout-expired-timeout-period-elapsed-prior-to-completon-of-the-operation# Ce qui a montré que certains index sont mis à jour, mais n'ont entraîné aucune différence réelle.J'ai défini le niveau d'isolement de la connexion de mes bases de données sur ReadUnCommitted:
configuration.SetProperty("connection.isolation", "ReadUncommitted");
Je spécifie la base de données par défaut pour les performances nhibernate comme décrit ici:
configuration.SetProperty("default_schema", "[db896d0fe754cd4f46b3d0a2c301552bd6].[dbo]");
Que diable devrais-je chercher à essayer d'obtenir une emprise sur ce qui provoque le verrouillage de ma base de données? Cela ne montre que 1% d'utilisation du processeur, donc je ne pense pas qu'il soit trop taxé. Ce ne devrait pas être une requête de longue date si j'ai 5 secondes de capuchons sur tout. Ce ne sont pas les index. Je manque d'idées.
En termes de requêtes - ce sont toutes des instructions utilisateur sélectionnées. C'est juste un tas de personnes qui essaient de se connecter et d'accéder à leur compte. J'obtiens environ 1000 demandes / 30 minutes pour un utilisateur sélectionné.
Voici quelques informations supplémentaires:
@@VERSION:
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4270.0 (x64) 30 novembre 2012 17:11:43 Copyright (c) Microsoft Corporation Web Edition (64 bits) sur Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor )
Pas de solution correcte