Nous sommes occupés à tester en charge un système OLTP que nous avons développé dans .NET 4.0 et exécutons SQL Server 2008 R2 à l'arrière. Le système utilise des files d'attente SQL Server Service Broker, qui sont très performantes, mais nous connaissons une tendance particulière lors du traitement.
SQL Server traite les demandes à une vitesse fulgurante pendant 1 minute, suivie par environ 20 secondes d'activité d'écriture sur disque accrue. Le graphique suivant illustre le problème.
Yellow = Transactions per second
Blue = Total CPU usage
Red = Sqlsrv Disk Write Bytes/s
Green = Sqlsrv Disk Read Bytes/s
Pendant le dépannage, nous avons essayé ce qui suit sans aucun changement significatif dans le modèle:
- Agent SQL Server arrêté.
- Tué presque tous les autres processus en cours d'exécution (pas d'A / V, SSMS, VS, Windows Explorer, etc.)
- Suppression de toutes les autres bases de données.
- Désactivé tous les minuteurs de conversation (nous n'utilisons aucun déclencheur).
- Déplacé d'une approche basée sur la file d'attente de messages vers une conception de surveillance de table simple / brute.
- Utilisé différentes charges de légères à lourdes.
- Correction de tous les blocages.
Il semble que SQL Server puisse créer son cache et l'écrire sur le disque à des intervalles temporels spécifiques, mais je ne trouve rien en ligne pour soutenir cette théorie.
Ensuite, je prévois de déplacer la solution vers notre environnement de test dédié pour voir si je peux reproduire le problème. Toute aide dans l'intervalle serait grandement appréciée.
Mise à jour 1 Comme demandé, ci-joint un graphique qui inclut les pages de point de contrôle / s , l' espérance de vie de la page et certains compteurs de latence de disque.
Il semble que le point de contrôle (ligne bleu clair) soit à l'origine de la baisse des performances (ligne jaune) que nous observons. ^
La latence du disque reste relativement cohérente pendant le traitement et l'espérance de vie de la page ne semble pas avoir d'effet notable. Nous avons également ajusté la quantité de RAM disponible pour SQL Server, ce qui n'a pas non plus eu un grand effet. La modification du modèle de récupération de SIMPLE
à FULL
n'a également fait aucune différence.
Mise à jour 2 En modifiant «l'intervalle de récupération» comme suit, nous avons réussi à réduire l'intervalle auquel les points de contrôle se produisent:
EXEC sp_configure 'show advanced options',1
GO
RECONFIGURE
GO
EXEC sp_configure 'recovery interval', '30'
GO
RECONFIGURE
GO
EXEC sp_configure 'show advanced options',0
GO
RECONFIGURE
Je ne sais pas si c'est une mauvaise pratique?
FULL
ou BULK_LOGGED
, elle se comporte toujours comme si elle se trouvait SIMPLE
jusqu'à ce que vous effectuiez une sauvegarde complète.