Agrandissement et réduction du pool de mémoires tampons sous NUMA

Cette rubrique décrit le mode d'affectation des pages de mémoire dans le pool de mémoires tampons lors de l'utilisation de l'accès NUMA (Non-uniform memory access). Ces informations vous permettent de comprendre le mode d'utilisation de NUMA dans SQL Server et d'interpréter les compteurs de l'objet nœud de tampon.

Distribution de la mémoire

Chaque nœud physique NUMA dispose d'un nœud de mémoire SQL Server. Les nœuds de mémoire se développent d'une manière autonome mais répartissent la mémoire uniformément. Pour illustrer la distribution de la mémoire locale et non locale dans SQL Server, cette rubrique utilise un exemple qui suppose l'utilisation d'un ordinateur équipé de 16 gigaoctets de mémoire. Les autres applications, dont Windows, ont utilisé une partie de la mémoire de chaque nœud, SQL Server a affecté une partie de la mémoire pour ses processus en dehors du pool de mémoires tampons, et SQL Server dispose de 10 Go de mémoire à attribuer au pool de mémoires tampons. La mémoire du pool de mémoires tampons est répartie en quatre nœuds physiques NUMA (N0, N1, N2 et N3), chacun disposant de la mémoire locale suivante :

  • N0 – 1 Go

  • N1 – 3 Go

  • N2 – 3 Go

  • N3 – 3 Go

Dans la configuration ci-dessus, tous les nœuds finissent par être attribués et utilisent 2,5 Go de mémoire ; cependant, le nœud N0 se retrouve avec 1,0 Go de sa mémoire propre et 1,5 Go de mémoire provenant des autres nœuds.

Attribution de la mémoire au démarrage

Avec NUMA, SQL Server reçoit de la mémoire du système d'exploitation à un taux comparable à un système non-NUMA, même si la mémoire libre initiale est distribuée inégalement entre les nœuds. Le pool de mémoires tampons tente d'obtenir la plus grande quantité de mémoire locale possible auprès de chaque nœud ; toutefois, cette opération est difficile puisque Windows ne possède pas actuellement d'API permettant d'allouer de la mémoire à partir d'un nœud spécifique.

Lorsque la mémoire est attribuée à SQL Server, vous remarquerez peut-être que certains nœuds se voient attribués un grand nombre de pages d'autres nœuds NUMA (appelés pages étrangères). Cependant, ces pages ne sont pas utilisées en cas d'accélération, car elles peuvent être fréquemment transférées au nœud propriétaire et appartenir localement à ce nœud. Lorsque la valeur max server memory est atteinte, certains nœuds peuvent avoir une mémoire étrangère, mais une fois la cible de mémoire atteinte, le pool de mémoires tampons traite la mémoire étrangère et locale d'une manière identique. Par exemple, en cas de mémoire insuffisante, le pool de mémoires tampons ne cherche pas à libérer les pages de mémoire étrangère avant les pages de mémoire locale.

Limitation de la mémoire aux nœuds spécifiques

Si SQL Server a été configuré pour s'exécuter sur un sous-ensemble des nœuds NUMA disponibles, le pool de mémoires tampons ne se limite pas automatiquement à la mémoire sur ces nœuds. Dans ce cas, utilisez l'option max server memory pour limiter le pool de mémoires tampons. Pour des informations sur cette option, consultez Options de mémoire du serveur.

Libération de la mémoire d'un nœud

Avec NUMA, les valeurs max server memory et min server memory sont réparties uniformément dans les nœuds NUMA. Par exemple, si vous affectez 16 Go à max server memory sur le système équipé de quatre nœuds, le pool de mémoires tampons alloue une mémoire de 4 Go sur chaque nœud. Si vous mettez un des nœuds hors ligne en modifiant le paramètre affinity mask, le paramètre max server memory sera redistribué entre les nœuds restants. Par exemple, dans le cas des quatre nœuds précité, si vous mettez deux nœuds hors connexion, les huit Go de mémoire libérés seront distribués uniformément entre les nœuds restants. Étant donné que le pool de mémoires tampons est incapable d'utiliser les pages étrangères, la mémoire distante sera utilisée si les nœuds restants manquent de mémoire. Si vous ne souhaitez pas que SQL Server utilise la mémoire des nœuds qu'il n'utilise plus, vous devez diminuer le paramètre max server memory après avoir mis les nœuds hors connexion.

Pages étrangères

Les nœuds fonctionnent essentiellement d'une manière autonome. Toutes les allocations et désallocations de mémoire du nœud sont effectuées à l'aide de la mémoire associée au nœud. Cependant, si un processus de travail s'exécutant sur le nœud 1 doit accéder à une page de la base de données déjà présente dans la mémoire du nœud N2, celui-ci accède à la mémoire non locale.

Observation de la mémoire locale et de la mémoire étrangère dans le pool de mémoires tampons

Il est possible d'observer le pool de mémoires tampons en affichant l'objet Buffer Node. La mémoire totale du pool de mémoires tampons pour SQL Server est affichée sous la forme du compteur Pages cibles de l'objet Buffer Manager. La mémoire du pool de mémoires tampons de chaque nœud est affichée sous la forme du compteur Pages cibles de l'objet Buffer Node. La mémoire des autres nœuds est affichées sous la forme du compteur Pages étrangères. Pour plus d'informations, consultez SQL Server, objet nœud de tampon et SQL Server, objet Gestionnaire de tampons.

Chaque nœud effectue un point de contrôle de sa propre mémoire

Chaque nœud de mémoire possède son propre thread d'écriture différée. Ce thread est appelé pour les points de contrôle implicites et explicites. Comme un ordinateur multitraitement symétrique (SMP, Symmetric ,Multiprocessing) ne possède qu'un thread de point de contrôle, les thread multiples qui utilisent NUMA connaissent une augmentation de la vitesse du point de contrôle.

Comportement d'analyse de table

Une analyse de table qui s'exécute sur le nœud N1 ne remplit que la mémoire associé à ce nœud, sauf si l'analyse est exécutée en parallèle sur les unités centrales à partir de plusieurs nœuds. Si l'analyse s'exécute exclusivement sur un nœud unique, seules les pages de tampons de ce nœud seront utilisées. Cette opération permet de partitionner la charge de travail d'une application.