Mejoran el rendimiento de los servidores optimizando el acceso a memoria

Los procesadores multinúcleo (también conocidos como multicore) son la base tecnológica de cualquier equipo informático en la actualidad: PCs, tablets, teléfonos inteligentes o incluso smartwatchs integran en sus circuitos este tipo de arquitecturas hardware, fundamentalmente debido a su capacidad para ejecutar distintas tareas al mismo tiempo. En el caso de los servidores destinados a proveer servicios de Internet, simulaciones científicas o cálculos industriales, las potencialidades computacionales aumentan gracias a su mayor número de procesadores, una ventaja que permite a estas máquinas abordar tareas tan complejas como prestar servicio a numerosos usuarios al mismo tiempo o resolver simulaciones con grandes cantidades de datos; sin embargo, explotar esta potencialidad está lejos de ser sencillo.

Precisamente en los servidores, la disposición espacial de los elementos hardware juega un papel crucial. Una característica singular de este tipo de equipos es que el acceso al lugar donde se almacenan los datos (la memoria) es compartido, lo que significa que todos los procesadores y sus núcleos pueden acudir a ella en cualquier momento para obtener algún dato; no obstante, y dependiendo de cómo esté construido internamente el servidor, algunos de estos núcleos tendrán la capacidad de acceder a unas partes de la memoria más rápido que a otras. Estas pequeñas diferencias constituyen un campo de máximo interés científico, debido a su estrecha relación con una eventual pérdida de rendimiento en las prestaciones de los servidores; la importancia de su estudio radica en que actualmente la tecnología facilita año a año que los procesadores sean más rápidos, pero la velocidad de la memoria no crece al mismo ritmo, por lo que la diferencia de velocidad entre ambas es cada vez mayor.

Por lo general los programadores suelen tener en cuenta el número de núcleos, pero rara vez se preocupan del punto exacto de la memoria en el que se almacena la información. De esta manera, los Sistemas Operativos (como Windows, Linux, IOs o Android) acostumbran a repartir el trabajo dentro de un servidor en función de los núcleos disponibles, guardando los datos en memoria sin prestar demasiada atención a qué núcleo los va a utilizar. En la práctica, esta desatención de los tiempos de acceso a las distintas zonas de memoria puede significar una reducción muy significativa del rendimiento, incrementando así el tiempo invertido en la ejecución de los programas.


Desde hace algún tiempo, los fabricantes de procesadores apuestan por incluir en sus diseños una herramienta conocida como contadores hardware, un tipo de registros concebidos para atestiguar lo que sucede en el interior del procesador en tiempo real; analizando su respuesta, el programador puede conocer el comportamiento de todas las aplicaciones que corren en su computador antes de que la ejecución haya finalizado, así como el de los diferentes threads o ‘hilos’ -pequeños fragmentos del programa, parcialmente independientes, que trabajan de manera conjunta pero que pueden ser aislados para su ejecución en diferentes núcleos-. Entre otras cosas, los contadores hardware ofrecen detalles sobre el acceso a los datos de memoria de estos hilos.

Valiéndose de esta información, el Grupo de Arquitectura de Computadores del CiTIUS (España) ha conseguido establecer nuevos modelos de rendimiento para su implementación en servidores, que esencialmente cuentan con dos ventajas principales: en primer lugar muestran a los programadores el comportamiento de su código, dándoles pistas sobre cómo mejorarlo; pero además, permiten establecer estrategias orientadas a la toma de decisiones durante la ejecución de un programa, con el objetivo de mejorar sus prestaciones. Para ello han desarrollado una herramienta de propósito específico, capaz de obtener la información generada por los contadores y mostrar los patrones de rendimiento, de forma muy cómoda para el usuario y con una baja influencia en el rendimiento del sistema.

Esta misma información ha servido también a los científicos para crear un sistema de migración de hilos, que mueve (‘migra’) automáticamente los threads entre los distintos núcleos de los procesadores, con el objetivo de encontrar la mejor ubicación para cada uno y optimizar su ejecución en tiempo real, de forma transparente al usuario. En esencia, este sistema de migración recoge constantemente información sobre el comportamiento de los hilos -una estrategia económica en términos de eficiencia, ya que el uso de contadores hardware ralentiza menos de un 2% la ejecución-, haciendo uso de ella con el propósito de identificar el núcleo que se encuentra en las mejores condiciones para ejecutar de la manera más eficaz los hilos (o los programas).

El trabajo, fruto de una tesis doctoral defendida recientemente en el CiTIUS por el investigador Oscar García, fue validado tras evaluar la precisión del sistema de migración de hilos con ensayos basados en los NAS Parallel Benchmarks, un banco de pruebas diseñado por ingenieros de la Agencia Espacial Estadounidense (NASA) para medir el rendimiento de los computadores.

Durante el proceso de validación se ejecutaron simultáneamente cuatro programas distintos en un servidor con idéntico número de procesadores (simulando un supuesto en el que cuatro usuarios se conectan a la vez al mismo servidor); así, se observó que si todos los programas se ejecutan en procesadores que acceden a sus datos de la manera más eficiente posible -es decir, leyendo siempre de la memoria más adecuada-, las cosas sencillamente funcionan bien, algo mejor de lo que habitualmente ocurre cuando el encargado del reparto es el sistema operativo. Por el contrario, tan pronto como los programas leen la memoria de la manera más lenta posible, el rendimiento cae estrepitosamente sin que el sistema operativo pudiera hacer nada para arreglarlo, ya que no utiliza información sobre el uso de la memoria.

Las sucesivas pruebas demostraron cómo en este tipo de situaciones el sistema de migración de hilos desarrollado en el CiTIUS conseguía mejorar el rendimiento hasta en un 70%. Unos resultados que, de ser integrados en el sistema operativo, podrían mejorar notablemente el rendimiento en servidores con múltiples usuarios. Como explican los autores del trabajo, «el salto cualitativo se apreciaría especialmente en casos como los servidores de Internet o en los dedicados a problemas de simulación científica o técnica, porque se trata de entornos donde se ejecutan programas con gran uso de memoria y un considerable número de hilos», concluyen.