Intel Hyper-Threading kikapcsolása Linux-on

2017. december 02, 16:15 | Molnár Péter

Időnként az Intel Hyper-Threading (HT) módot ki kell kapcsolni a rendszeren. A Linux támogatja a processzor hotplug-ot. Nem kell újraindítanod a gépet, kinyitni a BIOS/UEFI-t és kézzel kikapcsolni a HT-t. Ehelyett szoftverből kikapcsolhatod a HT cpu-kat időlegesen, Linux alól, menet közben.

CPU lista Linux-on

Nézd meg a processzorok listáját. A magok és processzorok közötti kapcsolatról láthatsz részleteket. Figyeld meg a CPU és CORE oszlopokat.

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

A HT kikapcsolása

Egy darab cpu kikapcsolása. A művelethez root jogok szükségesek.

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

Egy egysoros script-el kikapcsolhatod az összes HT processzort. A művelethez root jogok szükségesek.

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

Nézzük meg a változásokat.

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

Processzorok visszakapcsolása

A következő parancs az összes processzort visszakapcsolja. A művelethez root jogok szükségesek.

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