Sebuah skrip untuk menonaktifkan hyperthreading di permulaan mesin ...
Untuk menonaktifkan hyperthreading saya memasukkan skrip pada mesin /etc/rc.local. Ini tidak benar-benar bersih, tetapi mudah untuk menginstal, independen dari arsitektur cpu dan harus bekerja pada distribusi linux modern.
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;
Bagaimana ini bekerja?
Informasi dan kontrol kernel Linux dapat diakses sebagai file dalam direktori / sys pada distribusi linux modern. Sebagai contoh:
/ sys / devices / system / cpu / cpu3
berisi informasi kernel dan kontrol untuk cpu logis 3.
cat / sys / devices / system / cpu / cpu3 / topology / core_id
akan menunjukkan nomor inti dari cpu logis ini.
echo "0"> / sys / devices / system / cpu / cpu3 / online
memungkinkan untuk menonaktifkan cpu logis 3.
Mengapa ini berhasil?
Saya tidak tahu persis mengapa ... tetapi sistem menjadi lebih responsif dengan hyperthreading off (pada notebook i5 saya dan server Xeon besar dengan 60+ core). Saya kira itu ada hubungannya dengan cache per-cpu, alokasi memori per-cpu, alokasi scheduler cpu dan proses prioritas iterasi kompleks. Saya pikir manfaat dari hyperthreading adalah kelebihan dari kompleksitas membuat penjadwal cpu yang tahu bagaimana menggunakannya.
Bagi saya, masalah dengan hyperthreading adalah: Jika saya memulai thread intensif CPU sebanyak yang saya punya core logis, saya akan memiliki switch konteks cepat untuk tugas intensif CPU, tetapi yang mahal untuk tugas-tugas latar belakang karena hyperthreading benar-benar dikonsumsi oleh tugas intensif cpu. Di sisi lain, jika saya memulai thread intensif CPU sebanyak yang saya punya core fisik saya tidak akan memiliki switch konteks untuk tugas-tugas tersebut dan switch konteks cepat untuk tugas-tugas latar belakang. Tampaknya bagus, tetapi tugas latar belakang akan menemukan prosesor logis gratis dan akan berjalan hampir segera. Sepertinya mereka adalah realtime performace (bagus -20).
Dalam skenario pertama hyperthreading adalah uselles, tugas latar belakang akan menggunakan sakelar konteks mahal karena saya memaksimalkan hyperthreading dengan pemrosesan normal. Yang kedua tidak dapat diterima karena hingga 50% daya cpu saya diprioritaskan ke tugas latar belakang.
Tugas "intensif-cpu" yang saya bicarakan adalah server data mining dan otorisasi kecerdasan buatan (pekerjaan saya). Render blender di komputer dan cluster murah (untuk membuat sketsa rumah masa depan saya).
Juga, ini dugaan.
Saya memiliki kesan yang lebih baik, tetapi mungkin tidak.
sysbench --num-threads=1 --test=cpu run
dengan berbagai num-uts dan HT dihidupkan dan dimatikan mengatakan bahwa menonaktifkan HT mengurangi kinerja ketika ada banyak utas, dan bahkan jika hanya ada satu utas, tidak ada manfaat dari mematikan HT. Jadi saya sarankan untuk membiarkannya apa adanya: itu optimal.