Saya menjalankan server ubuntu 16.04. Saya dapat melihat bahwa hype threading diaktifkan ketika saya menggunakan perintah lscpu.
Saya ingin menonaktifkannya. Saya pergi melalui forum ubuntu dan di sini dan di sini .
Ini adalah diskusi yang bagus mengapa hyper threading mungkin tidak baik. Namun tidak ada solusi pasti tentang cara mematikannya.
Adakah yang bisa memberikan langkah-langkah untuk menonaktifkan hyperthreading? Terima kasih.
Jawaban:
pengantar
Ini pertanyaan yang menarik. Mungkin salah satu yang paling menarik dalam beberapa bulan bagi saya secara pribadi. Seperti OP, tidak ada opsi untuk menonaktifkan Hyper Threading di BIOS lama saya (ditemukan 2012, diperbarui 2016 atau lebih).
Bug Hyper-Threading di Intel Skylake dan Kaby Lake:
Ada banyak masalah dengan Skylake yang dilaporkan di Ask Ubuntu selama setahun terakhir dan orang bertanya-tanya bagaimana membedakan masalah yang mungkin disebabkan oleh bug Hyper Threading.
Jawaban ini dibagi menjadi tiga bagian:
Tampilan CPU saat Hyper-Threading dimatikan / dihidupkan
Di bawah ini Anda dapat melihat pemanfaatan CPU ketika hyper-threading dimatikan dan tes stres CPU dilakukan. Sekitar 10 detik kemudian script yang sama diulangi dengan hyper threading dihidupkan. Akhirnya 10 detik setelah itu skrip dijalankan dengan hyper-threading dimatikan lagi:
Layar dibagi menjadi dua bagian:
set-hyper-threading
dengan parameter 0 (off) dan kemudian 1 (on).conky
menampilkan persentase penggunaan CPU dari CPUS 1 hingga 8.Script pertama menjalankan Hyper Threading off
Pertama kali skrip dijalankan Nomor CPU 2, 4, 6 & 8 (menurut Conky) dibekukan pada 3%, 2%, 2% dan 2%. CPU Angka 1, 3, 5 dan 7 melonjak hingga 100% saat stress test dijalankan.
Topologi CPU ditampilkan dengan hyper-threading dimatikan dan hanya empat core yang dilaporkan:
Script kedua jalankan Hyper Threading
Kedua kalinya skrip dijalankan Hyper-Threading dihidupkan dan semua CPU Number 1-8 melonjak hingga 100% saat stress test dijalankan.
Topologi CPU ditampilkan dengan hiper-threading dihidupkan dan hanya empat core plus dan empat core virtual yang dilaporkan:
Script ketiga menjalankan Hyper Threading off
Perhatikan bagaimana setelah skrip kedua berakhir, CPU 2, 4, 6 dan 8 idle pada 4%, 2%, 3%, 4%. Ini penting karena dalam tes ketiga mematikan Hyper-Threading off menunjukkan persentase CPU yang dibekukan pada 4%, 2%, 3%, 4% daripada 3%, 2%, 2% dan 2% dari tes pertama.
Karena itu mematikan hyper-threading tampaknya hanya membekukan CPU virtual pada kondisi saat ini.
Perhatikan juga, tidak peduli apakah Anda menghidupkan atau mematikan Hyper-Threading, skrip tetap menampilkan "Hyper Threading Didukung".
Bash script untuk secara otomatis mematikan / mematikan hyper-threading
Saat melihat skrip di bawah ini perlu diingat bahwa Conky memberi nomor CPU dari 1 hingga 8 tetapi Linux memberi nomor CPU dari 0 hingga 7.
CATATAN: Program
stress
ini dibangun di semua sistem Debian yang merupakan turunan dari Ubuntu. Karenanya Anda tidak perlu mengunduh dan menginstal paket apa pun untuk menjalankan skrip ini di Ubuntu.Jika Anda memiliki CPU dual core, Anda perlu menghapus (atau berkomentar dengan
#
) garis-garis yang mengontrol nomor CPU 5 dan 7.Kredit ke Hi-Angel untuk bash line yang
grep "" /sys/devices/system/cpu/cpu*/topology/core_id
menampilkan topologi CPU.Conky Hancur jika Hyper Threading dimatikan sebelum dimulai
Untuk mendapatkan CPU 2, 4, 6, 8 hingga pemanfaatan seminimal mungkin, saya mencoba mematikan Hyper-Threading saat boot up. Saya menggunakan skrip ini untuk melakukan itu:
Namun
conky
crash dengan kesalahan segmentasi jika hyper-threading dimatikan saat dijalankan. Karena itu saya harus mengomentari empat@reboot
baris dalam naskah.Conky Code untuk menampilkan utilisasi persen CPU dan load factor
Jika Anda tertarik untuk menyiapkan tampilan serupa di Conky di sini adalah cuplikan kode yang relevan:
CATATAN: Kode Nvidia di atas belum pernah diuji karena saya belum mendapatkan GPU Nvidia yang berfungsi di bawah Ubuntu. Setahun lagi sekarang :)
sumber
noht
tidak ada. Saya bahkan mengambil opsi melalui sumber linux-4.13-rc1 yang kadang-kadang saya miliki. Namun saya tentu mengerti apa yang bisa membingungkan Anda: dat bugreport mengeluh bahwa opsi tidak berfungsi, dan kemudian ditutupnextrelease
, seperti jika mereka memperbaiki sesuatu. Namun jika Anda membaca komentar, Anda akan melihat bahwa satu-satunya penggunaannoht
adalah untuk skrip buatan tangan yang memeriksa opsi perintah kernel untuk opsi, kemudian menonaktifkan inti melalui/sys/
sistem file. TKInoht
tidak berguna.noht
.Kernel terbaru mendukung parameter kernel maxcpus .
Ini memungkinkan Anda untuk mengatur jumlah CPU ke jumlah core fisik. Ini mungkin berguna untuk membantu mengurangi ancaman yang disebabkan oleh kerentanan MDS pada CPU Intel dari keluarga 6.
Bagaimana:
dengan hak istimewa sudo (root) terbuka / etc / default / grub dengan editor teks favorit Anda.
Temukan baris yang dimulai dengan GRUB_CMDLINE_LINUX_DEFAULT =
dan tambahkan maxcpus = n ke setiap parameter kernel yang ada seperti parameter splash sepi yang umum (di mana n = jumlah core fisik yang dimiliki cpu Anda.
Sebagai contoh pada Intel (R) Core (TM) i3-3220 CPU terpercaya saya @3,30GHz dual core dengan hyperthreading saya menambahkan maxcpus = 2 untuk mematikan hyperthreading pada saat boot.
Simpan file dan kemudian jalankan perintah
sudo update-grub
dan reboot.Anda dapat mengkonfirmasi kesuksesan dengan mengeluarkan perintah
lscpu | grep "per core"
yang seharusnya memberikan hasil seperti ini:Thread(s) per core: 1
Diuji pada kernel 4.4.0
Sumber:
https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html
/unix/145645/disabling-cpu-cores-on-quad-core-processor-on-linux
sumber
Anda dapat menonaktifkan hyperthreading di Linux sebagai root atau dengan hak superuser dengan:
Anda dapat menampilkan status hyperthreading saat ini dengan:
Perintah ini mencetak salah satu dari:
Atau, sebagian besar firmware BIOS juga menyertakan opsi untuk menonaktifkan hyperthreading. Jika dinonaktifkan di BIOS, kucing di atas kemungkinan akan kembali
forceoff
.sumber
maxcpus=
parameter kernel untuk menonaktifkan hyperthreading. Terutama karena saya tidak dapat menemukan dokumentasi resmi tentang interaksinya dengan core hyperthreading. Apakah dijamin untuk selalu menonaktifkan hyperthreading jika Anda tentukanmaxcpus=#real_cores
? Atau mungkin Anda berakhir dengan setengah core nyata dengan HT masih diaktifkan pada beberapa sistem? Juga satumaxcpus=
pengaturan tidak portabel antara mesin dengan jumlah inti yang berbeda. Mempertahankan variasi parameter ini untuk mesin yang berbeda akan membosankan dan rentan kesalahan.lscpu | grep "per core"
Anda membuat poin vaild mengenai portabilitas namun, di sisi lain pengaturan parameter kernel sekali tidak tampak terlalu berat tugas untuk saya.Berikut adalah skrip untuk mengidentifikasi core ht dan mengaktifkannya secara online / offline.
@ WinEunuuchs2Unix , mungkin Anda dapat menambahkan ini ke jawaban terbaik Anda.
sumber
for i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
The
maxcpus=n
parameter dalamGRUB_CMDLINE_LINUX_DEFAULT=
tidak bekerja dengan benar. Itu meninggalkan saya dengan 2 inti dan 4 utas bukannya 4 inti 4 utas.Saya menemukan solusinya.
Tambahkan
mitigations=auto,nosmt
keGRUB_CMDLINE_LINUX_DEFAULT=
sebagai gantinyaDiuji pada Ubuntu 16.04 LTS dengan Linux 4.4.0.
Sumber: https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/MDS
sumber
Cara yang sedikit lebih kuat dalam mencari kernel untuk pasangan hyperthread diperlukan untuk sistem di mana motherboard memiliki beberapa soket CPU karena core_id diduplikasi. Inilah versi saya pada sistem dengan dua chip Xeon 8-core (contoh dari Ubuntu 16.04):
Untuk berbagai keperluan, Anda mungkin juga ingin mencari di file
sumber
Jika Anda membaca diskusi, maka Anda mungkin tahu bahwa biasanya itu tidak masuk akal untuk dinonaktifkan, jadi saya akan menganggap Anda menginginkannya untuk tujuan belajar.
Gagasan HT adalah memiliki beberapa set register CPU untuk setiap inti fisik (yang disebut core virtual) . Tidak ada inti virtual yang "lebih baik", semuanya identik. Berbekal pengetahuan ini, Anda dapat menonaktifkan inti virtual kecuali satu untuk setiap fisik.
Pertama, Anda ingin tahu pasangan inti virtual mana yang memiliki inti fisik pada
/sys/
sistem file. Anda dapat menggunakancore_id
file untuk itu:Dari output Anda dapat menyimpulkan bahwa cpu0 + cpu2 terkandung dalam satu inti fisik, dan cpu1 + cpu3 di yang lain. Sekarang tinggikan hak istimewa, dan gunakan
echo
perintah untuk menonaktifkan satu di setiap pasangan:Perhatikan bahwa cpu0 tidak memiliki file "online" dan tidak dapat dinonaktifkan, jadi saya menonaktifkan cpu2.
sumber
Jawaban @ visit1985 tidak berfungsi jika separator di thread_siblings_list bukan koma (yang, misalnya, kasing pada sistem AMD Ryzen saya).
Berikut ini skrip untuk menonaktifkan hyper-threading yang berfungsi dengan pemisah apa pun:
Dan inilah satu untuk mengaktifkan hyper-threading:
sumber