บทนำ
นี่เป็นคำถามที่น่าสนใจ อาจเป็นหนึ่งในสิ่งที่น่าสนใจที่สุดในเดือนสำหรับฉันเป็นการส่วนตัว เช่นเดียวกับ OP ไม่มีตัวเลือกสำหรับปิดการใช้งาน Hyper Threading ใน BIOS เก่าของฉัน (คิดค้น 2012, อัพเดท 2016 หรือมากกว่านั้น)
ข้อบกพร่อง Hyper-Threading ใน Intel Skylake และ Kaby Lake:
ทุกคนที่ใช้โปรเซสเซอร์ Intel SkylakeหรือKaby Lakeจะต้องอ่านรายงานข้อผิดพลาดเกี่ยวกับ Hyper Threading ที่ผุดขึ้นมาเมื่อสองสามเดือนก่อน เรื่องนี้ลงทะเบียนในสหราชอาณาจักรสะกดว่า Debian Developers เห็นว่า Hyper Threading สามารถพังและทำให้เครื่องเสียหายได้อย่างไร
มีปัญหามากมายเกี่ยวกับ Skylake ที่ถูกรายงานใน Ask Ubuntu ในช่วงปีที่ผ่านมาและสิ่งหนึ่งที่สงสัยว่าจะทราบได้อย่างไรว่าปัญหาใดบ้างที่เกิดจากข้อบกพร่องของ Hyper Threading
คำตอบนี้แบ่งออกเป็นสามส่วน:
- การแสดงซีพียูเมื่อ Hyper-Threading ถูกปิด / เปิด
- Bash script เพื่อเปิด / ปิดการไฮเปอร์เธรดอัตโนมัติ
- Conky ล้มเหลวหาก Hyper Threading ถูกปิดก่อนที่จะเริ่ม
การแสดงซีพียูเมื่อ Hyper-Threading ถูกปิด / เปิด
ด้านล่างคุณจะเห็นการใช้ประโยชน์ CPU เมื่อปิดการทำไฮเปอร์เธรดและทดสอบความเค้นของ CPU ประมาณ 10 วินาทีในภายหลังสคริปต์เดียวกันนี้จะถูกทำซ้ำโดยมีการเปิดเธรดไฮเปอร์ ในที่สุด 10 วินาทีหลังจากนั้นสคริปต์จะถูกเรียกใช้โดยปิดการทำไฮเปอร์เธรดอีกครั้ง:
จอแสดงผลแบ่งออกเป็นสองส่วน:
- ทางด้านซ้ายครึ่งหน้าต่างเทอร์มินัลกล่าวอ้างสคริปต์
set-hyper-threading
ด้วยพารามิเตอร์ 0 (ปิด) และ 1 (เปิด)
- ทางด้านขวา
conky
แสดงเปอร์เซ็นต์การใช้ประโยชน์ CPU ของ CPUS 1 ถึง 8
สคริปต์แรกเรียกใช้ Hyper Threading
ครั้งแรกที่สคริปต์รันหมายเลข CPU 2, 4, 6 & 8 (ตาม Conky) จะถูกตรึงที่ 3%, 2%, 2% และ 2% หมายเลข CPU 1, 3, 5 และ 7 ขัดขวางถึง 100% ในขณะที่ทำการทดสอบความเค้น
โทโพโลยีของ CPU จะแสดงขึ้นเมื่อปิดการทำงานเธรดไฮเปอร์และมีเพียงสี่คอร์เท่านั้นที่รายงาน:
/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
สคริปต์ที่สองเปิดใช้งาน Hyper Threading
ครั้งที่สองที่สคริปต์รัน Hyper-Threading ถูกเปิดใช้งานและหมายเลข CPU ทั้งหมด 1-8 ขัดขวางถึง 100% ในขณะที่ทำการทดสอบความเครียด
โทโพโลยีของ CPU จะแสดงขึ้นเมื่อเปิดใช้งานไฮเปอร์เธรดและมีเพียงสี่คอร์บวกและคอร์เสมือนสี่คอร์เท่านั้น
/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
สคริปต์ที่สามเรียกใช้ Hyper Threading
สังเกตว่าหลังจากสคริปต์ที่สองสิ้นสุด CPUs 2, 4, 6 และ 8 แล้วที่ไม่ทำงานที่ 4%, 2%, 3%, 4% นี่เป็นสิ่งสำคัญเนื่องจากในการทดสอบที่สามการปิด Hyper-Threading off แสดงให้เห็นว่าเปอร์เซ็นต์ CPU ที่ตรึงไว้ที่ 4%, 2%, 3%, 4% มากกว่า 3%, 2%, 2% และ 2% จากการทดสอบครั้งแรก
ดังนั้นการปิดไฮเปอร์เธรดจึงดูเหมือนว่าจะหยุดการทำงานของ CPU เสมือน ณ สถานะปัจจุบัน
นอกจากนี้โปรดทราบว่าหากคุณเปิดหรือปิด Hyper-Threading สคริปต์จะยังคงแสดง "รองรับ Hyper Threading"
Bash script เพื่อเปิด / ปิดการไฮเปอร์เธรดอัตโนมัติ
เมื่อดูสคริปต์ด้านล่างโปรดทราบว่า Conky กำหนดหมายเลข CPU จาก 1 ถึง 8 แต่ Linux จะระบุหมายเลข CPU จาก 0 ถึง 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
หมายเหตุ:โปรแกรมดังstress
กล่าวสร้างขึ้นในระบบ Debian ทุกระบบที่ Ubuntu เป็นตราสารอนุพันธ์ ดังนั้นคุณไม่ต้องดาวน์โหลดและติดตั้งแพคเกจใด ๆ เพื่อเรียกใช้สคริปต์นี้ใน Ubuntu
หากคุณมี CPU แบบดูอัลคอร์คุณจำเป็นต้องลบ (หรือใส่ความคิดเห็นด้วย#
) บรรทัดที่ควบคุมหมายเลข CPU 5 และ 7
ให้เครดิตกับHi-Angelสำหรับ bash line ที่grep "" /sys/devices/system/cpu/cpu*/topology/core_id
แสดงโทโพโลยีของ CPU
Conky ล้มเหลวหาก Hyper Threading ถูกปิดก่อนที่จะเริ่ม
เพื่อให้ได้ CPUs 2, 4, 6, 8 ถึงการใช้เปอร์เซ็นต์ที่น้อยที่สุดฉันพยายามปิด Hyper-Threading ในระหว่างการบูทขึ้น ฉันใช้สคริปต์นี้เพื่อทำสิ่งนั้น:
# 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
อย่างไรก็ตามconky
เกิดข้อผิดพลาดกับการแบ่งเซ็กเมนต์ถ้าการไฮเปอร์เธรดถูกปิดเมื่อเริ่มทำงาน เช่นนี้ฉันต้องแสดงความคิดเห็นสี่@reboot
บรรทัดในสคริปต์
รหัส Conky เพื่อแสดงการใช้เปอร์เซ็นต์ CPU และตัวประกอบภาระ
หากคุณมีความสนใจในการตั้งค่าการแสดงผลที่คล้ายกันใน Conky นี่คือตัวอย่างรหัสที่เกี่ยวข้อง:
${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}
หมายเหตุ:รหัส Nvidia ด้านบนไม่เคยทำการทดสอบเพราะฉันยังไม่ได้ให้ Nvidia GPU ทำงานภายใต้ Ubuntu เร็ว ๆ นี้ :)