ตรวจสอบว่ามีการเปิดใช้งาน HyperThreading หรือไม่?


51

ฉันจะตรวจสอบว่ามีการเปิดใช้งานไฮเปอร์เธรดในเครื่อง Linux โดยใช้สคริปต์ Perl เพื่อตรวจสอบได้อย่างไร

ฉันกำลังลองวิธีต่อไปนี้:

dmidecode -t processor | grep HTT

แจ้งให้เราทราบหากฉันถูก


2
เพราะdmidecodeคุณต้องรูต
นิลส์

5
ฉันชอบวิธีที่ทุกคนเพิกเฉยบิต "perl script";
SamB

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ: unix.stackexchange.com/a/522295/1131
maxschlepzig

คำตอบ:


27

เพิ่มหมายเหตุเมื่อวันที่ 8 กรกฎาคม 2014:ตามที่Riccardo Murriชี้ให้เห็นคำตอบของฉันด้านล่างแสดงให้เห็นว่าหน่วยประมวลผลรายงานว่าสนับสนุน hyperthreading หรือไม่ โดยทั่วไปแล้ว * nix O / S ถูกกำหนดค่าให้เปิดใช้งานไฮเปอร์เธรดหากสนับสนุน อย่างไรก็ตามในการตรวจสอบโปรแกรมนี้ดูคำตอบของ Nils !

---- คำตอบเดิมจาก 25 มีนาคม 2012:

คุณอยู่ในเส้นทางที่ถูกต้องแน่นอน :) ด้วย

dmidecode -t processor | grep HTT

บน Linux ผมมักเพียงแค่มองหา "ht" ในบรรทัด "ธง" /proc/cpuinfoของ ดูตัวอย่าง

grep '^flags\b' /proc/cpuinfo | tail -1

หรือถ้าคุณต้องการที่จะรวม "ht" ในรูปแบบ

grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1

( \bตรงกับขอบเขตของคำและช่วยหลีกเลี่ยงผลบวกปลอมในกรณีที่ "ht" เป็นส่วนหนึ่งของการตั้งค่าสถานะอื่น)


19
สิ่งนี้จะบอกคุณว่าโปรเซสเซอร์นั้นมีความสามารถใน HT หรือไม่ถ้าใช้ HT จริงๆ
Riccardo Murri

3
ฟิลด์ HTT ไม่ได้ระบุว่าตัวประมวลผลกำลังมีไฮเปอร์เธรดอยู่ในแกนประมวลผล ตรวจสอบค่าของ 'พี่น้อง' และ 'cpu cores' ใน / proc / cpuinfo
Silver Moon

@ Silver-Moon คุณช่วยอธิบายได้ไหม? dmidecode อ่าน SMBIOS และควรบอกความสามารถของโปรเซสเซอร์ มันไม่ได้บอกว่า O / S จะเห็นเธรดไฮเปอร์หรือไม่ แต่สิ่งนี้มีการแสดงความคิดเห็นแล้ว ดูคำตอบของนิลส์
xebeche

1
@ xebeche บนระบบของฉันเอาต์พุต dmidecode แสดงว่า "HTT (Multi-threading)" แต่โปรเซสเซอร์ของฉันคือ "core 2 quad Q8400" ซึ่งไม่มีไฮเปอร์เธรด ตรวจสอบข้อมูลจำเพาะของ Intel
Silver Moon

1
+1 ถึง Riccardo; ฉันปิดใช้งาน HT บนเซิร์ฟเวอร์ที่ใช้งาน HT ได้และเห็นว่าพิมพ์ "HTT" lscpuเป็นวิธีการตรวจสอบ
sudo

96

ฉันมักจะใช้สิ่งต่อไปนี้และดูที่ 'Thread (s) ต่อ core:'

hostname:~ # lscpu
Architecture:          x86_64
CPU(s):                24
Thread(s) per core:    2                <-- here
Core(s) per socket:    6
CPU socket(s):         2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 44
Stepping:              2
CPU MHz:               1596.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              12288K

หมายเหตุอย่างไรก็ตามเทคนิคนี้จะล้มเหลวหากตัวประมวลผลแบบลอจิคัลใด ๆ ถูกปิดด้วยวิ

echo 0 > /sys/devices/system/cpu/cpuX/online

4
นี่คือคำตอบที่ดีที่สุด มันไม่ต้องอ่านใบชาข้อมูลที่เป็นประโยชน์มากมายและไม่จำเป็นต้องมีการ grepping
MrMas

11
OMG คุณใช้คำสั่งเชลล์เพื่อรับคำตอบใช่ไหม! นั่นเป็นโรงเรียนเก่า -1 สำหรับเรื่องนั้น ไพ ธ อนสคริปต์ที่ดีมีอะไรบ้าง ??? ใช้เวลาแค่ช่วงบ่ายเท่านั้นในการเขียน เนื่องจากไม่ใช่ Python อีก -1 แต่ +3 เพื่อความกะทัดรัด
Mike S

@ Mike Sarcasmจำนวนมาก แต่ ... เอาต์พุตของlscpuไม่ถูกต้องเมื่อพูดเพียง 1 hyper-threaded core เท่านั้นที่ลงบน CPU 4 คอร์ (ซึ่งเป็นสถานการณ์ที่ถูกต้องสมบูรณ์) เพราะมันจะรายงาน"เธรด (s) ต่อคอร์: 1"แม้ว่า 3 คอร์จะถูกไฮเปอร์เธรด (รวม 7 เธรด)
เซดริกมาร์ติน

@Cedric Martin คุณสังเกตเห็น :-) ... Oooo! เยี่ยมมาก ... ฉันทำได้! เอาเครื่อง 8-core dual (Dell R620 / E5-2667 v2 CPU) ... มันรายงาน 32 ซีพียู ... ดำเนินการecho 0 > /sys/devices/system/cpu/cpu31/onlineในขณะนี้ lscpu Thread(s) per core: 1รายงาน แย่มากlscpu! เดาฉันจะไม่ใช้สิ่งนี้อีกแล้ว
Mike S

3
@ Mike S คุณยังสามารถใช้lscpuได้ แต่ไม่ใช่บรรทัดที่ฉันเดา ใช้พูด"lscpu -e -a"รายการแต่ละหัวข้อได้อย่างถูกต้องและบอกว่ามันใช้งานอยู่หรือไม่ เป็นเพียงการที่"เธรด (s) ต่อคอร์"ไม่สมเหตุสมผลเมื่อคุณสามารถเปิด / ปิดการใช้งานเธรดที่แตกต่างกันในแต่ละคอร์
Cedric Martin

18

หากจำนวนตัวประมวลผลเชิงตรรกะเป็นสองเท่าของจำนวนแกนคุณมี HT ใช้สคริปต์ต่อไปนี้เพื่อถอดรหัส/ proc / cpuinfo :

#!/bin/sh
CPUFILE=/proc/cpuinfo
test -f $CPUFILE || exit 1
NUMPHY=`grep "physical id" $CPUFILE | sort -u | wc -l`
NUMLOG=`grep "processor" $CPUFILE | wc -l`
if [ $NUMPHY -eq 1 ]
  then
    echo This system has one physical CPU,
  else
    echo This system has $NUMPHY physical CPUs,
fi
if [ $NUMLOG -gt 1 ]
  then
    echo and $NUMLOG logical CPUs.
    NUMCORE=`grep "core id" $CPUFILE | sort -u | wc -l`
    if [ $NUMCORE -gt 1 ]
      then
        echo For every physical CPU there are $NUMCORE cores.
    fi
  else
    echo and one logical CPU.
fi
echo -n The CPU is a `grep "model name" $CPUFILE | sort -u | cut -d : -f 2-`
echo " with`grep "cache size" $CPUFILE | sort -u | cut -d : -f 2-` cache"

ถ้า$NUMCORE > $NUMLOGเราสามารถพูดได้ว่ามีการเปิดใช้งานไฮเปอร์เธรดใช่ไหม? ความจริงมันจะเป็น2 * $NUMCORE = $NUMLOGเช่นนี้จริงหรือไม่ CPU บางตัวอาจมีแกนเพิ่มขึ้นอีก 4x หรือไม่?
Tombart

@ Tombart HT ปัจจุบันเป็นปัจจัยที่ 2 ฉันสามารถจินตนาการได้ว่ามันจะมีมากขึ้นในอนาคต แกนจะถูกบันทึกเป็นทางกายภาพ จำนวนแกนต่อซ็อกเก็ตสามารถได้มาจากพี่น้อง
นิลส์

หากคุณมีlscpuอยู่lscpuจะให้ข้อมูลเดียวกันพร้อมกับข้อมูลเมตาเพิ่มเติมจำนวนมากและเอาต์พุตจากการlscpuแยกวิเคราะห์ได้ง่ายขึ้น /proc/cpuinfoแต่การแก้ปัญหานี้ไม่ทำงานและมีเพียงการใช้งาน
เทรเวอร์บอยด์สมิ ธ

8

ตัวอย่างด้านบนแสดงว่า CPU นั้นสามารถใช้ HT ได้หรือไม่ แต่หากใช้งานอยู่ วิธีสุดท้ายใช้งานได้ แต่ไม่ใช่เซิร์ฟเวอร์ซ็อกเก็ตคู่และ VM ที่ทดสอบXenserverว่าไม่แสดง CPU จริงเนื่องจากไม่มีเลย

ฉันพบว่าวิธีนี้เป็นวิธีที่ง่ายที่สุดและใช้โค้ดน้อยกว่าซึ่งก็ใช้ได้กับทุกสภาพแวดล้อมการทดสอบของฉันด้วย bcแต่ต้องใช้

echo "testing ################################### "

nproc=$(grep -i "processor" /proc/cpuinfo | sort -u | wc -l)

phycore=$(cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l)

if [ -z "$(echo "$phycore *2" | bc | grep $nproc)" ]

then

echo "Does not look like you have HT Enabled"

if [ -z "$( dmidecode -t processor | grep HTT)" ]

 then

echo "HT is also not Possible on this server"

 else

echo "This server is HT Capable,  However it is Disabled"

fi

else

   echo "yay  HT Is working"

fi


echo "testing ################################### "

ฉันเชื่อว่านี่จะใช้งานได้กับทุกแพลตฟอร์มและจะบอกคุณว่า CPU นั้นมีความสามารถและเปิดใช้งานหรือไม่ อาจจะยุ่งนิดหน่อยฉันเป็นมือใหม่ในการเขียนสคริปต์ ฉันทดสอบด้วย centos XENSERVER vm, Ubuntu และ Openfiler (rpath)


/sys/devices/system/cpu/smt/controlสคริปต์ของคุณอาจจะง่ายมากโดยเพียงแค่การอ่าน ดูคำตอบของออสการ์
maxschlepzig

6

คุณสามารถตรวจสอบความสามารถ HT ของ CPU ด้วยคำสั่งนี้

# grep ht /proc/cpuinfo

คุณสามารถแสดงรายการ CPU แบบฟิสิคัลและแบบลอจิคัลที่เห็นโดย Kernel ด้วยคำสั่งต่อไปนี้:

# egrep -i "processor|physical id" /proc/cpuinfo

ให้เอาต์พุตนี้กับ CPU ที่เปิดใช้งาน single-core HT:

processor   : 0
physical id : 0
processor   : 1
physical id : 0

คุณสามารถอ่านผลลัพธ์ดังนี้:

processor   : 0 (CPU 0, first logical)
physical id : 0 (CPU 0 is on the first physical)
processor   : 1 (CPU 1, second logical)
physical id : 0 (CPU 1 is on the first physical)
=> It means I have HT enabled

1
สิ่งนี้จะบอกคุณว่าโปรเซสเซอร์นั้นมีความสามารถใน HT หรือไม่ถ้าใช้ HT จริงๆ โหนดที่โปรเซสเซอร์ใช้ HT ได้ แต่ที่ไม่เปิดใช้งาน HT จะยังคงโฆษณาhtใน CPU flag
Riccardo Murri

@RiccardoMurri เท่าที่ฉันทราบเมื่อปิดการใช้งาน HT ค่าสถานะ ht จะไม่ปรากฏใน / proc / cpuinfo
Coren

6
ฉันค่อนข้างแน่ใจว่ามันไม่ใช่ ฉันมีทั้งเซิร์ฟเวอร์ที่เปิดใช้งาน HT และเซิร์ฟเวอร์ที่ปิดใช้งาน HT และพวกเขาทั้งหมดแสดงค่าสถานะ ht
Riccardo Murri

2
หากคุณมีโปรเซสเซอร์ Xeon ที่มี 4 คอร์มันจะแสดงเป็นรหัสจริงหนึ่งตัวและสี่โปรเซสเซอร์ ดังนั้นคุณสามารถมีโปรเซสเซอร์หลายตัวต่อรหัสทางกายภาพโดยไม่ต้องไฮเปอร์เธรด
Andomar

2
ฉันมีซ็อกเก็ต 2 เครื่องและphysical idดูเหมือนว่าจะเป็นตัวแทนของซ็อกเก็ต / ชิป core idดูเหมือนจะชี้ไปที่เดียวกันทางกายภาพหลัก
Heartinpiece

6

ซับอันนี้ดูเหมือนจะใช้กลอุบายสำหรับฉัน (ต้องใช้สิทธิ์พิเศษ):

dmidecode -t processor | grep -E '(Core Count|Thread Count)'

ผลลัพธ์คือ:

Core Count: 2
Thread Count: 4

จำนวนเธรดนั้นเพิ่มขึ้นเป็นสองเท่าของการนับคอร์ดังนั้นฉันจึงเปิดใช้งานไฮเปอร์เธรด

หรือถ้าคุณต้องการสคริปต์ Perl ของคุณจริงๆตามที่ร้องขอ ...

perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'

1
ฉันปิดใช้งาน HT ในระบบที่ใช้ HT ของ Intel ได้ แต่จำนวนเธรดที่ส่งคืนด้วย dmidecode นั้นเป็นจำนวน Core สองเท่า ดูเหมือนว่าจะแสดงว่า CPU นั้นมีความสามารถใน HT หรือไม่ถ้าเปิดใช้งาน HT หรือไม่
Dmitri Chubarov

@ Dmitri แปลก ฉันเพิ่งรันสิ่งนี้บนเซิร์ฟเวอร์ที่รองรับ HT ได้ (มี Intel Xeon E5-2670 v3 สองเครื่อง) โดยที่ hyperthreading ถูกปิดใช้งานและการนับคอร์และเธรดเหมือนกัน ฉันไม่แน่ใจว่าอะไรจะทำให้เกิดพฤติกรรมที่แตกต่าง ฉันจะต้องดูต่อไป
billyw

ฉันเพิ่งลองใช้กับ Dell R610 พร้อมกับโปรเซสเซอร์ X5680 สองตัวปิดการทำไฮเปอร์เธรด คำตอบของ Stephaniea (lscpu) ดูเหมือนจะใช้ได้ ฉันได้ตรวจสอบ iDRAC สองครั้ง (ไฟดับของ Dell, ออกจากตัวประมวลผลแบนด์ [สำหรับผู้ที่ไม่ทราบ]) และมันบอกว่า Hyperthreading ปิดอยู่ ดังนั้นฉันไม่คิดว่าdmidecodeมีความน่าเชื่อถือ
Mike S

ฉันตรวจสอบ Dell 1950 (x5460 CPUs, ไม่สามารถทำการไฮเปอร์เธรดได้) และ lscpu นั้นถูกต้อง อีกทั้ง Dell R620 (E5-2690 [v1, ฉันเชื่อว่า]) และมันก็ถูกต้อง
Mike S

แต่ความคิดเห็นของ @Cedric Martin ในหนึ่งในคำตอบข้างต้นแสดงให้เห็นว่าlscpuจะไม่น่าเชื่อถือเสมอไป ฉันชอบคำตอบของ scottbb
Mike S

3
perl -ne'
  $i++ if /^\s*$/;
  push @{$x[$i]}, [/^(.+?) \s*:\s* (.+)/x] if /core|sibling|physical id/; }{
  $r= shift @x; 
  for $i (0..$#$r) {
    $$r[$i][1] .= " ".$$_[$i][1] for @x;
    printf "%-15s: %s\n", @{$$r[$i]};
  }
' /proc/cpuinfo

ผลลัพธ์นี้บ่งชี้ว่าเปิดใช้งาน HT เนื่องจากsiblingsหมายเลข (12) มากกว่าcpu cores(6)

physical id    : 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1
siblings       : 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
core id        : 0 1 2 8 9 10 0 1 2 8 9 10 0 1 2 8 9 10 0 1 2 8 9 10
cpu cores      : 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6

2

ถ้าคุณอ่าน/sys/devices/system/cpu/cpu0/topology/thread_siblings_listมันจะส่งคืนรายการที่คั่นด้วยเครื่องหมายจุลภาคของเธรดพี่น้อง (เช่น Hyperthread "cores") ของ CPU 0

ตัวอย่างเช่นใน Xeon 2-socket 6-core ของฉันด้วยการเปิดใช้งาน hyperthreading ฉันได้รับ:

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,12

แต่หลังจากปิดการทำไฮเปอร์เธรดใน BIOS ฉันจะได้รับ:

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0

สมมติว่า CPU 0 พร้อมใช้งานเสมอจากนั้นตรวจสอบthread_sibling_listไฟล์ procfs ของ CPU 0 สำหรับโหนดมากกว่าหนึ่งโหนดหรือมองหาเครื่องหมายจุลภาคหรือแม้กระทั่งอะไรก็ตามที่มากกว่า0จะระบุว่าเปิดใช้งานไฮเปอร์เธรดหรือไม่


ฉันตอบใน Perl แต่ 1) ฉันไม่รู้ Perl และ 2) ฉันคิดว่าวิธีแก้ปัญหาคือซับในที่ไม่สำคัญ


2

บน Linux สิ่งนี้ทำงานได้ดี:

$ lscpu -e  
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE  
0   0    0      0    0:0:0:0       yes  
1   0    0      1    1:1:1:0       yes  
2   0    0      2    2:2:2:0       yes  
3   0    0      3    3:3:3:0       yes  
4   0    0      4    4:4:4:0       yes  
5   0    0      5    5:5:5:0       yes  
6   0    0      6    6:6:6:0       yes  
7   0    0      7    7:7:7:0       yes  
8   1    1      8    8:8:8:1       yes  
9   1    1      9    9:9:9:1       yes  
10  1    1      10   10:10:10:1    yes  
11  1    1      11   11:11:11:1    yes  
12  1    1      12   12:12:12:1    yes  
13  1    1      13   13:13:13:1    yes  
14  1    1      14   14:14:14:1    yes  
15  1    1      15   15:15:15:1    yes  
16  0    0      0    0:0:0:0       yes  
17  0    0      1    1:1:1:0       yes   
18  0    0      2    2:2:2:0       yes  
19  0    0      3    3:3:3:0       yes  
20  0    0      4    4:4:4:0       yes  
21  0    0      5    5:5:5:0       yes  
22  0    0      6    6:6:6:0       yes  
23  0    0      7    7:7:7:0       yes  
24  1    1      8    8:8:8:1       yes  
25  1    1      9    9:9:9:1       yes  
26  1    1      10   10:10:10:1    yes  
27  1    1      11   11:11:11:1    yes  
28  1    1      12   12:12:12:1    yes  
29  1    1      13   13:13:13:1    yes  
30  1    1      14   14:14:14:1    yes  
31  1    1      15   15:15:15:1    yes  

ในตัวอย่างข้างต้นเรามีซ็อกเก็ต 2 NUMA (SOCKET = 1 หรือ 2) เรามี 16 คอร์ทางกายภาพ (CORE = 0 ถึง 15) แต่ละแกนมีไฮเปอร์เธรดพี่น้อง (ตัวอย่าง CORE = 0 ประกอบด้วย CPU 0,16

เราสามารถตรวจสอบไฮเปอร์เธรดดังนี้:

$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list  
0,16

ลำดับชั้นหน่วยความจำแคชคือ:

CPU 0 --> L1D_0|L1I_0 -> L2_0 -> L3_0  
          ^                      ^
CPU 16 ---|                      |     
                                 |         
CPU 1 --> L1D_1|L1I_1 -> L2_1 ---> 
          ^    
CPU 17 ---|   
...    

lscpu -p ให้เอาต์พุตรูปแบบ csv สำหรับการแยกวิเคราะห์โปรแกรมอย่างง่าย

$ lscpu -p  
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,4,0,0,,4,4,4,0
...

2

นี่เป็นวิธีการที่ใช้ python ซึ่งจะแนะนำวิธีปิดใช้งานหากจำเป็น

import re    

total_logical_cpus = 0
total_physical_cpus = 0
total_cores = 0

logical_cpus = {}
physical_cpus = {}
cores = {}

hyperthreading = False

for line in open('/proc/cpuinfo').readlines():
    if re.match('processor', line):
        cpu = int(line.split()[2])

        if cpu not in logical_cpus:
            logical_cpus[cpu] = []
            total_logical_cpus += 1

    if re.match('physical id', line):
        phys_id = int(line.split()[3])

        if phys_id not in physical_cpus:
            physical_cpus[phys_id] = []
            total_physical_cpus += 1

    if re.match('core id', line):
        core = int(line.split()[3])

        if core not in cores:
            cores[core] = []
            total_cores += 1

        cores[core].append(cpu)

if (total_cores * total_physical_cpus) * 2 == total_logical_cpus:
    hyperthreading = True

print("  This system has %d physical CPUs" % total_physical_cpus)
print("  This system has %d cores per physical CPU" % total_cores)
print("  This system has %d total cores" % (total_cores * total_physical_cpus))
print("  This system has %d logical CPUs" % total_logical_cpus)

if hyperthreading:
    print("  HT detected, if you want to disable it:")
    print("  Edit your grub config and add 'noht'")
    print("  -OR- disable hyperthreading in the BIOS")
    print("  -OR- try the following to offline those CPUs:")

    for c in cores:
        for p, val in enumerate(cores[c]):
            if p > 0:
                print("    echo 0 > /sys/devices/system/cpu/cpu%d/online" % (val))

คำแนะนำสำหรับการปิดใช้งานการทำไฮเปอร์เธรดนั้นดีที่สุดย่อย - วิธีโดยตรงในการปิดใช้งานไฮเปอร์เธรดคือecho off > /sys/devices/system/cpu/smt/control(นอกเหนือจากการปิดในไบออส) ดูคำตอบของออสการ์ในการตรวจสอบโดยตรง
maxschlepzig

1

คำเตือนมีจำนวนมากและคำตอบอยู่ที่นี่ ... ดูเหมือนว่าคำตอบจะไม่ชัดเจน lscpuมี gotcha's ซึ่งใช้กับ "count cores และตัวประมวลผลเชิงตรรกะใด ๆ จากนั้นเปรียบเทียบ" คำตอบ เนื่องจากคุณสามารถปิดตัวประมวลผลเชิงตรรกะด้วยคำสั่ง echo อย่างง่าย (... สิ่งนี้อาจสำคัญในสภาพแวดล้อมขององค์กรขนาดใหญ่ที่คุณต้องพึ่งพาโหมดเทอร์โบตัวอย่างเช่น)

นี่คือความพยายามของฉัน; ขอบคุณ @scottbb สำหรับแรงบันดาลใจ:

printf "HT is "; egrep -q [:punct:] /sys/devices/system/cpu/cpu0/topology/thread_siblings_list && echo on || echo off 

ในเครื่องที่ใช้ Xeon ของ Dell รายการพี่น้องจะมีเครื่องหมายจุลภาคเมื่อเปิดใช้ HT บนแล็ปท็อปของฉันมันมียัติภังค์ (โปรเซสเซอร์ i5-3210m) ดังนั้นฉันจึงขอใช้เครื่องหมายวรรคตอน

คิด? วิพากษ์วิจารณ์?

ผู้ร้องขอถามหา Perl ดังนั้นที่นี่คุณไป:

perl -ane 'chomp; print "Hyperthreading is "; if (/\D/) { print "ON\n" } else { print "OFF\n" }' < /sys/devices/system/cpu/cpu0/topology/thread_siblings_list

ฉันจะใช้grep -q [-.]เพราะนี่เป็นประเภทน้อย FWIW ฉันได้ตรวจสอบ Xeons / i5 / i7 หลายรุ่น (รวมถึงรุ่นโทรศัพท์มือถือ) และไม่มีเครื่องหมายยัติภังค์อยู่ในthread_siblings_listนั้น มันไม่เพียงพอที่จะเพียงแค่ตรวจสอบ CPU0 - grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_listดังนั้นบางอย่างเช่นนี้จะมีประสิทธิภาพมากขึ้น: อย่างไรก็ตามเพียงแค่มีgrep 1 /sys/devices/system/cpu/smt/active -qมากขึ้นไปยังจุด - cf คำตอบของ Oscar
maxschlepzig

1

วิธีที่ง่ายที่สุดในการตรวจสอบว่า SMT (ทั่วไปสำหรับ HT ซึ่งเป็นเพียงการสร้างแบรนด์ของ Intel) นั้นทำงานอยู่หรือไม่:

cat /sys/devices/system/cpu/smt/active

ให้ 0 สำหรับไม่ใช้งานหรือ 1 สำหรับการใช้งาน

คุณสามารถเปิดหรือปิดการใช้งานจริงได้ด้วย:

echo [on|off] > /sys/devices/system/cpu/smt/control

Catting /sys/devices/system/cpu/smt/controlเป็นยังเป็นไปได้on|off|forceoff|notsupported|notimplementedและอัตราผลตอบแทน
maxschlepzig

0

ดีกว่าคุณตรวจสอบ lscpu ที่คุณสามารถดู "เธรด (s) ต่อแกน: 1" หมายถึงเพียงหนึ่งเธรดต่อ 1 คอร์

    # lscpu
    Architecture:          x86_64
    CPU op-mode(s):        32-bit, 64-bit
    Byte Order:            Little Endian

CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Model name:            Intel(R) Xeon(R) CPU E5-2623 v3 @ 3.00GHz
Stepping:              2
CPU MHz:               1200.000
BogoMIPS:              5992.82
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              10240K
NUMA node0 CPU(s):     0,1,4,5
NUMA node1 CPU(s):     2,3,6,7

0

Stephaniealscpuได้กล่าวแล้ว ฉันต้องการเพิ่มอีกเล็กน้อย

ในโปรเซสเซอร์ AMD Epyc ของฉันทุกครั้งที่มีคอร์แบบลอจิคัลออฟไลน์lscpuแสดงบรรทัดเพิ่มเติมใหม่ที่เรียกว่าOff-line CPU(s) list:

# echo 0 > /sys/devices/system/cpu/cpu9/online
# echo 0 > /sys/devices/system/cpu/cpu16/online
# 
#lscpu
CPU(s):                64
On-line CPU(s) list:   0-8,10-15,17-63
Off-line CPU(s) list:  9,16
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.