NUMA (Non-Uniform Memory Access) es una arquitectura de diseño de hardware para sistemas multiprocesador donde cada procesador o grupo de procesadores (conocido como 'nodo NUMA') tiene su propia memoria local de acceso rápido. El acceso a la memoria local es significativamente más rápido que el acceso a la memoria asociada a otros nodos NUMA (memoria remota). Esta no uniformidad en el tiempo de acceso se debe a que el acceso a memoria remota debe atravesar un enlace de interconexión entre nodos, lo que introduce latencia adicional. El objetivo principal de NUMA es escalar el número de procesadores y la cantidad de memoria sin que el bus de memoria se convierta en un cuello de botella, un problema común en las arquitecturas SMP (Symmetric Multiprocessing) con un bus de memoria compartido.

La implementación de NUMA es omnipresente en servidores modernos de gama alta y estaciones de trabajo con múltiples sockets de CPU. Por ejemplo, los procesadores Intel Xeon y AMD EPYC en configuraciones de doble socket o más utilizan NUMA. Sistemas operativos como Linux, Windows Server y VMware ESXi son 'NUMA-aware', lo que significa que sus planificadores de tareas y gestores de memoria intentan asignar procesos y sus datos a la memoria local del nodo NUMA donde se ejecuta el procesador. Bases de datos de alto rendimiento como Oracle, SQL Server y sistemas de procesamiento en memoria como SAP HANA están diseñados para aprovechar la topología NUMA para optimizar el rendimiento, intentando mantener los datos cerca de los hilos de ejecución que los procesan.

Para el arquitecto de sistemas, comprender NUMA es crucial para diseñar y optimizar aplicaciones de alto rendimiento y sistemas distribuidos. Ignorar la topología NUMA puede llevar a un rendimiento subóptimo debido a la latencia de acceso a memoria remota excesiva ('NUMA bounce'). Es fundamental considerar la afinidad de procesos y memoria: asignar hilos de ejecución y sus estructuras de datos a la memoria local del nodo NUMa donde se ejecutarán. Esto implica configurar correctamente el sistema operativo (ej. usando herramientas como `numactl` en Linux), elegir la máquina virtual o el contenedor adecuado, y diseñar aplicaciones que minimicen el intercambio de datos entre nodos NUMA. Los trade-offs incluyen la complejidad en la gestión de recursos y la necesidad de un diseño de software consciente de la arquitectura para maximizar el rendimiento, a cambio de una escalabilidad superior en sistemas con muchos núcleos y gran cantidad de memoria.