ฉันจะตรวจสอบว่ามีการเปิดใช้งานไฮเปอร์เธรดในเครื่อง Linux โดยใช้สคริปต์ Perl เพื่อตรวจสอบได้อย่างไร
ฉันกำลังลองวิธีต่อไปนี้:
dmidecode -t processor | grep HTT
แจ้งให้เราทราบหากฉันถูก
ฉันจะตรวจสอบว่ามีการเปิดใช้งานไฮเปอร์เธรดในเครื่อง Linux โดยใช้สคริปต์ Perl เพื่อตรวจสอบได้อย่างไร
ฉันกำลังลองวิธีต่อไปนี้:
dmidecode -t processor | grep HTT
แจ้งให้เราทราบหากฉันถูก
คำตอบ:
เพิ่มหมายเหตุเมื่อวันที่ 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" เป็นส่วนหนึ่งของการตั้งค่าสถานะอื่น)
lscpu
เป็นวิธีการตรวจสอบ
ฉันมักจะใช้สิ่งต่อไปนี้และดูที่ '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
echo 0 > /sys/devices/system/cpu/cpu31/online
ในขณะนี้ lscpu Thread(s) per core: 1
รายงาน แย่มากlscpu
! เดาฉันจะไม่ใช้สิ่งนี้อีกแล้ว
หากจำนวนตัวประมวลผลเชิงตรรกะเป็นสองเท่าของจำนวนแกนคุณมี 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 หรือไม่?
lscpu
อยู่lscpu
จะให้ข้อมูลเดียวกันพร้อมกับข้อมูลเมตาเพิ่มเติมจำนวนมากและเอาต์พุตจากการlscpu
แยกวิเคราะห์ได้ง่ายขึ้น /proc/cpuinfo
แต่การแก้ปัญหานี้ไม่ทำงานและมีเพียงการใช้งาน
ตัวอย่างด้านบนแสดงว่า 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
สคริปต์ของคุณอาจจะง่ายมากโดยเพียงแค่การอ่าน ดูคำตอบของออสการ์
คุณสามารถตรวจสอบความสามารถ 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
ht
ใน CPU flag
physical id
ดูเหมือนว่าจะเป็นตัวแทนของซ็อกเก็ต / ชิป core id
ดูเหมือนจะชี้ไปที่เดียวกันทางกายภาพหลัก
ซับอันนี้ดูเหมือนจะใช้กลอุบายสำหรับฉัน (ต้องใช้สิทธิ์พิเศษ):
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`);'
dmidecode
มีความน่าเชื่อถือ
lscpu
จะไม่น่าเชื่อถือเสมอไป ฉันชอบคำตอบของ scottbb
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
ถ้าคุณอ่าน/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) ฉันคิดว่าวิธีแก้ปัญหาคือซับในที่ไม่สำคัญ
บน 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
...
นี่เป็นวิธีการที่ใช้ 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
(นอกเหนือจากการปิดในไบออส) ดูคำตอบของออสการ์ในการตรวจสอบโดยตรง
คำเตือนมีจำนวนมากและคำตอบอยู่ที่นี่ ... ดูเหมือนว่าคำตอบจะไม่ชัดเจน 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
วิธีที่ง่ายที่สุดในการตรวจสอบว่า SMT (ทั่วไปสำหรับ HT ซึ่งเป็นเพียงการสร้างแบรนด์ของ Intel) นั้นทำงานอยู่หรือไม่:
cat /sys/devices/system/cpu/smt/active
ให้ 0 สำหรับไม่ใช้งานหรือ 1 สำหรับการใช้งาน
คุณสามารถเปิดหรือปิดการใช้งานจริงได้ด้วย:
echo [on|off] > /sys/devices/system/cpu/smt/control
/sys/devices/system/cpu/smt/control
เป็นยังเป็นไปได้on|off|forceoff|notsupported|notimplemented
และอัตราผลตอบแทน
ดีกว่าคุณตรวจสอบ 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
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
dmidecode
คุณต้องรูต