Afinidad, Scheduler de Windows 10 y Virtualización

VirtualBox afinidad manual: sólo hay actividad en el segundo CCX.

En el artículo anterior hablé sobre el Scheduler de Windows y algunas optimizaciones posibles afinitizando tareas a CPUs lógicas poniendo de manifiesto técnicas para mejorar el threading en sistemas Windows 10.

En este me centraré en la Virtualización y como puede beneficiarse de manera importante asignando de forma permanente y definida recursos de CPU  a las VM.

Mediante el Administrador de Tareas podemos modificar el comportamiento de un componente crucial de Windows: El Scheduler de Windows 10.

Afinidad y Virtualización

En un Host Windows 10 puedo asignar 4 cores con SMT (un CCX completo con su L3 de 8 MB y 8 threads) a una VM Ubuntu 18.04 LTS en VirtualBox con excelentes resultados en velocidad y sin mermas de prestaciones en el Host Windows 10.

Pondré un ejemplo práctico con VirtualBox y un Guest Ubuntu 18.04 LTS en un Host Windows 10 Pro 1809 x64.

Primero, como base vamos a ver el comportamiento nominal de VirtualBox en Windows 10 Pro.

VirtualBox por defecto en Windows 10

Creamos una VM con 8 cores, 4 GB RAM y demás ajustes:

VM Ubuntu 18.04 LTS en VirtualBox (Host Windows 10)
VM Ubuntu 18.04 LTS en VirtualBox (Host Windows 10)

Ajustes de procesador:

Ajustes de CPU en VirtualBox Ubuntu 1804LTS 8c 4GB DRAM
Ajustes de CPU en VirtualBox Ubuntu 18.04 LTS 8 cores 4 GB RAM

Lanzando la VM y ejecutando alguna tarea ligera obtenemos la siguiente vista en el Administrador de tareas de Windows 10:

VM Ubuntu 18.04 LTS lanzada en Windows 10 por defecto.
VM Ubuntu 18.04 LTS lanzada en Windows 10 por defecto.

Vemos actividad en las CPUs lógicas 1,2,4,6,8,10,12 y 14 (8 en total, tal como hemos definido en VirtualBox):

Actividad en 8 CPUs lógicas, elegidas dinámicamente por el Scheduler de Windows 10.
Actividad en 8 CPUs lógicas, elegidas dinámicamente por el Scheduler de Windows 10.

El resto es actividad ‘residual’ de los procesos del sistema Host Windows 10.

Con htop vemos las 8 CPUs lógicas que he asignado a la VM Ubuntu 18.04 LTS en VirtualBox.

htop en VM Ubuntu 18.04 LTS con 8 CPUs lógicas asignadas.
htop en VM Ubuntu 18.04 LTS con 8 CPUs lógicas asignadas.

Resumiendo, Windows 10 da libertad total al Scheduler para asignar los threads a las CPUs lógicas disponibles (16), de hecho esta asignación es dinámica y va variando en el tiempo.

En amarillo los 8 cores físicos en uso por VirtualBox.
En amarillo los 8 cores físicos en uso por VirtualBox.

Afinidad manual en VirtualBox en Host Windows 10

Debemos ir al Administrador de Tareas del Host Windows 10 Pro, pestaña detalles. Allí buscamos VBoxSVC.exe, click derecho y seleccionamos  Establecer Afinidad:

Afinitizando VBoxSVC.exe al segundo CCX.
Afinitizando VBoxSVC.exe al segundo CCX.

En mi caso, asigno 8  CPUs, de la CPU 7 a la 15 inclusive a VBoxSVC.exe.

En el sistema de pruebas con una CPU AMD Ryzen 7 1700 de 8 cores físicos con 16 CPUs lógicas (threads) opto por dedicar un CCX completo a la VM VirtualBox. Es decir, le asigno:

  • 4 cores físicos con sus cachés L1d, L1i y L2 dedicadas.
  • 8 MB de caché L3 compartida (CCX1).
  • 8 CPUs lógicas gracias al SMT.

Ejecutamos una carga de alta complejidad… (cd /; ls -Rla) en la consola para ver algo de actividad (hay que ser rápido porque corre sobre un 970 Evo de 500 GB…)

VirtualBox con afinidad manual a 8 CPUs lógicas.
VirtualBox con afinidad manual a 8 CPUs lógicas.

Como vemos, solo aparece actividad en las CPUs lógicas correspondientes al segundo CCX (8 a 15 inclusive):

VirtualBox afinidad manual: sólo hay actividad en el segundo CCX.
VirtualBox afinidad manual: sólo hay actividad en el segundo CCX.

Conclusiones

En sentido estricto hay que valorar si nuestra aplicación va a beneficiarse de llevar a cabo una afinidad manual de los threads a las CPUs lógicas o no.

El ejemplo de la Virtualización es atípico por una cuestión fundamental:

A veces es más eficaz asignar solo CPUs físicas a las VM que asignar el doble de CPUs lógicas. Es un balance que debe de valorar el usuario en función de la máquina, los sistemas Host y Guest y el software.

En este caso quizás la elección perfecta y más balanceada sería la siguiente:

Asignaría 4 CPUs lógicas, todas ellas del segundo CCX a la VM. En este caso los cores lógicos 8, 10, 12 y 14. Quedaría libre el primer CCX completo (8 CPUs lógicas) y las 4 CPUs lógicas impares del segundo CCX.

Todas las transacciones de memoria tencdrían acceso a los recursos completos de los 4 cores físicos del CCX1 y a su caché L3 de 8 MB.

Autor: Carlos Yus Valero

Apasionado de la tecnología, el mundo de las IT y la física teórica. Mi profesión gira en torno a la administración de sistemas y el hardware hace 18 años.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.