Saya memiliki sistem yang menjalankan aplikasi perdagangan finansial di fasilitas terpencil. Saya tidak memiliki akses ke ILO / DRAC, tetapi harus menonaktifkan hyperthreading. Sistem menjalankan Intel Westmere 3.33GHz X5680 CPU hex-core. Saya dapat mem-boot ulang, tetapi ingin memastikan bahwa sistem tersebut tidak mengaktifkan hipertread karena masalah kinerja. Apakah ada cara bersih untuk melakukan ini dari dalam Linux?
Sunting: noht
Arahan yang ditambahkan ke baris perintah boot kernel tidak berfungsi. Sama untuk RHEL.
Lihat: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9
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.echo 1
alih-alihecho 0
harus mengaktifkannya kembali.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.
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.
sumber
Untuk kernel yang benar-benar tua (Linux 2.6.9 atau lebih), tambahkan parameter noht ke kernel saat boot.
Opsi baris perintah kernel ini telah dihapus sejak setidaknya Linux 2.6.18 .
Dari http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :
Jika menggunakan lilo sunting Anda /etc/lilo.conf (dan jalankan lilo sesudahnya) atau jika menggunakan grub kemudian edit /boot/grub/menu.lst Anda.
sumber
noht
entri di baris perintah grub kernel. Sistem tidak menghormatinoht
perintah. Sama untuk RHEL. Lihat: bugzilla.redhat.com/show_bug.cgi?id=440321#c9noht
opsi kernel telah dihapus. Ini sangat disayangkan, karena Linux memungkinkan solusi untuk beberapa Haswell perf-counter errata (BJ122, BV98, HSD29) hanya jika HT aktif , dan ini terjadi sebelum initramfs bahkan dimuat.Anda dapat menggunakan "thread_siblings_list" untuk setiap inti untuk mematikan inti kedua dalam pasangan HT.
Pipa perintah berikut ini adalah hacky, tidak dioptimalkan, dan dilakukan dengan cara ini semoga untuk membuatnya lebih mudah dimengerti.
jadi, ambil semua daftar utas saudara kandung, ekstrak CPU kedua untuk setiap pasangan, dapatkan daftar unik, lalu matikan.
Apakah ini masuk akal?
jika saya melakukan "cat / proc / cpuinfo" setelah menjalankan hal di atas, jumlah core menjadi dua.
sumber
echo 0 > /sys/devices/system/cpu/cpu$X/online
menjadiecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
Kernel yang lebih baru menyediakan kontrol Multithreading Simultan (SMT).
Anda dapat memeriksa status SMT dengan;
Ubah status dengan
Pilihannya adalah;
Kami telah menguji ini dengan Linux Kernel 4.4.0
sumber
Jawaban Lukas bagus tetapi tidak benar-benar berfungsi untuk menonaktifkan HT karena ID inti tidak dapat berfungsi untuk identifikasi saudara HT. Alih-alih, skrip ini berfungsi:
sumber
Saya harus menunggu sampai saya bisa masuk ke ILO / Drac. Parameter boot kernel tidak berfungsi pada distribusi Linux saat ini.
sumber
Dalam paket libsmbios-bin (Debian, Ubuntu, dll), Anda memiliki binari isCmosTokenActive dan mengaktifkanCmosToken. Bersama dengan token list , Anda dapat mencoba sesuatu seperti ini:
Kemudian aktifkan token CPU_Hyperthreading_Disable:
Memeriksa:
Sekarang, pertanyaan besarnya adalah apakah Anda hanya perlu reboot atau tidak agar ini berlaku, atau jika diperlukan siklus daya penuh. Cobalah dan lihat bagaimana hasilnya!
sumber
Berdasarkan info yang diberikan oleh Paul M di sini, saya akan "menulis" dengan cara ini:
Tentu saja itu tidak mematikan hyper-threading dalam arti yang sama seperti bermain-main dengan BIOS akan dilakukan , pada dasarnya itu hanya memberitahu scheduler tugas kernel untuk tidak menggunakan beberapa core karena kita tahu mereka palsu.
Perangkat lunak yang membuat asumsinya berdasarkan keadaan
/proc
atau/sys
sub-sistem sebelumnya mungkin masih berjalan secara sub-optimal atau bahkan gagal karena perubahan run-time ini sehingga diperlukan restart-nya. Misalnya, saya perhatikanirqbalance
cenderung gagal dalam keadaan itu.sumber
Nonaktifkan HT:
Aktifkan HT:
Catatan: Ini tidak benar-benar menonaktifkan HyperThreading tetapi mereka menonaktifkan inti "palsu" yang mendapatkan hasil yang hampir sama.
sumber
tee
, tetapi ini masih gagal memberikan jawaban nyata untuk pertanyaan itu. Perintah-perintah itu hanya berlaku untuk konfigurasi perangkat keras tertentu dan mungkin memiliki efek yang tidak diinginkan pada konfigurasi perangkat keras lainnya. Dan penjelasan tentang apa yang dilakukan perintah-perintah itu sama sekali tidak ada.Topik lama, tetapi punya alasan untuk mencoba eksperimen ini. Pertama, saya sama sekali tidak yakin bahwa menonaktifkan CPU (sedikit palsu) saat runtime benar-benar setara dengan menonaktifkan Hyperthreading saat boot. Yang mengatakan, saya memang melihat peningkatan kinerja kecil dalam aplikasi kami. (Tapi tidak cukup untuk menjaga.)
Menggunakan nilai thread_siblings (umum untuk CPU hyperthreaded) sebagai kunci untuk mengaktifkan / menonaktifkan:
Coba perintah tanpa sudo sh terakhir untuk memverifikasi benar.
sumber