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:
Siapa pun yang menggunakan prosesor Intel Skylake atau Kaby Lake harus membaca laporan bug tentang Hyper Threading yang muncul beberapa bulan lalu. Ini UK Register cerita merinci bagaimana Debian Pengembang melihat bagaimana Hyper Threading dapat crash dan korup mesin.
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
- Bash script untuk secara otomatis mematikan / mematikan hyper-threading
- Conky Hancur jika Hyper Threading dimatikan sebelum dimulai
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:
- Di setengah kiri jendela terminal memanggil script
set-hyper-threading
dengan parameter 0 (off) dan kemudian 1 (on).
- Di bagian kanan
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:
/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
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:
/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu3/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu5/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
/sys/devices/system/cpu/cpu7/topology/core_id:3
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.
#!/bin/bash
# NAME: set-hyper-threading
# PATH: /usr/local/bin
# DESC: Turn Hyper threading off or on.
# DATE: Aug. 5, 2017.
# NOTE: Written Part of testing for Ubuntu answer:
# /ubuntu/942728/disable-hyper-threading-in-ubuntu/942843#942843
# PARM: 1="0" turn off hyper threading, "1" turn it on.
if [[ $# -ne 1 ]]; then
echo 'One argument required. 0 to turn off hyper-threading or'
echo '1 to turn hyper-threading back on'
exit 1
fi
echo $1 > /sys/devices/system/cpu/cpu1/online
echo $1 > /sys/devices/system/cpu/cpu3/online
echo $1 > /sys/devices/system/cpu/cpu5/online
echo $1 > /sys/devices/system/cpu/cpu7/online
grep "" /sys/devices/system/cpu/cpu*/topology/core_id
grep -q '^flags.*[[:space:]]ht[[:space:]]' /proc/cpuinfo && \
echo "Hyper-threading is supported"
grep -E 'model|stepping' /proc/cpuinfo | sort -u
stress --cpu 8 --io 1 --vm 1 --vm-bytes 128M --timeout 10s
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:
# NAME: /etc/cron.d/turn-off-hyper-threading
# DATE: Auguust 5, 1017
# DESC: This turns off CPU 1, 3, 5 & 7
# NOTE: Part of testing for Ubuntu answer:
# /ubuntu/942728/disable-hyper-threading-in-ubuntu/942843#942843
# BUGS: Conky crashes with Segmentation Fault when CPU 2,4,6 & 8 (as conky calls them)
# are off-line.
#
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#
# @reboot root echo 0 > /sys/devices/system/cpu/cpu1/online
# @reboot root echo 0 > /sys/devices/system/cpu/cpu3/online
# @reboot root echo 0 > /sys/devices/system/cpu/cpu5/online
# @reboot root echo 0 > /sys/devices/system/cpu/cpu7/online
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:
${color orange}${voffset 2}${hr 1}
${color2}${voffset 5}Intel® i-7 3630QM 3.4 GHz: ${color1}@ ${color green}${freq} MHz
${color}${goto 13}CPU 1 ${goto 81}${color green}${cpu cpu1}% ${goto 131}${color3}${cpubar cpu1 18}
${color}${goto 13}CPU 2 ${goto 81}${color green}${cpu cpu2}% ${goto 131}${color3}${cpubar cpu2 18}
${color}${goto 13}CPU 3 ${goto 81}${color green}${cpu cpu3}% ${goto 131}${color3}${cpubar cpu3 18}
${color}${goto 13}CPU 4 ${goto 81}${color green}${cpu cpu4}% ${goto 131}${color3}${cpubar cpu4 18}
${color}${goto 13}CPU 5 ${goto 81}${color green}${cpu cpu5}% ${goto 131}${color3}${cpubar cpu5 18}
${color}${goto 13}CPU 6 ${goto 81}${color green}${cpu cpu6}% ${goto 131}${color3}${cpubar cpu6 18}
${color}${goto 13}CPU 7 ${goto 81}${color green}${cpu cpu7}% ${goto 131}${color3}${cpubar cpu7 18}
${color}${goto 13}CPU 8 ${goto 81}${color green}${cpu cpu8}% ${goto 131}${color3}${cpubar cpu8 18}
${color1}All CPU ${color green}${cpu}% ${goto 131}${color1}Temp: ${color green}${hwmon 2 temp 1}°C ${goto 250}${color1}Up: ${color green}$uptime
${color green}$running_processes ${color1}running of ${color green}$processes ${color1}loaded processes.
Load Avg. 1-5-15 minutes: ${alignr}${color green}${execpi .001 (awk '{printf "%s/", $1}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $2}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $3}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4}
${color1}NVIDIA ${color}-GPU ${color green}${nvidia gpufreq} Mhz ${color}-Memory ${color green}${nvidia memfreq} Mhz
${color1}GT650M ${color}-Temp ${color green}${nvidia temp}°C ${color}-Threshold ${color green}${nvidia threshold}°C
${color orange}${voffset 2}${hr 1}
CATATAN: Kode Nvidia di atas belum pernah diuji karena saya belum mendapatkan GPU Nvidia yang berfungsi di bawah Ubuntu. Setahun lagi sekarang :)