Giới thiệu
Đây là một câu hỏi thú vị. Có lẽ là một trong những điều thú vị nhất trong tháng đối với cá nhân tôi. Giống như OP, không có tùy chọn nào để vô hiệu hóa Hyper Threading trong BIOS cũ của tôi (được phát minh năm 2012, cập nhật 2016 hoặc hơn).
Lỗi siêu phân luồng trong Intel Skylake và Kaby Lake:
Bất cứ ai sử dụng bộ xử lý Intel Skylake hoặc Kaby Lake đều phải đọc các báo cáo lỗi về Hyper Threading xuất hiện vài tháng trước. Câu chuyện đăng ký tại Vương quốc Anh này giải thích cách các nhà phát triển Debian phát hiện ra cách Hyper Threading có thể sập và làm hỏng máy.
Có rất nhiều vấn đề với Skylake được báo cáo trong Ask Ubuntu trong năm ngoái và người ta tự hỏi làm thế nào để nhận ra vấn đề nào có thể do lỗi Hyper Threading gây ra.
Câu trả lời này được chia thành ba phần:
- Hiển thị CPU khi Hyper-Threading bị tắt / bật
- Tập lệnh Bash để tự động tắt / bật siêu phân luồng
- Sự cố Conky nếu Hyper Threading bị tắt trước khi bắt đầu
Hiển thị CPU khi Hyper-Threading bị tắt / bật
Dưới đây bạn có thể thấy việc sử dụng CPU khi siêu phân luồng bị tắt và kiểm tra căng thẳng CPU được thực hiện. Khoảng 10 giây sau, kịch bản tương tự được lặp lại với siêu phân luồng được bật. Cuối cùng, 10 giây sau đó, đoạn script được chạy với siêu phân luồng được tắt lại:
Màn hình được chia thành hai phần:
- Ở nửa bên trái, cửa sổ đầu cuối gọi tập lệnh
set-hyper-threading
với tham số 0 (tắt) và sau đó 1 (bật).
- Ở nửa bên phải
conky
hiển thị mức sử dụng phần trăm CPU của CPUS 1 đến 8.
Kịch bản đầu tiên chạy Hyper Threading tắt
Lần đầu tiên tập lệnh chạy CPU Số 2, 4, 6 & 8 (theo Conky) bị đóng băng ở mức 3%, 2%, 2% và 2%. Số CPU 1, 3, 5 và 7 tăng vọt lên 100% trong khi kiểm tra căng thẳng được chạy.
Cấu trúc liên kết CPU được hiển thị với siêu phân luồng đã tắt và chỉ có bốn lõi được báo cáo:
/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
Kịch bản thứ hai chạy Hyper Threading trên
Lần thứ hai tập lệnh được chạy Hyper-Threading được bật và tất cả các số CPU tăng vọt lên 100% trong khi kiểm tra căng thẳng được chạy.
Cấu trúc liên kết CPU được hiển thị với siêu phân luồng được bật và chỉ có bốn lõi cộng và bốn lõi ảo được báo cáo:
/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
Kịch bản thứ ba chạy Hyper Threading tắt
Lưu ý làm thế nào sau khi tập lệnh thứ hai kết thúc CPU 2, 4, 6 và 8 không hoạt động ở mức 4%, 2%, 3%, 4%. Điều này rất quan trọng vì trong thử nghiệm thứ ba, tắt Hyper-Threading cho thấy các phần trăm CPU bị đóng băng ở mức 4%, 2%, 3%, 4% thay vì 3%, 2%, 2% và 2% từ thử nghiệm đầu tiên.
Do đó, tắt siêu phân luồng dường như chỉ đóng băng các CPU ảo ở trạng thái hiện tại.
Cũng lưu ý cho dù bạn bật hay tắt Hyper-Threading thì tập lệnh vẫn hiển thị "Hyper Threading được hỗ trợ".
Tập lệnh Bash để tự động tắt / bật siêu phân luồng
Khi xem đoạn script dưới đây, hãy nhớ rằng Conky đánh số CPU từ 1 đến 8 nhưng Linux đánh số CPU từ 0 đến 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
LƯU Ý: Chương trình stress
được tích hợp vào tất cả các hệ thống Debian mà Ubuntu là một dẫn xuất của. Do đó, bạn không phải tải xuống và cài đặt bất kỳ gói nào để chạy tập lệnh này trong Ubuntu.
Nếu bạn có CPU lõi kép, bạn cần xóa (hoặc nhận xét với #
) các dòng điều khiển số CPU 5 và 7.
Tín dụng cho Hi-Angel cho dòng bash grep "" /sys/devices/system/cpu/cpu*/topology/core_id
hiển thị cấu trúc liên kết CPU.
Sự cố Conky nếu Hyper Threading bị tắt trước khi bắt đầu
Để có được CPU 2, 4, 6, 8 đến mức sử dụng phần trăm thấp nhất có thể, tôi đã thử tắt Hyper-Threading trong khi khởi động. Tôi đã sử dụng kịch bản này để làm điều đó:
# 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
Tuy nhiên, conky
sự cố với lỗi phân đoạn nếu siêu phân luồng bị tắt khi khởi động. Vì vậy, tôi đã phải bình luận ra bốn @reboot
dòng trong kịch bản.
Conky Code để hiển thị mức sử dụng phần trăm CPU và hệ số tải
Nếu bạn quan tâm đến việc thiết lập một màn hình tương tự trong Conky thì đây là đoạn mã có liên quan:
${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}
LƯU Ý: Mã Nvidia ở trên chưa bao giờ được kiểm tra vì tôi chưa có GPU Nvidia hoạt động trong Ubuntu. Bất cứ năm nào bây giờ :)