web-dev-qa-db-fra.com

Pourquoi les redémarrages périodiques sont-ils nécessaires pour bien performer?

Nous avons un serveur DB de production sur SQL 2005. Tout fonctionne normalement pendant un moment, mais après quelques semaines, nous voyons une baisse de performance notable. Seul Redémarrer SQL Server apporte des performances à la normale.

Quelque fond:

  • Courir plus de 1200 bases de données (principalement un locataire unique, un locataire multi-locataire). Avant que quiconque confondre ne se déplace dans un seul multi-locataire, il existe des raisons valables de garder cette structure ......
  • La RAM est 16 Go. Après le redémarrage, il ne faut pas trop longtemps pour que SQL Server revienne à 15 Go d'utilisation.
  • Les connexions actives de la DB sont d'environ 80 connexions - que nous ressentons est assez sainement en estimant qu'il existe une piscine de connexion par serveur Web par processus - nous n'avons donc pas de problème de fuite de connexion.

Nous avons essayé plusieurs choses en cas de non-crête: - exécutez DBCC Dropcleanbuffers (avec un point de contrôle) pour effacer le cache de données. Cela n'a aucun effet, il ne précise pas l'un des RAM Usage). - Exécuter des produits libres et Freesystemcache pour effacer les plans de requête et le cache Proc stocké. Aucun effet.

De toute évidence, le redémarrage du serveur SQL n'est pas idéal dans un environnement de production actif. Nous manquons quelque chose. Quelqu'un d'autre passe à travers cela?

Mise à jour: avril-28-2012 toujours lutter contre ce problème. J'ai abaissé la mémoire pour SQL Server à 10 Go, juste pour exclure toute conflit avec le système d'exploitation. Je me rapproche de la rétrécir, mais j'ai besoin d'aide de ma prochaine étape.

Voici ce que j'ai trouvé, après avoir redémarré SQL Server, le fichier de page planant entre 12,3 Go et 12,5 Go. Ça va rester comme ça pendant des jours. Total des threads de serveur passera entre 850 et 930 - également stables et compatibles pendant des jours à la fin (SQLServer est régulièrement entre 55 et 85 de ceux qui dépendent de la circulation).

Ensuite, il y a "un événement". Je n'ai aucune idée de ce que l'événement est, je ne peux pas le voir dans les journaux et je ne vois rien de cohérent le jour de la semaine ou de la durée de la semaine, mais tout le SUDDENT HE PageFile saute à 14,1 ou 14,2.2 Gb, et les fils atteignent entre 1750 et 1785.

Vérification du Perfom Lorsque cela se produit, plus de 900 de ces threads sont SQLServer. Donc, je vais à SP_Who2 pour voir où sont ces threads provenant de ... et il y a juste les connexions de DB 80 ou donc utilisées.

Alors ... Est-ce que quelqu'un a des idées comment je peux localiser où se trouvent les autres threads sur SQL Server et ce qu'ils font?

Mise à jour: juin-01-2012 Combattez toujours le problème. Pour que quiconque lisait cela encore, le problème avec les threads sautant a été résolu. Ceci a été causé par un logiciel de sauvegarde Autodated Comvault. Il créait un thread essayant de sauvegarder des bases de données qui n'étaient plus là (il utilisait une liste de bases de données précédentes) plutôt que de simplement sauvegarder les bases de données actuelles.

Mais - la question reste toujours et nous devons redémarrer chaque semaine, donner ou prendre quelques jours. Travailler avec l'équipe de rackspace pour voir s'ils peuvent perdre n'importe quelle lumière.

22
PaulJ

Vous dites que tout va bien, puis après quelques semaines, la performance goutte. (Généralement, les gens prétendent que les performances tombent rapidement, ou à des moments précis, ou à des intervalles apparemment aléatoires. Cela pourrait signifier de mauvaises performances d'E/S ou de verrouiller des tempêtes ou des requêtes intensives de la CPU fonctionnant à des moments difficiles, ou un travail planifié ou manquant de indexation ou statistiques incorrectes provoquant des requêtes intensives de la CPU ou des lectures de disque. ou d'autres choses.) Les semaines sont inhabituelles.

Mon hypothèse est qu'une autre application sur votre serveur fuit de la mémoire. J'ai vu cela avec un logiciel de virus (tous les logiciels de serveur préférés de DBA) et un logiciel de surveillance 3ème partie. Je vérifierais l'utilisation de la mémoire de SQL Server, au fil du temps, et je saisirais également toute l'utilisation de la mémoire de toutes les autres applications de la boîte. Si vous avez des limites difficiles définies sur l'utilisation de la mémoire de SQL Server et que vous l'avez définie pour ne pas autoriser la pagination, ce sont peut-être d'autres applications qui se font paginer et de manger de la capacité d'E/S.

Ce n'est pas difficile à chercher. Si vous ne gardez pas déjà des métriques sur le serveur, je démarrerais simplement Perfmon et saisirais-la un échantillon toutes les 30 ou 60 minutes. Au bout de quelques jours, vous pouvez voir une autre application d'utilisation de la mémoire à la hausse.

Existe-t-il des messages d'erreur dans le journal SQL Server indiquant que les "parties significatives de SQL Server ont été pagées"? Ce serait aussi un gros indice.

7
darin strait

1200 bases de données, un système d'exploitation et éventuellement autres choses? Ouais, je pense que le serveur lui-même aura besoin de plus de 1 Go de RAM pour fonctionner, en particulier envisageant que, si vous définissez 15 Go en tant que réglage max de la mémoire maximale de SQL Server, il a encore besoin Mémoire supplémentaire en dehors de ces 15 Go pour les fils.

J'accumulerais SQL Server jusqu'à 14 Go pour donner au serveur un peu plus de salle de respiration.

En outre, un exemple donné dans "International SQL Server 2008 Internals and Dépannage" pour les indemnités de mémoire sur un système SQL Server 2008 X64 avec utilitaire de sauvegarde de la troisième partie avec 16 Go de RAM:

  • 2 Go pour Windows
  • 1 Go pour les fils de travailleurs
  • 1 Go pour les AMP, etc.
  • 1 Go pour le programme de sauvegarde
  • 11 Go pour SQL Server

Dans le livre, il montre comment déterminer le nombre maximal de threads que vous pouvez avoir et comment calculer la quantité de mémoire qu'ils vont prendre. Exécutez ceci (changez le type de serveur pour correspondre à votre serveur) pour déterminer la quantité de mémoire que vos threads auront besoin.

declare @servertype int

set @servertype=1
/*
1: x86 (32-bit)
2: x64 (64-bit)
3: IA64

*/

select max_workers_count *
    (
        case @servertype when 1 then .5
            when 2 then 2
            when 3 then 4
            else .5
        end
    )
from sys.dm_os_sys_info
5
DForck42

Si la mémoire de la base de données est répartie de manière uniforme dans toutes les bases de données, vous n'avez que 12,8 MEGS pour chaque base de données (15 * 1024) /1200=12.8. Vous avez besoin de plus de mémoire.

Vous devez examiner pourquoi la performance ralentit. Voyez-vous le verrouillage, le blocage, etc.? Quelles sont les statistiques d'attente?

4
mrdenny

Les commandes DBCC ne vont pas effacer les tampons de mémoire qu'ils ne vont pas reposer la mémoire au système d'exploitation.

Savez-vous que SQL Server prend en réalité la mémoire? Je suggère de rechercher la configuration de la session Perfmon ou de commencer à collecter des informations DMV après un redémarrage pour savoir ce que SQL Server effectue et travaille sur. Notez également que si les utilisateurs font plus de travail que la normale pendant votre temps de collecte (comme le traitement finois, etc.). Exécutez-vous des SSR, des SSIS ou des SSA sur le même serveur?

Vous avez 1200 bases de données sur le système, quelle est la plus grande taille DB que vous avez?

3
user507