web-dev-qa-db-fra.com

Paramètres de mémoire maximale sur le cluster de Multi-instance SQL Server 2008 R2

  • SQL Server 2008 R2 Cluster multi-instance (sur VMware vSphere 5.1)
  • 2 nœuds, chacun en cours d'exécution 2 instances (4 instances au total)
  • 16GB RAM par nœud.

La seule fois que les instances sont sur le même nœud, c'est quand je corrigez l'autre nœud.

La "mémoire de serveur maximale" de Brent Ozar - Recommandation est de laisser Windows 4 Go ou 10%, selon la fois.

Depuis lors, une grappe, comment dois-je définir la mémoire max sur chaque nœud? Devrais-je traiter chaque serveur autonome? Cela garantirait que la mémoire de chaque noeud n'est pas gaspillée. Cependant, dans une défaillance de nœuds, le total de la mémoire maximale pour les 4 instances dépasserait la mémoire système du nœud unique. Cela causera-t-il des problèmes dans le délai jusqu'à ce que le deuxième noeud récupéré? Dois-je réduire le réglage de la mémoire max sur les 4 instances jusqu'à ce que le nœud secondaire soit récupéré? Ou est suffisamment intelligent SQL Server pour continuer à fonctionner (à l'aide du fichier de page si nécessaire).

6
SomeGuy

Vous devez absolument apporter le maximum d'utilisation du matériel lorsque vous êtes dans une configuration optimale et vous ajustez lorsque vous êtes en mode de maintenance. Et oui, vous aurez un problème tant que les instances (ou les quatre?) Sont actives sur le même noeud. Étant donné qu'un basculement induit un service de service sur le nœud Now-actif, vous pouvez régler la mémoire max de chaque serveur dans cet événement à l'aide d'une procédure de démarrage. J'ai blogué à ce sujet ici, mais pour une raison différente (échec vers un nœud avec une quantité différente de mémoire):

Fondamentalement, il vous suffit de vérifier si les deux instances sont sur le même nœud (et cela nécessitera un serveur lié à configurer dans les deux sens) et ajuster en conséquence. Un exemple très rapide et totalement non testé basé sur mon poteau de blog et en supposant qu'il n'y a qu'une seule instance sur chaque noeud à une heure actuelle (la question est un peu ambiguë si vous avez 2 instances totales ou 4):

CREATE PROCEDURE dbo.OptimizeInstanceMemory
AS
BEGIN
   SET NOCOUNT ON;

   DECLARE
     @thisNode      NVARCHAR(255) = CONVERT(NVARCHAR(255),
                                  SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
     @otherNode     NVARCHAR(255),
     @optimalMemory INT = 12288, -- 12 GB
     @sql           NVARCHAR(MAX);

  SET @sql = N'SELECT @OtherNode = CONVERT(NVARCHAR(255), 
                        SERVERPROPERTY(N''ComputerNamePhysicalNetBIOS''));';

  EXEC [SERVER\INSTANCE].master..sp_executesql @sql, 
    N'@OtherNode NVARCHAR(255) OUTPUT', @OtherNode OUTPUT;

  IF @thisNode = @otherNode
  BEGIN -- we're on the same node, let's make everyone happy
    SET @optimalMemory = 6144;
  END

  SET @sql = N'EXEC sp_configure N''max server memory'', @om;
    RECONFIGURE WITH OVERRIDE;';

  EXEC                   master..sp_executesql @sql, N'@om INT', @optimalMemory;
  EXEC [SERVER\INSTANCE].master..sp_executesql @sql, N'@om INT', @optimalMemory;
END
GO

EXEC [master].dbo.sp_procoption 
  N'dbo.OptimizeInstanceMemory', 'startup', 'true';

Bien sûr, créez-la à nouveau sur l'autre cas, échangeant le nom du serveur lié utilisé.

Cela devient un peu plus complexe si vous devez ajuster selon que vous partagiez le nœud actuel avec 1, 2 ou 3 autres instances.

Notez que cela entraînera d'autres effets secondaires, tels que le nettoyage du cache de plan (dans le cas où l'une des instances n'a pas juste redémarrer ou échouer, Dans ce cas, le cache du plan serait vide de toute façon), mais ceux-ci sont sans doute mieux que de laisser les deux cas pour supposer qu'ils disposent toujours de 12 Go de mémoire pour jouer - il y aura beaucoup de traverser si elles sont très fortement utilisées.

Vous voudrez peut-être également envisager d'autres options telles que Global MaxDop, Numa/CPU Affinité, etc. En fonction de la sensibilité du système à la quantité de ressources disponibles.

10
Aaron Bertrand

Réponse de Wiki communautaire Collecte des réponses partielles à l'origine laissé comme des commentaires sur la question


... (Utilisation du fichier de page si nécessaire).

Jon Seigel : Oui, ça va, mais vous ne voulez pas faire cela . Le meilleur conseil que j'ai entendu (aussi de Brent) est de définir les maximums pour le scénario au mieux et de définir les minimums pour le pire des scénarios.

Kin : Ces liens vous aideront à être scripts:

Mark : Voir Gestion de la mémoire dynamique (TechNet)

2
Paul White 9