Désactiver Intel Hyper-Threading sous Linux

Quelque fois il faut désactiver le mode Intel Hyper-Threading (HT) dans votre système. Linux supporte que l'unité centrale soit connectée ou déconnectée à chaude. Tu ne dois pas redémarrer ton système, aller au BIOS/UEFI et désactiver HT à la main. Tu peux désactiver les coeurs temporairement sous Linux pendant le fonctionnement du système.

Montrer la liste des unités centrales sous Linux

Regarde la liste des unités centrales. Tu peux voir quelque détails concernant la rélation entre unité centrale et coeur. Regarde les colonnes CPU et CORE.

lscpu --extended
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ    MINMHZ
0   0    0      0    0:0:0:0       yes    3200,0000 800,0000
1   0    0      0    0:0:0:0       yes    3200,0000 800,0000
2   0    0      1    1:1:1:0       yes    3200,0000 800,0000
3   0    0      1    1:1:1:0       yes    3200,0000 800,0000

Désactiver HT

Désactiver une UC seulement. Tu dois être root.

echo 0 > /sys/devices/system/cpu/cpu2/online

Ce petit script met en hors de fonction tous les UC HT. Tu dois être root.

for i in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | awk -F "[,-]" '{ print $2; }' | tr ',' '\n' | sort -un)
do
  echo 0 > /sys/devices/system/cpu/cpu$i/online
done

Découvrons les changements.

dmesg | grep CPU
...
[439975.285834] IRQ 26: no longer affine to CPU1
[439975.287095] smpboot: CPU 1 is now offline
[439975.301424] IRQ 30: no longer affine to CPU3
[439975.301437] IRQ 32: no longer affine to CPU3
[439975.302453] smpboot: CPU 3 is now offline

lscpu --extended
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ    MINMHZ
0   0    0      0    0:0:0:0       yes    3200,0000 800,0000
1   -    -      -    :::           no     3200,0000 800,0000
2   0    0      1    1:1:1:0       yes    3200,0000 800,0000
3   -    -      -    :::           no     3200,0000 800,0000

Mettre en marche les UC de nouveau

La commande suivante met tous les UC en marche. Tu dois être root.

for i in $(find /sys/devices/system/cpu/cpu* -name online); do echo 1 > $i; done