El diseño de los buses de E/S representa las arterias de la computadora y determina significativamente cuánto y qué tan rápido se pueden intercambiar los datos entre los componentes individuales mencionados anteriormente. La categoría superior está dirigida por componentes utilizados en el campo de la computación de alto rendimiento (HPC). A mediados de 2020, entre los representantes contemporáneos de HPC se encuentran Nvidia Tesla y DGX, Radeon Instinct y los productos de aceleradores basados en GPU de Intel Xeon Phi (ver [1,2] para comparaciones de productos).
Comprensión de NUMA
El acceso a la memoria no uniforme (NUMA) describe una arquitectura de memoria compartida utilizada en los sistemas de multiprocesamiento contemporáneos. NUMA es un sistema informático compuesto por varios nodos individuales de tal manera que la memoria agregada se comparte entre todos los nodos: "A cada CPU se le asigna su propia memoria local y puede acceder a la memoria de otras CPU en el sistema" [12,7].
NUMA es un sistema inteligente utilizado para conectar múltiples unidades de procesamiento central (CPU) a cualquier cantidad de memoria de la computadora disponible en la computadora. Los nodos NUMA únicos están conectados a través de una red escalable (bus de E/S) de modo que una CPU pueda acceder sistemáticamente a la memoria asociada con otros nodos NUMA.
La memoria local es la memoria que la CPU está utilizando en un nodo NUMA particular. La memoria extraña o remota es la memoria que una CPU está tomando de otro nodo NUMA. La relación NUMA describe la relación del costo de acceder a la memoria extranjera al costo de acceder a la memoria local. Cuanto mayor sea la relación, mayor es el costo y, por lo tanto, más tiempo tarda en acceder a la memoria.
Sin embargo, lleva más tiempo que cuando esa CPU accede a su propia memoria local. El acceso a la memoria local es una gran ventaja, ya que combina baja latencia con alto ancho de banda. En contraste, el acceso a la memoria que pertenece a cualquier otra CPU tiene una mayor latencia y un rendimiento más bajo en ancho de banda.
Mirando hacia atrás: Evolución de los multiprocesadores de memoria compartida
Frank Dennemann [8] afirma que las arquitecturas modernas del sistema no permiten el acceso a la memoria verdaderamente uniforme (UMA), a pesar de que estos sistemas están específicamente diseñados para ese propósito. Simplemente hablando, la idea de la computación paralela era tener un grupo de procesadores que cooperen para calcular una tarea determinada, acelerando así un cálculo secuencial clásico.
Como explicó Frank Dennemann [8], a principios de la década de 1970, "la necesidad de sistemas que podrían atender múltiples operaciones concurrentes del usuario y la generación de datos excesiva se convirtió en la corriente principal" con la introducción de sistemas de bases de datos relacionales. "A pesar de la impresionante tasa de rendimiento del uniprocesador, los sistemas multiprocesador estaban mejor equipados para manejar esta carga de trabajo. Para proporcionar un sistema rentable, el espacio de direcciones de memoria compartida se convirtió en el foco de la investigación. Al principio, se abogaron por los sistemas que utilizan un interruptor de barra cruzada, sin embargo, con esta complejidad de diseño escalada junto con el aumento de los procesadores, lo que hizo que el sistema basado en bus sea más atractivo. Procesadores en un sistema de bus [puede] acceder a todo el espacio de memoria enviando solicitudes en el bus, una forma muy rentable de usar la memoria disponible lo más óptimo posible."
Sin embargo, los sistemas informáticos basados en bus vienen con un cuello de botella: la cantidad limitada de ancho de banda que conduce a problemas de escalabilidad. Cuantas más CPU se agregan al sistema, menos ancho de banda por nodo disponible. Además, cuantas más CPU se agregan, cuanto más largo sea el bus y mayor será la latencia como resultado.
La mayoría de las CPU se construyeron en un plano bidimensional. Las CPU también tuvieron que agregar controladores de memoria integrados. La solución simple de tener cuatro autobuses de memoria (arriba, abajo, izquierda, derecha) a cada núcleo de CPU permitió un ancho de banda disponible completo, pero eso va solo hasta ahora. Las CPU estancadas con cuatro núcleos por un tiempo considerable. Agregar rastros arriba y abajo permitió los autobuses directos a las CPU diagonalmente opuestas a medida que las chips se convirtieron en 3D. Colocar una CPU de cuatro cados en una tarjeta, que luego se conectó a un autobús, fue el siguiente paso lógico.
Hoy, cada procesador contiene muchos núcleos con una memoria caché en chip compartida y una memoria fuera de chip y tiene costos de acceso de memoria variable en diferentes partes de la memoria dentro de un servidor.
Mejorar la eficiencia del acceso a los datos es uno de los principales objetivos del diseño contemporáneo de la CPU. Cada núcleo de CPU estaba dotado con un pequeño caché de nivel uno (32 kb) y un caché de nivel 2 más grande (256 kb). Los diversos núcleos luego compartirían un caché de nivel 3 de varios MB, cuyo tamaño ha crecido considerablemente con el tiempo.
Para evitar las fallas de caché, solicitar datos que no están en la caché, se dedica mucho tiempo a la investigación en encontrar el número correcto de cachés de CPU, estructuras de almacenamiento en caché y algoritmos correspondientes. Consulte [8] para obtener una explicación más detallada del protocolo para almacenar en caché Snoop [4] y la coherencia de caché [3,5], así como las ideas de diseño detrás de Numa.
Soporte de software para NUMA
Hay dos medidas de optimización de software que pueden mejorar el rendimiento de un sistema que admite la arquitectura NUMA: afinidad del procesador y colocación de datos. Como se explica en [19], “la afinidad del procesador [...] permite la unión y el desaplace de un proceso o un hilo en una sola CPU, o un rango de CPU para que el proceso o el hilo se ejecute solo en la CPU o CPU designada más bien que cualquier CPU."El término" colocación de datos "se refiere a modificaciones de software en las que el código y los datos se mantienen lo más cerca posible en la memoria.
Los diferentes sistemas operativos relacionados con UNIX y UNIX admiten NUMA de las siguientes maneras (la lista a continuación se toma de [14]):
En el libro "Informática y tecnología, Actas de la Conferencia Internacional (CST2016)", Ning Cai sugiere que el estudio de la arquitectura de NUMA se centró principalmente en el entorno informático de alta gama y la partición de Radix (NARP) propuesta por Númica, que optimiza El rendimiento de los cachés compartidos en los nodos NUMA para acelerar las aplicaciones de inteligencia empresarial. Como tal, NUMA representa un terreno medio entre los sistemas de memoria compartida (SMP) con algunos procesadores [6].
Numa y Linux
Como se indicó anteriormente, el kernel de Linux ha admitido NUMA desde la versión 2.5. Tanto Debian GNU/Linux como Ubuntu ofrecen soporte NUMA para la optimización de procesos con los dos paquetes de software numactl [16] y numad [17]. Con la ayuda del comando numActl, puede enumerar el inventario de nodos NUMA disponibles en su sistema [18]:
# numactl -hardware
Disponible: 2 nodos (0-1)
nodo 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
Nodo 0 Tamaño: 8157 MB
nodo 0 gratis: 88 MB
Nodo 1 CPU: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
Nodo 1 Tamaño: 8191 MB
Nodo 1 gratis: 5176 MB
Distancias de nodo:
nodo 0 1
0: 10 20
1: 20 10
Numatop es una herramienta útil desarrollada por Intel para monitorear la localidad de memoria de tiempo de ejecución y analizar procesos en sistemas NUMA [10,11]. La herramienta puede identificar los posibles cuellos de botella de rendimiento relacionados con NUMA y, por lo tanto, ayudar a reejar las asignaciones de memoria/CPU para maximizar el potencial de un sistema NUMA. Ver [9] para obtener una descripción más detallada.
Escenarios de uso
Las computadoras que admiten la tecnología NUMA permiten que todas las CPU accedan a la memoria completa directamente: las CPU lo ven como un espacio de direcciones lineal única. Esto lleva a un uso más eficiente del esquema de direccionamiento de 64 bits, lo que resulta en un movimiento más rápido de datos, menos replicación de datos y una programación más fácil.
Los sistemas NUMA son bastante atractivos para aplicaciones del lado del servidor, como los sistemas de soporte de decisiones y minería de datos. Además, escribir aplicaciones para juegos y software de alto rendimiento se vuelve mucho más fácil con esta arquitectura.
Conclusión
En conclusión, la arquitectura de NUMA aborda la escalabilidad, que es uno de sus principales beneficios. En una CPU NUMA, un nodo tendrá un mayor ancho de banda o una latencia menor para acceder a la memoria en ese mismo nodo (E.gramo., La CPU local solicita acceso a la memoria al mismo tiempo que el acceso remoto; La prioridad está en la CPU local). Esto mejorará drásticamente el rendimiento de la memoria si los datos se localizan en procesos específicos (y por lo tanto procesadores). Las desventajas son los mayores costos de mover datos de un procesador a otro. Mientras este caso no ocurra con demasiada frecuencia, un sistema NUMA superará a los sistemas con una arquitectura más tradicional.
Enlaces y referencias
Gracias
Los autores desean agradecer a Gerold Rupprecht por su apoyo mientras preparan este artículo.
Sobre los autores
Plaxedes Nehanda es una persona versátil múltiple y autónoma que usa muchos sombreros, entre ellos, un planificador de eventos, un asistente virtual, un transcriptor, así como un ávido investigador, con sede en Johannesburgo, Sudáfrica.
Príncipe K. Nehanda es ingeniero de instrumentación y control (metrología) en Paeflow Medering en Harare, Zimbabwe.
Frank Hofmann trabaja en la carretera, preferiblemente de Berlín (Alemania), Ginebra (Suiza) y Ciudad del Cabo (Sudáfrica), como desarrollador, entrenador y autor para revistas como Linux -User y Linux Magazine. También es coautor del libro de gestión de paquetes de Debian (http: // www.dpmb.org).