Ich habe ein System, auf dem eine Finanzhandelsanwendung in einer Remote-Einrichtung ausgeführt wird. Ich habe keinen Zugriff auf die ILO / DRAC, muss aber das Hyperthreading deaktivieren. Auf dem System werden Intel Westmere 3,33 GHz X5680-Hex-Core-CPUs ausgeführt. Ich kann neu starten, möchte aber sicherstellen, dass das System das Hyperthreading aufgrund von Leistungsproblemen nicht aktiviert. Gibt es eine saubere Möglichkeit, dies von Linux aus zu tun?
Bearbeiten: Die noht
Anweisung, die der Kernel-Boot-Befehlszeile hinzugefügt wurde, funktionierte nicht. Gleiches gilt für RHEL.
Siehe: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9
sysbench --num-threads=1 --test=cpu run
HT mit verschiedenen num-Threads und aktiviertem und deaktiviertem HT bedeutet jedoch, dass das Deaktivieren von HT die Leistung verringert, wenn viele Threads vorhanden sind. Auch wenn nur ein Thread vorhanden ist, hat das Deaktivieren von HT keinen Vorteil. Ich empfehle daher, es so zu belassen, wie es ist: es ist optimal.echo 1
anstattecho 0
sie wieder einzuschalten .Ein Skript zum Deaktivieren von Hyperthreading beim Systemstart ...
Um das Hyperthreading zu deaktivieren, füge ich ein Skript auf der Maschine /etc/rc.local hinzu. Es ist nicht sehr sauber, aber einfach zu installieren, unabhängig von der CPU-Architektur und sollte auf jeder modernen Linux-Distribution funktionieren.
Wie funktioniert das?
Auf Informationen und Steuerelemente des Linux-Kernels kann in modernen Linux-Distributionen als Datei im Verzeichnis / sys zugegriffen werden. Beispielsweise:
/ sys / devices / system / cpu / cpu3 enthält die Kernelinformationen und Steuerelemente für die logische CPU 3.
cat / sys / devices / system / cpu / cpu3 / topology / core_id zeigt die Core-Nummer an, zu der diese logische CPU gehört.
echo "0"> / sys / devices / system / cpu / cpu3 / online ermöglicht das Deaktivieren der logischen CPU 3.
Warum funktioniert es?
Ich weiß nicht genau, warum ... aber das System reagiert mit abgeschaltetem Hyperthreading schneller (auf meinem i5-Notebook und massiven Xeon-Servern mit über 60 Kernen). Ich vermute, das hat mit CPU-Caches, CPU-Speicherzuweisung, CPU-Scheduler-Zuweisung und komplexen Iterationen der Prozessprioritäten zu tun. Ich denke, die Vorteile von Hyperthreading werden durch die Komplexität der Erstellung von CPU-Schedulern überstrapaziert, die wissen, wie man es verwendet.
Für mich ist das Problem beim Hyperthreading: Wenn ich so viele CPU-intensive Threads starte, wie ich logische Kerne habe, habe ich schnelle Kontextwechsel für die CPU-intensiven Tasks, aber teure für die Hintergrundtasks, da das Hyperthreading von den vollständig in Anspruch genommen wird CPU-intensive Aufgaben. Wenn ich dagegen so viele CPU-intensive Threads starte, wie ich physische Kerne habe, gibt es keine Kontextwechsel zu diesen Aufgaben und schnelle Kontextwechsel für die Hintergrundaufgaben. Scheint gut zu sein, aber die Hintergrundaufgaben werden freie logische Prozessoren finden und fast sofort ausgeführt. Es ist, als wären sie Echtzeit-Performace (nett -20).
Im ersten Szenario handelt es sich beim Hyperthreading um Uselles. Bei den Hintergrundaufgaben werden teure Kontextwechsel verwendet, da ich das Hyperthreading mit der normalen Verarbeitung maximal genutzt habe. Die zweite ist nicht zu korrigieren, da bis zu 50% meiner CPU-Leistung für die Hintergrundaufgaben priorisiert werden.
Die "CPU-intensiven" Aufgaben, von denen ich spreche, sind Data Mining mit künstlicher Intelligenz und Berechtigungsserver (meine Arbeit). Mixer-Rendering in billigen Computern und Clustern (um mein zukünftiges Haus zu skizzieren).
Auch das ist eine Vermutung.
Ich habe den Eindruck, dass es besser ist, aber es kann nicht.
quelle
Hängen Sie bei sehr alten Kerneln (Linux 2.6.9 oder höher) den Parameter noht beim Booten an den Kernel an.
Diese Kernel-Befehlszeilenoption wurde seit mindestens Linux 2.6.18 entfernt .
Von http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :
Wenn du lilo verwendest, bearbeite deine /etc/lilo.conf (und starte danach lilo) oder wenn du grub verwendest, bearbeite deine /boot/grub/menu.lst.
quelle
noht
Eintrag in der Befehlszeile des Grub-Kernels ausprobiert . Das System hat dennoht
Befehl nicht eingehalten . Gleiches gilt für RHEL. Siehe: bugzilla.redhat.com/show_bug.cgi?id=440321#c9noht
Kernel-Option wurde entfernt. Dies ist bedauerlich, da Linux eine Problemumgehung für einige Haswell-Leistungsindikator-Errata (BJ122, BV98, HSD29) nur dann ermöglicht, wenn HT aktiviert ist , und dies geschieht, bevor initramfs überhaupt geladen wird.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 wurde hoffentlich auf diese Weise erstellt, um das Verständnis zu erleichtern.
Nehmen Sie also alle Thread-Geschwisterlisten, extrahieren Sie die zweite CPU für jedes Paar, erstellen Sie eine eindeutige Liste, und deaktivieren Sie sie dann.
Macht das Sinn?
Wenn ich nach dem Ausführen des obigen Befehls "cat / proc / cpuinfo" ausführe, halbiert sich die Anzahl der Kerne.
quelle
echo 0 > /sys/devices/system/cpu/cpu$X/online
wirdecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
Neuere Kernel bieten eine SMT-Steuerung (Simultaneous Multithreading).
Sie können den Status von SMT mit überprüfen.
Ändern Sie den Zustand mit
Optionen sind;
Wir haben dies mit Linux Kernel 4.4.0 getestet
quelle
Lukas 'Antwort ist nett, funktioniert aber nicht wirklich zum Deaktivieren von HT, da die Kern-ID nicht zur Identifizierung von HT-Geschwistern dienen kann. Dieses Skript funktioniert stattdessen:
quelle
Ich musste warten, bis ich bei der ILO / Drac einsteigen konnte. Die Kernel-Boot-Parameter funktionieren auf aktuellen Linux-Distributionen nicht.
quelle
Im Paket libsmbios-bin (Debian, Ubuntu usw.) haben Sie die Binärdateien isCmosTokenActive und activateCmosToken. Zusammen mit der Token-Liste können Sie dann Folgendes ausprobieren:
Aktivieren Sie dann das Token CPU_Hyperthreading_Disable:
Überprüfen:
Die große Frage ist nun, ob Sie einfach einen Neustart benötigen, damit dies wirksam wird, oder ob ein vollständiger Aus- und Wiedereinschalten erforderlich ist. Probieren Sie es aus und sehen Sie, wie es geht!
quelle
Basierend auf den Informationen, die Paul M hier zur Verfügung gestellt hat, würde ich es folgendermaßen "skripten":
Natürlich wird das Hyper-Threading nicht in demselben Sinne deaktiviert, wie das Basteln mit dem BIOS . Im Grunde wird nur der Kernel-Taskplaner angewiesen, einige Kerne nicht zu verwenden, da wir wissen, dass es sich um gefälschte Kerne handelt.
Software, deren Annahme auf dem vorherigen Status
/proc
oder/sys
Subsystem basiert, wird möglicherweise immer noch nicht optimal ausgeführt oder schlägt aufgrund dieser Laufzeitänderung sogar fehl, sodass möglicherweise ein Neustart erforderlich ist. Zum Beispiel habe ich bemerktirqbalance
, dass es unter diesen Umständen leicht zu Fehlern kommt.quelle
HT deaktivieren:
HT aktivieren:
Hinweis: Dies deaktiviert HyperThreading nicht wirklich, aber sie deaktivieren die "gefälschten" Kerne, die fast das gleiche Ergebnis erzielen.
quelle
tee
, aber dies ist immer noch nicht die richtige Antwort auf die Frage. Diese Befehle gelten nur für bestimmte Hardwarekonfigurationen und können unbeabsichtigte Auswirkungen auf andere Hardwarekonfigurationen haben. Und eine Erklärung, was diese Befehle tun, fehlt völlig.Altes Thema, hatte aber Grund, dieses Experiment zu versuchen. Erstens bin ich mir überhaupt nicht sicher, ob das Deaktivieren der (leicht gefälschten) CPUs zur Laufzeit wirklich dem Deaktivieren von Hyperthreading beim Booten entspricht. Trotzdem habe ich in unserer Anwendung eine kleine Leistungssteigerung festgestellt. (Aber nicht genug zum behalten.)
Verwendete den thread_siblings- Wert (der bei Hyperthread-CPUs üblich ist) als Schlüssel zum Aktivieren / Deaktivieren:
Versuchen Sie den Befehl ohne das endgültige sudo sh , um die Richtigkeit zu überprüfen.
quelle