Aumentar o reducir el grupo de búferes en NUMA

En este tema se describe la forma en que se asignan las páginas de memoria del grupo de búferes cuando se utiliza acceso no uniforme a memoria (NUMA). Use esta información para saber cómo SQL Server utiliza NUMA y aprender a interpretar los contadores del objeto buffer node.

Distribución de memoria

Existe un nodo de memoria SQL Server por cada nodo físico NUMA. Los nodos de memoria aumentan de forma independiente unos de otros, pero dividen la memoria de modo uniforme. Para mostrar la distribución de memoria local frente a memoria externa en SQL Server, este tema utiliza un ejemplo que da por supuesto que el equipo tiene 16 gigabytes (GB) de memoria. Otras aplicaciones, entre ellas Windows, han utilizado parte de la memoria de cada nodo, SQL Server ha asignado parte de la memoria a sus procesos fuera del grupo de búferes y SQL Server tiene 10 GB de memoria para asignar al grupo de búferes. La memoria del grupo de búferes se divide entre cuatro nodos físicos NUMA (N0, N1, N2 y N3), cada uno con la siguiente memoria local disponible:

  • N0 – 1 GB

  • N1 – 3 GB

  • N2 – 3 GB

  • N3 – 3 GB

En la configuración anterior, todos los nodos podrían asignar y utilizar 2,5 GB de memoria; sin embargo, el nodo N0 terminará con 1,0 GB de su propia memoria y 1,5 GB de la memoria de otros nodos.

Asignación de memoria durante el inicio

Cuando se utiliza NUMA, SQL Server recibe una cantidad de memoria del sistema operativo similar a la que recibe un sistema no NUMA, incluso si la memoria libre inicial no se distribuye entre los nodos de modo uniforme. El grupo de búferes intenta obtener el máximo de memoria local posible para cada nodo; no obstante, esto es difícil porque Windows no tiene actualmente una API para la asignación de memoria desde un nodo específico.

A medida que la memoria se asigna a SQL Server, se puede ver que algunos nodos reciben muchas páginas de otros nodos NUMA (denominadas páginas externas). Sin embargo, estas páginas no se utilizan durante el arranque porque, con frecuencia, pueden transferirse al nodo propietario y convertirse en locales para ese nodo. Algunos nodos pueden tener memoria externa cuando se alcance el valor de max server memory, pero una vez que se obtiene la memoria de destino, el grupo de búferes tratará de forma idéntica a la memoria local y a la externa. Por ejemplo, en caso de presión de la memoria, el grupo de búferes no realizará ningún esfuerzo para liberar páginas de memoria externa antes que páginas de memoria local.

Limitar la memoria a nodos específicos

Si se ha configurado SQL Server para que se ejecute en un subconjunto de nodos NUMA disponibles, el grupo de búferes no se limitará automáticamente a la memoria de esos nodos. En este caso, utilice la opción max server memory para limitar el grupo de búferes. Para obtener información acerca de max server memory, vea Opciones de memoria del servidor.

Liberar memoria de un nodo

Cuando se utiliza NUMA, los valores max server memory y min server memory se dividen de modo uniforme entre los nodos NUMA. Por ejemplo, si configura max server memory en 16 GB en el sistema con cuatro nodos, el grupo de búferes asigna 4 GB de memoria a cada nodo. Si desconecta uno de los nodos modificando el parámetro affinity mask, el parámetro max server memory se redistribuirá entre los nodos restantes. Así, en el ejemplo anterior de cuatro nodos, si desconecta dos nodos, los 8 GB de memoria libres se distribuirán de modo uniforme entre los nodos restantes. Dado que el grupo de búferes es capaz de utilizar páginas externas, si no hay memoria suficiente en los nodos restantes se utilizará memoria remota. Si desea que SQL Server no utilice memoria de los nodos que no están ya en ejecución, debe reducir el parámetro max server memory después de desconectar los nodos.

Páginas externas

Los nodos funcionan de forma totalmente independiente unos de otros. Todas las asignaciones y cancelaciones de asignación de memoria para un nodo se realizan utilizando la memoria asociada al nodo. Sin embargo, si un trabajo que se ejecuta en el nodo N1 necesita obtener acceso a una base de datos que ya se encuentra en la memoria del nodo N2, tendrá acceso a la memoria no local.

Observar la memoria local frente a la externa en el grupo de búferes

Se puede observar el grupo de búferes mediante el examen del objeto Buffer Node. La memoria total del grupo de búferes para SQL Server se muestra en el contador Páginas de destino del objeto Buffer Manager. La memoria del grupo de búferes para cada nodo se muestra en el contador Páginas de destino del objeto Buffer Node. La memoria de otros nodos se muestra en el contador Páginas externas. Para obtener más información, vea Buffer Node (objeto de SQL Server) y Buffer Manager (objeto de SQL Server).

Cada nodo procesa el punto de comprobación de su propia memoria

Cada nodo de memoria tiene su propio subproceso de escritura diferida. Los puntos de comprobación implícito y explícito llaman a este subproceso. Puesto que un equipo de multiproceso simétrico (SMP) sólo tiene un subproceso de punto de comprobación, los diferentes subprocesos en el uso de NUMA tienen como resultado un aumento de la velocidad del punto de comprobación.

Comportamiento del recorrido de tabla

Un recorrido de tabla que se ejecute en el nodo N1 sólo llenará la memoria asociada al nodo N1, a menos que el recorrido se ejecute en paralelo en las CPU de varios nodos. Si el recorrido se ejecuta exclusivamente en un solo nodo, sólo se utilizarán las páginas de búfer de ese nodo. Esto sirve de ayuda en la partición de la carga de trabajo de una aplicación.