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.
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 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.
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.