ปิดการใช้งานเธรดไฮเปอร์ใน Ubuntu


15

ฉันใช้เซิร์ฟเวอร์ Ubuntu 16.04 ฉันเห็นว่า hype threading ถูกเปิดใช้งานเมื่อฉันใช้คำสั่ง lscpu

ฉันต้องการปิดการใช้งาน ฉันเดินผ่านฟอรั่มอูบุนตูและที่นี่และที่นี่

สิ่งเหล่านี้เป็นการสนทนาที่ดีว่าทำไมการทำเกลียวมากเกินไปอาจจะไม่ดี แต่ไม่มีวิธีการแก้ปัญหาที่ชัดเจนเกี่ยวกับวิธีการปิด

มีขั้นตอนใดบ้างในการปิดใช้งานไฮเปอร์เธรด ขอบคุณ


3
คุณได้ลองปิดการใช้งานใน BIOS หรือไม่?
edwinksl

ใช่ไม่พบตัวเลือกสำหรับ HT
john

คำตอบ:


9

บทนำ

นี่เป็นคำถามที่น่าสนใจ อาจเป็นหนึ่งในสิ่งที่น่าสนใจที่สุดในเดือนสำหรับฉันเป็นการส่วนตัว เช่นเดียวกับ 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 วินาทีหลังจากนั้นสคริปต์จะถูกเรียกใช้โดยปิดการทำไฮเปอร์เธรดอีกครั้ง:

ตั้งค่า Hyper Threading

จอแสดงผลแบ่งออกเป็นสองส่วน:

  • ทางด้านซ้ายครึ่งหน้าต่างเทอร์มินัลกล่าวอ้างสคริปต์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 เร็ว ๆ นี้ :)


1
ขออภัยnohtไม่มีอยู่จริง ฉันทำตัวเป็นตัวเลือกผ่านแหล่งข้อมูล linux-4.13-rc1 ที่ฉันมีอยู่เป็นครั้งคราว อย่างไรก็ตามฉันเข้าใจว่าสิ่งที่อาจทำให้คุณสับสน: dat bugreportบ่นว่าตัวเลือกไม่ทำงานแล้วมันก็ปิดnextreleaseเหมือนว่าพวกเขาแก้ไขอะไรบางอย่าง อย่างไรก็ตามหากคุณอ่านความคิดเห็นคุณจะเห็นว่าการใช้งานเพียงอย่างเดียวnohtคือสำหรับสคริปต์ที่สร้างขึ้นด้วยมือซึ่งจะตรวจสอบตัวเลือกบรรทัดคำสั่งเคอร์เนลจากนั้นปิดใช้งานแกนกลางผ่าน/sys/ระบบไฟล์ IOW nohtไร้ประโยชน์
สวัสดีแองเจิล

@ Hi-Angel ขอบคุณที่บอกว่าไม่จำเป็น ฉันทำการทดสอบโดยไม่ใช้มันและแกนออฟไลน์เพิ่มขึ้นสองเท่าจาก 2,2,5,5% (ที่ไม่มี noht) เป็น 5,5,10,10% (โดยไม่มี noht) ฉันจะทำการทดสอบเพิ่มเติมคืนนี้ nohtฉันค้นหาเอกสารพารามิเตอร์เคอร์เนลและไม่สามารถหาอ้างอิงถึง
WinEunuuchs2Unix

ในบันทึกด้านข้างไม่มีเครื่อง / ภาษามนุษย์ในการจัดทำดัชนี :) เพื่อแก้ไขความสับสนกับดัชนีที่เริ่มต้นจาก 0, 1 หรือแม้แต่หมายเลขเฉพาะ(ตามที่อยู่ใน MiniZinc)ควรคิดในแง่ของชุดดัชนีเช่น การพลัดพรากจากดัชนีชุดหนึ่งไปอีกชุดหนึ่ง การสรุปออกไปช่วยให้คุณสามารถจดบันทึกได้ง่ายขึ้นเมื่อมีบางสิ่งที่เกี่ยวข้องกับข้อมูลซึ่งไม่ได้เป็นตัวแทนดัชนีสามารถนำไปใช้ในการจัดทำดัชนีได้จริงหลังจากที่ได้รับการทวีคูณเล็กน้อย ข้อดีมาจากการคำนึงถึงแนวคิดที่ไม่ได้ผูกมัดจากเค้าโครงหน่วยความจำและข้อ จำกัด อื่น ๆ
สวัสดีแองเจิล

@ Hi-Angel การเปรียบเทียบที่คล้ายกันระหว่าง "ตำแหน่งเริ่มต้น" และ "ออฟเซ็ต" ฉันเดาว่า อย่างไรก็ตามฉันกำลังจะเขียนคำตอบนี้ใหม่ตามสองวันสุดท้ายของการทดสอบและการเข้ารหัสดังนั้นความคิดเห็นของเราจะล้าสมัยในไม่ช้า ...
WinEunuuchs2Unix

6

เมล็ดล่าสุดสนับสนุนพารามิเตอร์เคอร์เนล maxcpus

สิ่งนี้อนุญาตให้คุณตั้งค่าจำนวน cpus เป็นจำนวนของฟิสิคัลคอร์ สิ่งนี้อาจเป็นประโยชน์ในการช่วยบรรเทาภัยคุกคามที่เกิดจากช่องโหว่ MDSบน Intel CPUs จากตระกูล 6

วิธี:

ด้วยสิทธิ์ sudo (รูท) เปิด / etc / default / grub ด้วยโปรแกรมแก้ไขข้อความที่คุณโปรดปราน

ค้นหาบรรทัดที่ขึ้นต้นด้วยGRUB_CMDLINE_LINUX_DEFAULT =

และเพิ่ม maxcpus = n ให้กับพารามิเตอร์เคอร์เนลที่มีอยู่เช่นพารามิเตอร์สแปลเงียบทั่วไป(โดยที่ n = จำนวนแกนประมวลผลฟิสิคัลที่ CPU ของคุณมี

ตัวอย่างเช่นในซีพียู Intel (R) Core (TM) i3-3220 ที่ @ 3.30GHz แบบ dual-core พร้อม hyperthreading ฉันเพิ่มmaxcpus = 2เพื่อปิดไฮเปอร์เธรดในเวลาบูต

บันทึกไฟล์จากนั้นออกคำสั่งsudo update-grubและรีบูต

คุณสามารถยืนยันความสำเร็จโดยการออกคำสั่งlscpu | grep "per core"ซึ่งควรให้ผลลัพธ์ดังนี้:

Thread(s) per core: 1

ทดสอบกับเคอร์เนล 4.4.0

แหล่งที่มา:

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


1
ลิงค์ที่น่าสนใจ ขอบคุณสำหรับการแบ่งปัน.
WinEunuuchs2Unix

@ WinEunuuchs2Unix ความสุขของฉัน กระตือรือร้นที่จะช่วย
Elder Geek

5

คุณสามารถปิดใช้งานไฮเปอร์เธรดใน Linux ในฐานะรูทหรือด้วยสิทธิ์ของ superuser ด้วย:

# echo off > /sys/devices/system/cpu/smt/control

คุณสามารถแสดงสถานะไฮเปอร์เธรดปัจจุบันด้วย:

$ cat /sys/devices/system/cpu/smt/control

คำสั่งนี้พิมพ์หนึ่งใน:

on|off|forceoff|notsupported|notimplemented

เฟิร์มแวร์ BIOS ส่วนใหญ่ยังมีตัวเลือกสำหรับการปิดใช้งานไฮเปอร์เธรด ถ้ามันถูกปิดการใช้งานใน BIOS แมวน่าจะกลับforceoffมา


คุณได้ลองทำเช่นนี้เพื่อปิดการใช้งานเธรดไฮเปอร์ตอนบูตหรือไม่?
Elder Geek

1
@ElderGeek ไม่ฉันไม่ได้ลองใช้maxcpus=พารามิเตอร์ kernel สำหรับปิดการใช้งานไฮเปอร์เธรด ส่วนใหญ่เป็นเพราะฉันไม่สามารถหาเอกสารอย่างเป็นทางการเกี่ยวกับการมีปฏิสัมพันธ์กับแกนทำไฮเปอร์เธรด มีการรับประกันว่าจะปิดใช้งานไฮเปอร์เธรดเสมอmaxcpus=#real_coresหรือไม่หากคุณระบุ หรือคุณอาจท้ายครึ่งแกนจริงด้วย HT ยังคงเปิดใช้งานในบางระบบ? นอกจากนี้maxcpus=การตั้งค่าเดียวยังไม่สามารถเคลื่อนย้ายได้ระหว่างเครื่องที่มีคอร์ที่แตกต่างกัน การคงรูปแบบของพารามิเตอร์นี้สำหรับเครื่องที่แตกต่างกันน่าเบื่อและเกิดข้อผิดพลาดได้ง่าย
maxschlepzig

ในประสบการณ์ของฉันมีการปิดใช้งานไฮเปอร์เธรดเสมอหากคุณระบุ maxcpus = # real_cores ที่ให้ไว้โดยแน่นอนว่าคุณไว้วางใจผลลัพธ์ของlscpu | grep "per core"คุณสร้างจุด vaild เกี่ยวกับความสะดวกในการพกพาอย่างไรก็ตามในทางกลับกันการตั้งค่าพารามิเตอร์เคอร์เนล ถึงฉัน.
Elder Geek

2

นี่คือสคริปต์ในการระบุ ht-cores และสลับเป็นออนไลน์ / ออฟไลน์

#!/bin/bash
typeset -i core_id
typeset -i sibling_id
typeset -i state

for i in /sys/devices/system/cpu/cpu[0-9]*; do
  core_id="${i##*cpu}"
  sibling_id="-1"

  if [ -f ${i}/topology/thread_siblings_list ]; then
    sibling_id="$(cut -d',' -f1 ${i}/topology/thread_siblings_list)"
  fi

  if [ $core_id -ne $sibling_id ]; then
    state="$(<${i}/online)"
    echo -n "$((1-state))" > "${i}/online"
    echo "switched ${i}/online to $((1-state))"
  fi
done

@ WinEunuuchs2Unixบางทีคุณสามารถเพิ่มคำตอบนี้ได้


ฉันต้องเรียงลำดับรายการตัวเลขเพื่อให้มันทำงานได้อย่างถูกต้อง:for i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
35919

2

maxcpus=nพารามิเตอร์ในการGRUB_CMDLINE_LINUX_DEFAULT=ทำงานไม่ถูกต้อง มันทิ้งฉันไว้กับ 2 คอร์และ 4 เธรดแทน 4 คอร์ 4 เธรด

ฉันพบวิธีแก้ปัญหา

เพิ่มmitigations=auto,nosmtไปGRUB_CMDLINE_LINUX_DEFAULT=แทน

ทดสอบบน Ubuntu 16.04 LTS กับ Linux 4.4.0

ที่มา: https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/MDS


1

วิธีที่มีประสิทธิภาพมากขึ้นเล็กน้อยในการค้นหาเคอร์เนลสำหรับคู่ไฮเปอร์เธรดเป็นสิ่งจำเป็นสำหรับระบบที่เมนบอร์ดโฮสต์ซ็อกเก็ต CPU หลายอันเนื่องจาก core_id ซ้ำกัน นี่คือเวอร์ชั่นของฉันในระบบที่มีชิป Xeon 8-core สองตัว (ตัวอย่างจาก Ubuntu 16.04):

$ cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list \
> | sort --unique --numeric-sort
0,16
1,17
2,18
3,19
4,20
5,21
6,22
7,23
8,24
9,25
10,26
11,27
12,28
13,29
14,30
15,31

เพื่อวัตถุประสงค์ต่าง ๆ คุณอาจต้องการค้นหาในไฟล์

/sys/devices/system/cpu/present
/sys/devices/system/cpu/online
/sys/devices/system/cpu/offline

0

หากคุณอ่านการสนทนาคุณคงรู้ว่าโดยปกติแล้วมันจะไม่มีเหตุผลที่จะปิดการใช้งานดังนั้นฉันจะถือว่าคุณต้องการเพื่อการเรียนรู้

ความคิดของ HT จะมีหลายชุดของการลงทะเบียนสำหรับ CPU หลักทางกายภาพทุก(ที่เรียกว่าแกนเสมือน) ไม่มีแกนเสมือน "ที่ดีกว่า" มันเหมือนกัน อาวุธที่มีความรู้นี้คุณสามารถปิดการใช้งานแกนกลางเสมือนจริงยกเว้นสำหรับหนึ่งสำหรับทุกทางกายภาพ

ก่อนอื่นคุณต้องรู้ว่าคู่ของคอร์เสมือนใดเป็นของฟิสิคัลคอร์ที่/sys/ระบบไฟล์ คุณสามารถใช้core_idไฟล์เพื่อ:

λ grep "" /sys/devices/system/cpu/cpu*/topology/core_id
/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:2
/sys/devices/system/cpu/cpu2/topology/core_id:0
/sys/devices/system/cpu/cpu3/topology/core_id:2

จากเอาต์พุตคุณสามารถอนุมานได้ว่า cpu0 + cpu2 มีอยู่ในฟิสิคัลคอร์หนึ่งและ cpu1 + cpu3 ที่อื่น ตอนนี้ยกระดับสิทธิ์และใช้echoคำสั่งเพื่อปิดการใช้งานหนึ่งในทุกคู่:

λ sudo -s
# echo 0 > /sys/devices/system/cpu/cpu1/online
# echo 0 > /sys/devices/system/cpu/cpu2/online

โปรดทราบว่า cpu0 ไม่มีไฟล์ "ออนไลน์" และไม่สามารถปิดการใช้งานได้ดังนั้นฉันจึงปิดการใช้งาน cpu2 แทน


0

คำตอบของ @ visit1985 ไม่ทำงานหากตัวแยกใน thread_siblings_list ไม่ใช่เครื่องหมายจุลภาค (ตัวอย่างเช่นกรณีของระบบ AMD Ryzen ของฉัน)

นี่คือสคริปต์ในการปิดไฮเปอร์เธรดที่ทำงานกับตัวคั่นใด ๆ :

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    if [ -e "$cpu/topology/thread_siblings_list" ]; then
        sibling=$(awk -F '[^0-9]' '{ print $2 }' $cpu/topology/thread_siblings_list)
        if [ ! -z $sibling ]; then
            echo 0 > "/sys/devices/system/cpu/cpu$sibling/online"
        fi
    fi
done

และนี่คือการเปิดใช้เธรดไฮเปอร์:

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    echo 1 > "$cpu/online"
done

ไม่ใช้วิธีนี้ทำงานบน CPU Ryzen ของคุณหรือไม่
Elder Geek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.