Inhabilitación de Intel Hyper-Threading Technology
Si la configuración de la infraestructura y la configuración de la aplicación lo requieren, puede inhabilitar Intel Hyper-Threading Technology (Intel HT Technology) en la máquina virtual huésped.
Las instrucciones contenidas en este tema relativas a la inhabilitación de Intel Hyper-Threading Technology en una máquina virtual huésped solo se aplican a los servidores virtuales que se suministran en hosts que utilizan procesadores basados en Intel.
Motivos para inhabilitar Intel Hyper-Threading Technology
Intel Hyper-Threading Technology es un término que describe la multihebra simultánea (SMT). Hyper-Threading Technology divide cada núcleo físico en dos procesadores virtuales. Podríamos decir que lo que hace Hyper-Threading Technology es tomar una carretera ancha con un solo carril y dividirla en dos carriles relativamente más estrechos. La autopista de dos carriles proporciona un mejor servicio que la carretera de un solo carril, tanto con tráfico lento como con tráfico rápido. Hyper-Threading Technology proporciona un mejor rendimiento de las aplicaciones cuando hay E/S de archivos, E/S de red y otras operaciones más lentas mezcladas con operaciones que exigen más a la CPU. Hyper-Threading Technology suele ofrecer un rendimiento entre un 0 y un 30 % mejor que la modalidad de una sola hebra. Algunas aplicaciones también pueden experimentar una caída del rendimiento.
Hyper-Threading Technology no es siempre la mejor opción. En este caso, es posible que prefiera inhabilitar esta tecnología y ejecutar los núcleos en modalidad de una sola hebra. Existen tres razones principales para plantearse inhabilitar Hyper-Threading Technology. El primer motivo está relacionado con la licencia de software. Muchos proveedores de software existentes, como proveedores de herramientas de automatización de diseño electrónico (EDA) requieren una licencia para cada CPU, independientemente de si utilizan Hyper-Threading Technology o la modalidad de una sola hebra. Cuando el núcleo está en modalidad de Hyper-Threading Technology, necesita el doble de licencias que en modalidad de una sola hebra, pero el rendimiento de la aplicación no es dos veces superior al de la modalidad de una sola hebra. Como resultado, los proveedores de EDA y otros profesionales inhabilitan Hyper-Threading Technology y prefieren ejecutar su software en modalidad de una sola hebra.
El segundo motivo para inhabilitar Hyper-Threading Technology es evitar problemas de equilibrio de carga, así como la sobrecarga del sistema operativo que conlleva Hyper-Threading Technology. Las aplicaciones informáticas de alto rendimiento (HPC) suelen crear una cantidad de tareas de interfaz de paso de mensajes (MPI) igual al número de núcleos físicos y dejar que el sistema operativo gestione cada tarea MPI en un núcleo físico distinto. Cuando la tecnología Hyper-Threading está habilitada, el sistema operativo ve el doble de CPU. Aunque el sistema operativo suele realizar un gran trabajo al correlacionar las tareas de MPI con una de las dos hebras de un núcleo, en ocasiones puede colocar ambas tareas en un núcleo físico y dejar otros núcleos libres. Que ambas tareas estén en un mismo núcleo físico mientras hay otros núcleos libres impide que la utilización del sistema sea óptima y hace que el rendimiento de la aplicación sea variable. Además, el kernel del SO asigna estructuras de datos a cada una de las CPU activas y las actualiza continuamente para que se asigne más espacio de kernel en modo de tecnología Hyper-Threading y se alivie la sobrecarga de gestión. Aligerar la sobrecarga del sistema operativo mediante la inhabilitación de Hyper-Threading Technology ayuda a muchas aplicaciones HPC a conseguir un rendimiento óptimo.
La tercera razón para inhabilitar Hyper-Threading Technology es la seguridad. Algunos usuarios prefieren inhabilitar la tecnología Hyper-Threading para evitar cualquier posibilidad de ataque de canal lateral asociada a la ejecución de dicha tecnología. IBM Cloud no comparte un núcleo físico entre las máquinas virtuales de dos clientes, por lo que este tipo de ataque no es posible.
Si determina que inhabilitar Hyper-Threading Technology es la mejor opción para su configuración, puede utilizar uno de los métodos siguientes para inhabilitarla en las máquinas virtuales invitadas en IBM Cloud.
Comprobación y modificación del estado de Hyper-Threading Technology en la máquina virtual invitada: aspectos básicos
Cuando una máquina virtual está en ejecución, puede comprobar el estado de Hyper-Threading Technology utilizando el mandato lscpu
en sistemas operativos Linux. Verá una salida parecida a la siguiente:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
...
Observe que, en este ejemplo, el elemento Thread(s) per core (hebras por núcleo) muestra el valor 2, lo que indica que se ha habilitado Hyper-Threading Technology. La máquina virtual tiene 4 núcleos físicos y 8 CPU virtuales. Las versiones
modernas del kernel de Linux permiten a los usuarios inhabilitar Hyper-Threading Technology en cada núcleo, por separado. Puede ejecutar algunos núcleos con la opción Hyper-Threading Technology habilitada y otros núcleos con ella inhabilitada.
Para comprobar el estado núcleo a núcleo, puede utilizar el mandato lscpu --extended
. Verá una salida parecida a la siguiente:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 0 1:1:0:0 yes
2 0 0 1 2:2:1:0 yes
3 0 0 1 3:3:1:0 yes
4 0 0 2 4:4:2:0 yes
5 0 0 2 5:5:2:0 yes
6 0 0 3 6:6:3:0 yes
7 0 0 3 7:7:3:0 yes
La salida de ejemplo anterior muestra que cada núcleo tiene 2 CPU y ambas CPU están en línea. El núcleo 0 tiene hermanos: CPU 0 y CPU 1. Para obtener la lista de hermanos, puede encontrar los datos en thread_sibling_list
,
en el sistema de archivos de dispositivos, tal y como se muestra en el ejemplo siguiente:
cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
0-1
0-1
2-3
2-3
4-5
4-5
6-7
6-7
Algunas arquitecturas de CPU y kernels utilizan una coma (,) en lugar de un guion (-) en la lista de hermanos de hebras.
Puede desactivar la tecnología Hyper-Threading para un solo núcleo escribiendo un cero (0) en el campo en línea del sistema de archivos del dispositivo para la CPU correspondiente. Por ejemplo, para inhabilitar Hyper-Threading Technology en el núcleo 2 (CPU 5 en el ejemplo anterior), ejecute el mandato siguiente:
echo 0 > /sys/devices/system/cpu/cpu5/online
Este mandato lleva la CPU 5 fuera de línea e inhabilita Hyper-Threading Technology en el núcleo 2, pero mantiene los otros núcleos en modalidad Hyper-Threading Technology, tal y como se muestra en el ejemplo siguiente cuando se ejecuta el mandato
lscpu --extended
:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 0 1:1:0:0 yes
2 0 0 1 2:2:1:0 yes
3 0 0 1 3:3:1:0 yes
4 0 0 2 4:4:2:0 yes
5 - - - ::: no
6 0 0 3 6:6:3:0 yes
7 0 0 3 7:7:3:0 yes
Puede repetir el proceso anterior en cada núcleo para inhabilitar Hyper-Threading Technology para la máquina virtual. Si la máquina virtual tiene muchas CPU, esto puede resultar difícil. El script siguiente es un script Bash muy simple para inhabilitar Hyper-Threading Technology en cada núcleo:
#!/bin/bash
for vcpu in `cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d- -f2 | cut -d- -f2 | uniq`; do
echo 0 > /sys/devices/system/cpu/cpu$vcpu/online
done
Habilitación de Hyper-Threading Technology para un núcleo específico y una CPU asociada
Si desea habilitar Hyper-Threading Technology de nuevo, puede hacerlo escribiendo un 1 en el campo en línea de cada CPU.
echo 1 > /sys/devices/system/cpu/cpu5/online
Habilitación de Hyper-Threading Technology para todos los núcleos de la máquina virtual
Si lo prefiere, puede utilizar el siguiente script Bash simple para habilitar Hyper-Threading Technology para la máquina virtual.
#!/bin/bash
for vcpu in `lscpu --extended | grep "no" | awk '{print $1}'`; do
echo 1 > /sys/devices/system/cpu/cpu$vcpu/online
done
Habilitación e inhabilitación de Hyper-Threading Technology en la máquina virtual invitada: script
También puede probar este script, creado por Wyatt Gorman, para habilitar y deshabilitar la tecnología Hyper-Threading. Tras descargar y ejecutar el script, se obtienen estas opciones:
OPTIONS
-d | --disable Disable Hyper-Threaded vCPUs
-e | --enable Enable Hyper-Threaded vCPUs
-s | --show Show Hyper-Threading status
-h | --help Display this usage output
Puede obtener el estado de Hyper-Threading Technology, inhabilitar Hyper-Threading Technology y habilitar Hyper-Threading Technology para todos los núcleos de la máquina virtual. Sin embargo, si necesita inhabilitar Hyper-Threading Technology en un subconjunto de los núcleos, siga los pasos recogidos en la sección de aspectos básicos.
Habilitación e inhabilitación de Hyper-Threading Technology en la máquina virtual invitada durante el arranque: datos de usuario
IBM Cloud proporciona una forma de especificar datos opcionales al crear una instancia de servidor virtual para configurar instancias o ejecutar scripts cuando se suministra la instancia; esto se denomina Datos de usuario.
Durante el proceso de creación de la instancia de servidor virtual, puede especificar el código de ejemplo siguiente en la sección Datos de usuario de la consola de IBM Cloud:
#cloud-config
bootcmd:
- for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d- -f2- | tr ',' '\n' | sort -un); do echo 0 > /sys/devices/system/cpu/cpu$cpunum/online; done
El script proporcionado en el campo Datos de usuario inhabilita Hyper-Threading Technology durante el proceso de arranque de la instancia. Se ven mensajes que indican que las CPU están inhabilitadas:
dmesg |grep offline
[ 9.488364] smpboot: CPU 1 is now offline
[ 9.544370] smpboot: CPU 3 is now offline
[ 9.572823] smpboot: CPU 5 is now offline
[ 9.600633] smpboot: CPU 7 is now offline
Puede utilizar un método similar para inyectar este proceso en Terraform.