Frage Deaktivieren Sie Hyperthreading innerhalb von Linux (kein Zugriff auf BIOS)


Ich habe ein System, das eine Finanzhandelsanwendung in einer entfernten Einrichtung ausführt. Ich habe keinen Zugang zur IAO / DRAC, muss aber Hyperthreading deaktivieren. Das System läuft mit Intel Westmere 3,33 GHz X5680 Hex-Core-CPUs. Ich kann einen Neustart durchführen, möchte aber sicherstellen, dass das System aufgrund von Leistungsproblemen kein Hyperthreading aktiviert. Gibt es eine saubere Möglichkeit, dies innerhalb von Linux zu tun?

Bearbeiten: Die noht Direktive, die der Kernel-Boot-Befehlszeile hinzugefügt wurde, funktionierte nicht. Gleiches gilt für RHEL.

Sehen: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9


21
2018-02-15 17:48


Ursprung




Antworten:


Sie können dies zur Laufzeit tun, wenn Sie möchten. Ich habe eine nette Lösung gefunden, die hier beschrieben wird: http://www.absolutelytech.com/2011/08/01/how-to-disable-cpu-cores-in-linux/

Schritt 1: Identifizieren Sie die Linux-CPUs, die Sie ausschalten möchten:

cat /proc/cpuinfo

Suchen Sie nach den CPUs, die die gleiche "Kern-ID" haben, Sie möchten eines von jedem Paar ausschalten.

Schritt 2: Schalte die Hyperthreading-CPUs aus (in meinem Fall die letzten vier der insgesamt 8 "CPUs" von Linux)

echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online

Sie könnten sich ein Skript einrichten, das Sie direkt nach dem Systemstart ausführen.


19
2018-03-19 21:18



Es klappt fast wie ich erwartet habe. Virtuelle Kerne sind deaktiviert, jetzt, wenn ich einen CPU-konsumierenden Thread ausführe, wird der physische Kern um 100% geladen. Aber benutzen sysbench --num-threads=1 --test=cpu run mit verschiedenen num-threads und HT ein- und ausschalten besagt, dass die Deaktivierung von HT die Performance verringert, wenn es viele Threads gibt, und selbst wenn es nur einen Thread gibt, hat es keinen Vorteil, HT auszuschalten. Also schlage ich vor, es so zu lassen, wie es ist: es ist optimal. - Sergey P. aka azure
Würdest du wissen, was der Befehl ist, sie wieder einzuschalten? Der Link am Anfang deiner Antwort ist tot ~. Vielen Dank! - user189035
@ user189035: echo 1 anstatt echo 0 sollte sie wieder einschalten. - Peter Cordes


Ein Skript zum Deaktivieren des Hyperthreading beim Start der Maschine ...

Um Hyperthreading zu deaktivieren, füge ich ein Skript auf Maschine /etc/rc.local ein. Es ist nicht wirklich sauber, aber es ist einfach zu installieren, unabhängig von der CPU-Architektur und sollte auf jeder modernen Linux-Distribution funktionieren.

nano /etc/rc.local

    # place this near the end before the "exit 0"

    for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
        CPUID=$(basename $CPU)
        echo "CPU: $CPUID";
        if test -e $CPU/online; then
                echo "1" > $CPU/online; 
        fi;
        COREID="$(cat $CPU/topology/core_id)";
        eval "COREENABLE=\"\${core${COREID}enable}\"";
        if ${COREENABLE:-true}; then        
                echo "${CPU} core=${CORE} -> enable"
                eval "core${COREID}enable='false'";
        else
                echo "$CPU core=${CORE} -> disable"; 
                echo "0" > "$CPU/online"; 
        fi; 
    done;    

Wie funktioniert das?

Auf Linux-Kernel-Informationen und -Steuerelemente kann als Datei im Verzeichnis / sys auf modernen Linux-Distributionen zugegriffen werden. Zum Beispiel:

/ sys / devices / system / cpu / cpu3 enthält die Kernelinformationen und Steuerelemente für die logische CPU 3.

cat / sys / devices / system / cpu / cpu3 / topologie / core_id zeigt die Kernnummer an, zu der diese logische CPU gehört.

echo "0"> / sys / geräte / system / cpu / cpu3 / online ermöglicht es, logische CPU 3 zu deaktivieren.

Warum funktioniert es?

Ich weiß nicht genau warum ... aber das System reagierte besser mit Hyperthreading (auf meinem i5 Notebook und massiven Xeon Servern mit 60+ Kernen). Ich denke, das hat mit Per-CPU-Caches, CPU-Speicherzuweisung, CPU-Scheduler-Zuweisung und Prozessprioritäten komplexe Iterationen zu tun. Ich denke, dass die Vorteile von Hyperthreading durch die Komplexität der Erstellung von CPU-Schedulern, die wissen, wie man sie benutzt, überwiegt.

Für mich ist das Problem mit Hyperthreading: Wenn ich so viele cpu-intensive Threads wie ich logische Kerne starte, habe ich schnelle Kontextwechsel für die CPU-intensiven Aufgaben, aber teure für die Hintergrundaufgaben seit dem Hyperthreading total verbraucht von der CPU-intensive Aufgaben. Auf der anderen Seite, wenn ich so viele cpu-intensive Threads wie ich physikalische Kerne habe, habe ich keine Kontextwechsel zu diesen Aufgaben und schnelle Kontextwechsel für die Hintergrundaufgaben. Scheint gut, aber die Hintergrundaufgaben finden freie logische Prozessoren und werden fast sofort ausgeführt. Es ist, als wären sie in Echtzeit (nette -20).

Im ersten Szenario ist das Hyperthreading Uselles, die Hintergrundaufgaben verwenden teure Kontextwechsel, da ich Hyperthreading mit der normalen Verarbeitung ausstaffiere. Die zweite ist unakzeptabel, weil bis zu 50% meiner CPU-Leistung für die Hintergrundaufgaben priorisiert wird.

Die "CPU-intensiven" Aufgaben, von denen ich spreche, sind Data-Mining- und Autorisierungsserver für künstliche Intelligenz (meine Arbeit). Mischmaschine, die in den billigen Computern und in den Gruppen überträgt (um mein zukünftiges Haus zu skizzieren).

Auch das ist Rätselraten.

Ich habe den Eindruck, dass das besser ist, aber vielleicht nicht.


13
2017-09-06 18:00



Ich denke, mein Scriptlet ist ein wenig einfacher zu folgen. - Paul M


Für wirklich alte Kernel (Linux 2.6.9 oder so), fügen Sie die nicht Parameter zum Kernel beim Booten.

Diese Kernel-Befehlszeilenoption wurde seit mindestens Linux 2.6.18 entfernt.


Von http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :

The `noht' Argument

This will disable hyper-threading on intel processors that have this feature. 

Wenn Sie lilo verwenden, bearbeiten Sie die Datei /etc/lilo.conf (und führen Sie lilo anschließend aus) oder wenn Sie grub verwenden, bearbeiten Sie Ihre /boot/grub/menu.lst.


6
2018-02-15 17:53



Ist dies funktionell gleichbedeutend mit der Deaktivierung von HT im BIOS? - ewwhite
Ich weiß es nicht genau, aber ja, ich würde erwarten, dass noht es mit der Deaktivierung auf dem BIOS gleichzusetzen ist. - rems
Dies ist ein Gentoo-System. Ich habe es versucht noht Eintrag in der grub Kernel-Befehlszeile. Das System hat die noht Befehl. Gleiches gilt für RHEL. Sehen: bugzilla.redhat.com/show_bug.cgi?id=440321#c9 - ewwhite
Dies ist seit mindestens Linux 2.6.18 obsolet. Das noht Kerneloption wurde entfernt. Dies ist bedauerlich, da Linux eine Workaround für einige Haswell Perf-Counter Errata (BJ122, BV98, HSD29) ermöglicht nur wenn HT eingeschaltet ist, und dies geschieht, bevor initramfs sogar geladen wird. - Peter Cordes


Sie können die "thread_siblings_list" für jeden Kern verwenden, um den zweiten Kern im HT-Paar auszuschalten.

Die folgende Befehlspipeline ist hacky, nicht optimiert und auf diese Weise hoffentlich einfacher zu verstehen.

cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | \
awk -F, '{print $2}' | \
sort -n | \
uniq | \
( while read X ; do echo $X ; echo 0 > /sys/devices/system/cpu/cpu$X/online ; done )

Nimm also alle Thread-Geschwister-Listen, extrahiere die zweite CPU für jedes Paar, erhalte eine eindeutige Liste und schalte sie dann aus.

Macht das Sinn?

Wenn ich "cat / proc / cpuinfo" nach dem oben genannten ausführen, wird die Anzahl der Kerne halbiert.


6
2017-07-27 14:14





Lukas 'Antwort ist nett, funktioniert aber nicht, um HT zu deaktivieren, da die Core-ID nicht zur Identifizierung von HT-Geschwistern dienen kann. Dieses Skript funktioniert stattdessen:

#!/bin/bash
for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
    CPUID=`basename $CPU | cut -b4-`
    echo -en "CPU: $CPUID\t"
    [ -e $CPU/online ] && echo "1" > $CPU/online
    THREAD1=`cat $CPU/topology/thread_siblings_list | cut -f1 -d,`
    if [ $CPUID = $THREAD1 ]; then
        echo "-> enable"
        [ -e $CPU/online ] && echo "1" > $CPU/online
    else
        echo "-> disable"
        echo "0" > $CPU/online
    fi
done

3
2017-08-18 00:15



Dein Skript ist eine Variation von mir. wir müssen überprüfen, was passiert, wenn Sie mehrere CPUs haben, nur um sicher zu sein. - Paul M
@PaulM Genau dort habe ich es getestet und für meine Zwecke benutzt: 2-fach Haswell-System. - Anton


Ich musste warten, bis ich in die IAO / den Drac einsteigen konnte. Die Kernel-Boot-Parameter funktionieren nicht mit aktuellen Linux-Distributionen.


0
2018-02-23 01:45





Im Paket libsmbios-bin (Debian, Ubuntu usw.) haben Sie die Binärdateien isCmosTokenActive und activateCmosToken. Zusammen mit dem Token-Liste, können Sie dann etwas wie folgt ausprobieren:

# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable
[...] Type 0x00d1  Location 0x46 AND(fe) OR(0)  BITFIELD: 1
# isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable
[....] Type 0x00d2  Location 0x46 AND(fe) OR(1)  BITFIELD: 0

Aktivieren Sie dann das Token CPU_Hyperthreading_Disable:

# activateCmosToken 0x00d2 # CPU_Hyperthreading_Disable
[...] Type 0x00d2  Location 0x46 AND(fe) OR(1)  BITFIELD: 1

Überprüfen:

# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable
[...] Type 0x00d1  Location 0x46 AND(fe) OR(0)  BITFIELD: 0
# isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable
[...] Type 0x00d2  Location 0x46 AND(fe) OR(1)  BITFIELD: 1

Nun, die große Frage ist, ob Sie einfach einen Neustart benötigen oder nicht, damit dies wirksam wird, oder ob ein vollständiger Neustart erforderlich ist. Probieren Sie es aus und sehen Sie, wie es geht!


0
2017-07-31 11:58