Uno script per disabilitare l'hyperthreading all'avvio della macchina ...
Per disabilitare l'hyperthreading includo uno script sulla macchina /etc/rc.local. Non è perfettamente pulito, ma è facile da installare, indipendente dall'architettura della CPU e dovrebbe funzionare su qualsiasi distribuzione linux moderna.
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;
Come funziona?
È possibile accedere alle informazioni e ai controlli del kernel Linux come file nella directory / sys nelle moderne distribuzioni di Linux. Per esempio:
/ sys / devices / system / cpu / cpu3
contiene le informazioni del kernel e i controlli per la CPU logica 3.
cat / sys / devices / system / cpu / cpu3 / topology / core_id
mostrerà il numero di core a cui appartiene questa CPU logica.
echo "0"> / sys / devices / system / cpu / cpu3 / online
consente di disabilitare la CPU logica 3.
Perché funziona
Non so esattamente perché ... ma il sistema diventa più reattivo con l'hyperthreading disattivato (sul mio notebook i5 e server Xeon di massa con oltre 60 core). Immagino che abbia a che fare con le cache per CPU, l'allocazione di memoria per CPU, l'allocazione dello scheduler della CPU e le iterazioni complesse con priorità di processo. Penso che i vantaggi dell'hyperthreading siano superiori alla complessità di creare programmatori CPU che sanno come usarlo.
Per me, il problema con l'hyperthreading è: se avessi tanti thread ad alta intensità di CPU quanti sono i core logici, avrò rapidi cambi di contesto per le attività intensive della cpu, ma costosi per le attività in background poiché l'hyperthreading totalmente consumato dal compiti intensivi della CPU. D'altra parte, se avvio tanti thread ad alta intensità di CPU quanti sono i core fisici, non avrò alcun cambio di contesto per quelle attività e cambi di contesto rapidi per le attività in background. Sembra buono, ma le attività in background troveranno processori logici gratuiti e verranno eseguiti quasi immediatamente. È come se fossero performance in tempo reale (bello -20).
Nel primo scenario l'hyperthreading è uselles, le attività in background useranno costosi switch di contesto perché ho massimizzato l'hyperthreading con la normale elaborazione. Il secondo è irripetibile perché fino al 50% della mia potenza della cpu è prioritario rispetto alle attività in background.
I compiti "ad alta intensità di cpu" di cui sto parlando sono server di mining e autorizzazione di dati di intelligenza artificiale (il mio lavoro). Rendering di Blender in computer e cluster economici (per disegnare la mia casa futura).
Inoltre, si tratta di congetture.
Ho l'impressione che sia migliore, ma potrebbe non esserlo.
sysbench --num-threads=1 --test=cpu run
con diversi num-thread e HT attivato e disattivato indica che la disabilitazione di HT diminuisce la prestazione quando ci sono molti thread e anche se c'è solo un thread non è utile disattivare HT. Quindi suggerisco di lasciarlo così com'è: è ottimale.