martes, 5 de diciembre de 2017

SQL Server y las arquitecturas UMA y NUMA

Arquitecturas UMA y NUMA

Introducción

Recientemente me preguntaron acerca de NUMA y Microsoft SQL Server, primero traté de explicar sobre eso, sin embargo, realmente, no di una buena explicación, así que busqué entender y luego dar una buena explicación. Entonces, este fue el resultado de mi investigación.
NUMA es un acrónimo de acceso a memoria no uniforme (Non-Uniform Memory Access), pero para comprender qué es esto, también debemos entender qué es UMA que es el acrónimo de acceso a memoria uniforme (Uniform Memory Access). Las arquitecturas de computadora de acceso uniforme a memoria (UMA) a menudo se contrastan con arquitecturas de acceso a memoria no uniforme (NUMA). Entonces podríamos tener una comprensión real y completa sobre estas tecnologías.
Antes de hablar sobre UMA y NUMA, necesitamos definir algunos conceptos básicos que puedan ayudar a comprender.
Memoria caché. - En informática, un caché / kæʃ / KASH, es un componente de hardware o software que almacena datos para que las futuras solicitudes de datos se puedan atender con mayor rapidez; los datos almacenados en un caché pueden ser el resultado de un cálculo anterior o el duplicado de datos almacenados en otro lugar. Se produce un golpe de caché cuando los datos solicitados se pueden encontrar en un caché, mientras que un error de caché ocurre cuando no puede. Las visitas a la memoria caché se sirven leyendo los datos del caché, que es más rápido que volver a calcular un resultado o leer desde un almacén de datos más lento; por lo tanto, cuantas más solicitudes se puedan atender desde la memoria caché, más rápido funcionará el sistema.
Multiprocesamiento. - Es el uso de dos o más unidades centrales de procesamiento (CPU) dentro de un solo sistema informático. El término también se refiere a la capacidad de un sistema para admitir más de un procesador o la capacidad de asignar tareas entre ellos. Hay muchas variaciones en este tema básico, y la definición de multiprocesamiento puede variar según el contexto, principalmente como una función de cómo se definen las CPU (múltiples núcleos en un dado, múltiples matrices en un paquete, múltiples paquetes en una unidad del sistema, etc.)
Computación paralela. - La computación en paralelo es un tipo de cálculo en el que muchos cálculos o la ejecución de procesos se llevan a cabo simultáneamente. Existen varias formas diferentes de computación paralela: nivel de bit, nivel de instrucción, datos y paralelismo de tarea.
Memoria compartida. - Memoria a la que pueden acceder simultáneamente varios programas con la intención de proporcionar comunicación entre ellos o evitar copias redundantes. La memoria compartida es un medio eficiente de pasar datos entre programas. Dependiendo del contexto, los programas pueden ejecutarse en un solo procesador o en múltiples procesadores por separado.
Multiprocesamiento Simétrico. - El SMP implica una arquitectura de software y hardware de multiprocesador donde dos o más procesadores idénticos están conectados a una sola memoria compartida principal, tienen acceso completo a todos los dispositivos de E / S y están controlados por una única instancia del sistema operativo que trata a todos los procesadores por igual, no reservando ninguno para propósitos especiales. La mayoría de los sistemas multiprocesador de hoy usan una arquitectura SMP. En el caso de los procesadores multi-core, la arquitectura SMP se aplica a los núcleos, tratándolos como procesadores independientes.

Acceso a memoria uniforme (UMA)

Podríamos encontrar a través de Internet que UMA (Uniform Memory Access) es una arquitectura de memoria compartida utilizada en computadoras paralelas. Todos los procesadores en el modelo UMA comparten la memoria física de manera uniforme. En una arquitectura UMA, en el tiempo de acceso a una ubicación de memoria no depende de qué procesador realiza la solicitud o qué chip de memoria contiene los datos transferidos. En la arquitectura UMA, cada procesador puede usar una memoria caché privada. Los periféricos también se comparten de alguna manera. El modelo UMA es el más adecuado para aplicaciones de uso general y uso compartido de tiempo por parte de múltiples usuarios. Se puede usar para acelerar la ejecución de un único programa grande en aplicaciones de tiempo crítico.

Es posible identificar tres tipos de arquitecturas UMA:

     UMA utilizando arquitecturas de multiprocesamiento simétrico (SMP) basadas en bus;

o   Involucra una arquitectura de hardware y software multiprocesador donde dos o más procesadores idénticos están conectados a una única memoria compartida, tienen acceso completo a todos los dispositivos de E / S y están controlados por una única instancia del sistema operativo que trata a todos los procesadores por igual. no reservando ninguno para propósitos especiales.
Figura 1. Diagrama SMP (By Ferry24.Milan - Own work, CC BY-SA 3.0)

Debido a que los sistemas SMP son sistemas multiprocesador estrechamente conectados con un grupo de procesadores homogéneos que funcionan independientemente el uno del otro, cada procesador, ejecutando diferentes programas y trabajando en diferentes conjuntos de datos, tiene la capacidad de compartir recursos comunes (memoria, E / S dispositivo, sistema de interrupción, etc.) conectados mediante un bus de sistema o una barra transversal.

        UMA que usa interruptores de barra cruzada;

o   Una colección de interruptores dispuestos en una configuración matricial. Un interruptor de barra transversal tiene múltiples líneas de entrada y salida que forman un patrón cruzado de líneas de interconexión entre las cuales se puede establecer una conexión al cerrar un interruptor ubicado en cada intersección, los elementos de la matriz.

        UMA utilizando redes de interconexión de múltiples etapas.

o   Una clase de redes informáticas de alta velocidad generalmente compuesta de elementos de procesamiento (PE) en un extremo de la red y elementos de memoria (ME) en el otro extremo, conectados por elementos de conmutación (SE). Los elementos de conmutación generalmente están conectados entre sí por etapas, de ahí el nombre.

Acceso a memoria no uniforme (NUMA)


Por otro lado, NUMA (acceso a memoria no uniforme) es un diseño de arquitectura de memoria de computadora utilizado en multiprocesamiento, donde la memoria en el tiempo de acceso depende de la ubicación de la memoria en relación con el procesador. Bajo NUMA, un procesador puede acceder a su propia memoria local más rápido que la memoria no local (memoria local a otro procesador o memoria compartida entre procesadores). Los beneficios de NUMA están limitados a cargas de trabajo, especialmente en servidores donde los datos a menudo se asocian fuertemente con ciertas tareas o usuarios.
Una ventaja muy importante de las arquitecturas NUMA es que lógicamente se siguen escalando desde arquitecturas de multiprocesamiento simétrico (SMP). Fueron desarrollados comercialmente durante la década de 1990 por muchos fabricantes de computadoras como Burroughs (ahora Unisys), Convex Computer (ahora Hewlett-Packard), Honeywell Information Systems Italy (HISI) (ahora Groupe Bull) y otros. Las técnicas desarrolladas por estas compañías aparecieron posteriormente en una variedad de sistemas operativos tipo Unix (sistemas Linux) y, en cierta medida, en Windows NT. La primera implementación comercial de un sistema Unix basado en NUMA fue la familia de servidores Symmetrical Multi Processing XPS-100, diseñada para Honeywell Information Systems Italy.
La tendencia en hardware ha sido hacía más de un bus de sistema, cada uno sirviendo un pequeño conjunto de procesadores. Cada grupo de procesadores tiene su propia memoria y posiblemente sus propios canales de E / S. Sin embargo, cada CPU puede acceder a la memoria asociada con los otros grupos de una manera coherente. Cada grupo se llama nodo NUMA. La cantidad de CPU dentro de un nodo NUMA depende del proveedor del hardware. Es más rápido acceder a la memoria local que a la memoria asociada con otros nodos NUMA. Esta es la razón del nombre, arquitectura de acceso a la memoria no uniforme.
AMD implementó NUMA con su procesador Opteron (2003), utilizando Hyper Transport. Intel anunció la compatibilidad de NUMA para sus servidores x86 e Itanium a fines de 2007 con sus CPU Nehalem y Tukwila.
Sin embargo, es posible encontrar dos enfoques en NUMA:
Soft-NUMA: Los beneficios de soft-NUMA incluyen la reducción de E / S en computadoras con muchas CPU y sin hardware NUMA. Hay una única cadena de E / S para cada nodo NUMA. Dependiendo de estos hilos individuales puede ser un cuello de botella de rendimiento significativo. La configuración de cuatro nodos soft-NUMA proporciona cuatro subprocesos de E / S, lo que podría aumentar el rendimiento.
Hard-NUMA: computadoras con hardware NUMA tienen más de un bus de sistema, cada uno de los cuales sirve un pequeño conjunto de procesadores. Cada grupo de procesadores tiene su propia memoria y posiblemente sus propios canales de E / S, pero cada CPU puede acceder a la memoria asociada con otros grupos de forma coherente. Cada grupo se llama nodo NUMA. La cantidad de CPU dentro de un nodo NUMA depende del proveedor del hardware. El fabricante de hardware puede indicar si la computadora admite hardware NUMA.

El principal beneficio de NUMA es la escalabilidad. La arquitectura NUMA se ha diseñado para superar los límites de escalabilidad de la arquitectura SMP. Con SMP, todo el acceso a la memoria se publica en el mismo bus de memoria compartida. Esto funciona bien para una cantidad relativamente pequeña de CPU, pero no cuando hay docenas, incluso cientos, de CPU que compiten por el acceso al bus de memoria compartida. NUMA alivia estos cuellos de botella al limitar el número de CPU en cualquier bus de memoria y conectando los distintos nodos por medio de una interconexión de alta velocidad.

Conceptos básicos de NUMA


La imagen muestra una posible arquitectura de un sistema NUMA. Podemos ver que los procesadores se conectan al bus o al travesaño mediante conexiones de grosor / número variable. Esto muestra que diferentes CPU tienen diferentes prioridades de acceso a la memoria en función de su ubicación relativa. Limitar el número de accesos a la memoria proporciona la clave para extraer un alto rendimiento de una computadora moderna. Para los procesadores de productos básicos, esto significaba instalar una cantidad cada vez mayor de memoria caché de alta velocidad y usar algoritmos cada vez más sofisticados para evitar errores de caché. Pero el aumento dramático en el tamaño de los sistemas operativos y de las aplicaciones que se ejecutan en ellos generalmente ha abrumado estas mejoras de procesamiento de caché. Los sistemas multiprocesador sin NUMA empeoran el problema considerablemente. Ahora un sistema puede privar a varios procesadores al mismo tiempo, especialmente porque solo un procesador puede acceder a la memoria de la computadora a la vez.
NUMA intenta solucionar este problema proporcionando memoria separada para cada procesador, evitando el rendimiento cuando varios procesadores intentan direccionar la misma memoria. Para problemas que involucran datos distribuidos (comunes para servidores y aplicaciones similares), NUMA puede mejorar el rendimiento en una sola memoria compartida por un factor de aproximadamente el número de procesadores (o bancos de memoria separados). Otro enfoque para abordar este problema, utilizado principalmente en sistemas que no son NUMA, es la arquitectura de memoria multicanal, en la que un aumento lineal en el número de canales de memoria aumenta la concurrencia de acceso a la memoria de forma lineal.
Por supuesto, no todos los datos terminan confinados a una sola tarea, lo que significa que más de un procesador puede requerir los mismos datos. Para manejar estos casos, los sistemas NUMA incluyen hardware o software adicional para mover datos entre bancos de memoria. Esta operación ralentiza los procesadores conectados a esos bancos, por lo que el aumento general de velocidad debido a NUMA depende en gran medida de la naturaleza de las tareas en ejecución.

Cómo Microsoft SQL Server admite NUMA


Los siguientes cambios de clave se introdujeron en Microsoft SQL Server 2005 para aprovechar la arquitectura de acceso a la memoria no uniforme (NUMA).

Agrupación de CPU comunes


Microsoft SQL Server agrupa los planificadores para asignar a la agrupación de CPU, según el límite NUMA de hardware expuesto por Windows. Por ejemplo, un cuadro de 16 vías puede tener 4 nodos NUMA, cada nodo tiene 4 CPU. Esto permite una mayor localidad de memoria para ese grupo de programadores cuando las tareas se procesan en el nodo. Con Microsoft SQL Server, puede subdividir las CPU asociadas con un nodo NUMA de hardware en múltiples nodos de CPU. Esto se conoce como soft-NUMA. Normalmente, subdivide las CPU para dividir el trabajo en los nodos de la CPU.
Cuando un subproceso que se ejecuta en un nodo NUMA de hardware específico asigna memoria, el administrador de memoria de Microsoft SQL Server intenta asignar memoria de la memoria asociada con el nodo NUMA para la localidad de referencia. De forma similar, las páginas del grupo de búferes se distribuyen a través de nodos NUMA de hardware. Es más eficiente para un subproceso acceder a la memoria desde una página de búfer que está asignada en la memoria local que acceder a ella desde la memoria externa.
Cada nodo NUMA (hard-NUMA o soft-NUMA) tiene un puerto de finalización de E / S asociado que se utiliza para manejar la E / S de red. Esto ayuda a distribuir el manejo de E / S de red a través de múltiples puertos. Cuando se establece una conexión de cliente con Microsoft SQL Server, está vinculada a uno de los nodos. Todas las solicitudes por lotes de este cliente se procesarán en ese nodo.
Cada vez que se inicia la instancia de Microsoft SQL Server en un entorno NUMA, el registro de errores de la instancia contiene mensajes informativos que describen la configuración NUMA.

Node configuration: node 0: CPU mask: 0x000000000000000f:0 Active CPU mask: 0x000000000000000f:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.

Si tiene hardware NUMA, puede estar configurado para usar memoria intercalada en lugar de NUMA. En ese caso, Windows y, por lo tanto, Microsoft SQL Server no lo reconocerá como NUMA. Ejecute la siguiente consulta para encontrar la cantidad de nodos de memoria disponibles para Microsoft SQL Server:
SELECT DISTINCT memory_node_id
FROM sys.dm_os_memory_clerks

Si Microsoft SQL Server devuelve solo un único nodo de memoria (nodo 0), o bien no tiene hardware NUMA o el hardware está configurado como entrelazado (no NUMA). Si se cree que el hardware NUMA está configurado incorrectamente, póngase en contacto con su proveedor de hardware para habilitar NUMA. Microsoft SQL Server ignora la configuración NUMA cuando el hardware NUMA tiene cuatro o menos CPU y al menos un nodo tiene una sola CPU.

Crecimiento y reducción del pool de buffer bajo NUMA


Este tema describe cómo se asignan las páginas de memoria del grupo de búferes cuando se utiliza acceso a memoria no uniforme (NUMA). Utilice esta información para comprender cómo Microsoft SQL Server usa NUMA y para comprender cómo interpretar los contadores del objeto del nodo de búfer.

Distribución de la memoria


Hay un nodo de memoria de Microsoft SQL Server para cada nodo NUMA físico. Los nodos de memoria crecen independientemente el uno del otro, pero dividen la memoria de manera uniforme. Para mostrar la distribución de memoria local .vs. extranjera en Microsoft SQL Server, este tema usa un ejemplo que supone que la computadora tiene 16 gigabytes (GB) de memoria. Otras aplicaciones, incluido Windows, han consumido parte de la memoria de cada nodo, Microsoft SQL Server ha asignado algo de memoria para sus procesos fuera del grupo de búferes, y Microsoft 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 NUMA físicos, 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 eventualmente asignarán y usarán 2.5 GB de memoria; sin embargo, el nodo N0 terminará con 1.0 GB de memoria propia y 1.5 GB de memoria de otros nodos.

Asignación de memoria al inicio


Al usar NUMA, Microsoft SQL Server recibe memoria del sistema operativo a una velocidad comparable a la de un sistema que no es NUMA, incluso si la memoria libre inicial se distribuye de manera desigual entre los nodos. El grupo de búferes intenta obtener tanta memoria local para cada nodo como sea posible; sin embargo, esto es difícil porque Windows actualmente no tiene una API para asignar memoria desde un nodo específico.
Como la memoria está asignada a Microsoft SQL Server, puede observar que algunos nodos reciben muchas páginas de otros nodos NUMA (llamados páginas extranjeras). Sin embargo, estas páginas no se utilizan durante la aceleración porque con frecuencia se pueden transferir al nodo propietario y convertirse en locales de ese nodo. Cuando se alcanza el valor de la memoria máxima del servidor, algunos nodos pueden tener memoria externa, pero una vez que se alcanza el objetivo de la memoria, el grupo de búferes tratará la memoria local y extranjera de forma idéntica. Por ejemplo, bajo la presión de la memoria, el grupo de búferes no hará ningún esfuerzo para liberar páginas de memoria extranjeras antes de páginas de memoria local.

Limitar la memoria a nodos específicos


Si Microsoft SQL Server se ha configurado para ejecutarse en un subconjunto de los nodos NUMA disponibles, el grupo de búferes no se limitará automáticamente a la memoria en esos nodos. En este caso, use la opción max server memory para limitar el grupo de búferes.

Liberando memoria de un nodo


Cuando se usa NUMA, la memoria máxima del servidor y los valores mínimos de la memoria del servidor se dividen de manera uniforme entre los nodos NUMA. Por ejemplo, si configura la memoria máxima del servidor para que sea de 16 GB en el sistema con cuatro nodos, el grupo de búferes asigna 4 GB de memoria en cada nodo. Si quita uno de los nodos fuera de línea cambiando la configuración de la máscara de afinidad, la configuración máxima de la memoria del servidor se redistribuirá entre los nodos restantes. Por ejemplo, en el ejemplo anterior de cuatro nodos, si desconecta dos nodos, los ocho GB de memoria liberados se distribuirán uniformemente entre los nodos restantes. Como el grupo de búferes puede usar páginas externas, se utilizará la memoria remota si no hay suficiente memoria en los nodos restantes. Si desea que Microsoft SQL Server no use la memoria de los nodos en los que ya no se ejecuta, debe disminuir la configuración máxima de la memoria del servidor después de mover los nodos fuera de línea.

Páginas extranjeras


Los nodos funcionan en gran medida independientemente el uno del otro. Todas las asignaciones de memoria y des asignación de memoria para el nodo se hacen usando la memoria asociada con el nodo. Sin embargo, si un trabajador que se ejecuta en el nodo N1 necesita acceder a una página de base de datos que ya está en la memoria del nodo N2, accede a la memoria no local.

Observación de memoria local frente a memoria externa en el conjunto de búfer


El grupo de búferes se puede observar al ver el objeto Buffer Node. La memoria total en el grupo de búferes para Microsoft SQL Server se muestra como el contador de páginas de destino del objeto del Administrador de búfer. La memoria en el grupo de búferes para cada nodo se muestra como el contador de páginas de destino del objeto Nodo de búfer. La memoria de otros nodos se muestra como el contador de páginas extranjeras.

Cada nodo controla su propia memoria


Cada nodo de memoria tiene su propio hilo de escritor diferido. Este hilo se llama tanto para puntos de control implícitos como explícitos. Como un equipo de multiprocesamiento simétrico (SMP) tiene solo un hilo de punto de control, los múltiples hilos al usar NUMA resultan en un aumento de la velocidad del punto de control.

Comportamiento de escaneo de tabla


Un escaneo de tabla ejecutado en el Nodo N1 solo llenará la memoria asociada con el nodo N1 a menos que el escaneo se ejecute en paralelo en las CPU desde múltiples nodos. Si el escaneo se ejecuta exclusivamente en un solo nodo, solo se usarán las páginas del buffer de ese nodo. Esto ayuda a dividir la carga de trabajo para una aplicación.

Conclusión


Se ha observado que las arquitecturas UMA y NUMA son arquitecturas que son contrastantes, por un lado la arquitectura UMA fue primero desarrollada para la generación de aplicaciones de multiprocesamiento principalmente en SMP con acceso a memoria compartida, por otro lado y viendo las características de operación se desarrolla la arquitectura NUMA, para proporcionar mejores características de operación en el multiprocesamiento con acceso a memoria de pendiente de la ubicación del procesador, siendo una arquitectura más escalable.
Microsoft SQL Server permite un uso eficiente de ambas arquitecturas, por una lado podemos indicar que hace uso interno de la arquitectura NUMA, permitiendo un procesamiento escalable en el multiprocesamiento y puede llegar a utilizar la arquitectura UMA con la configuración de PolyBase, dado que en este caso apoya el uso de BigData.
Microsoft SQL Server es un producto que hace uso eficiente de los recursos de hardware obteniendo el mejor desempeño del equipo y un conjunto de herramientas que nos apoyan en el manejo eficiente de los datos.

Bibliografía


Wikipedia: Uniform memory access
Wikipedia: Non-Uniform memory access
Microsoft How SQL Server Supports NUMA
SQLSkills: SQL Server and Soft NUMA

No hay comentarios.:

Publicar un comentario