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