Jak mogę sprawdzić, czy hyperthreading jest włączony na komputerze z systemem Linux, za pomocą skryptu perl, aby go sprawdzić?
Próbuję w następujący sposób:
dmidecode -t processor | grep HTT
Daj mi znać, jeśli jestem na dobrej drodze.
Jak mogę sprawdzić, czy hyperthreading jest włączony na komputerze z systemem Linux, za pomocą skryptu perl, aby go sprawdzić?
Próbuję w następujący sposób:
dmidecode -t processor | grep HTT
Daj mi znać, jeśli jestem na dobrej drodze.
Odpowiedzi:
Notatki dodane 8 lipca 2014 r .: Jak zauważył Riccardo Murri , moja odpowiedź poniżej pokazuje tylko, czy procesor zgłasza wsparcie hiperwątkowania. Ogólnie rzecz biorąc, * nix O / S są skonfigurowane tak, aby umożliwić hiperwątkowanie, jeśli jest obsługiwane. Jednak, aby faktycznie to sprawdzić programowo, zobacz na przykład odpowiedź Nilsa !
---- Oryginalna odpowiedź z 25 marca 2012 r .:
Rzeczywiście jesteś na dobrej drodze :) z
dmidecode -t processor | grep HTT
W systemie Linux zazwyczaj szukam po prostu „ht” w wierszu „flags” /proc/cpuinfo
. Zobacz na przykład
grep '^flags\b' /proc/cpuinfo | tail -1
lub jeśli chcesz dołączyć „ht” do wzorca
grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1
( \b
dopasowuje granice słów i pomaga unikać fałszywych alarmów w przypadkach, gdy „ht” jest częścią innej flagi).
lscpu
jest sposobem na sprawdzenie.
Zawsze po prostu użyłem następujących i spojrzałem na „Wątki na rdzeń:”.
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
Należy jednak pamiętać, że ta technika zawiedzie, jeśli dowolny procesor logiczny zostanie wyłączony za pomocą prostego
echo 0 > /sys/devices/system/cpu/cpuX/online
echo 0 > /sys/devices/system/cpu/cpu31/online
, teraz raporty lscpu Thread(s) per core: 1
. Źle lscpu
! Chyba już tego nie użyję.
Jeśli liczba procesorów logicznych jest dwa razy większa niż liczba rdzeni, które masz HT. Użyj następującego skryptu, aby zdekodować / 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
możemy powiedzieć, że hyperthreading jest włączony, prawda? To 2 * $NUMCORE = $NUMLOG
prawda, czy to zawsze prawda, czy niektóre procesory mogą mieć 4x więcej rdzeni?
lscpu
dostępne, lscpu
dostarczy te same informacje wraz z dużą ilością dodatkowych metadanych, a dane wyjściowe lscpu
można łatwiej przeanalizować. ale to rozwiązanie działa i wykorzystuje tylko /proc/cpuinfo
.
Powyższe przykłady pokazują, czy procesor jest zdolny do HT, ale nie, jeśli jest używany. Ostatnia metoda działa, ale nie testuje serwerów z dwoma gniazdami i maszyn wirtualnych testowanych Xenserver
tam, gdzie nie wyświetla Fizyczny procesor, ponieważ nie ma żadnej.
Przekonałem się, że jest to najłatwiejszy i mniej kodowy sposób, który działał również we wszystkich moich środowiskach testowych. ale wymaga 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 ################################### "
Wierzę, że to zadziała na wszystkich platformach i powie ci, czy jego procesor jest zdolny i czy jest włączony. Może być trochę niechlujny, ale jestem początkującym w skryptowaniu. Testowałem z centos XENSERVER vm, Ubuntu i Openfiler (rpath)
/sys/devices/system/cpu/smt/control
. Zobacz także odpowiedź Oscara
Za pomocą tego polecenia możesz sprawdzić zdolność HT procesora
# grep ht /proc/cpuinfo
Możesz wyświetlić fizyczny i logujący procesor widziany przez jądro za pomocą następującego polecenia:
# egrep -i "processor|physical id" /proc/cpuinfo
Daje to dane wyjściowe na jednordzeniowym procesorze z obsługą HT:
processor : 0
physical id : 0
processor : 1
physical id : 0
Możesz przeczytać wynik w ten sposób:
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
w flagach CPU.
physical id
wygląda na to, że reprezentuje gniazdo / układ. core id
Wydaje się wskazywać na tym samym fizycznym rdzenia
Ta jedna linijka wydaje się robić dla mnie lewę (wymaga uprawnień roota):
dmidecode -t processor | grep -E '(Core Count|Thread Count)'
Dane wyjściowe to:
Core Count: 2
Thread Count: 4
Liczba wątków jest dwa razy większa niż liczba rdzeni, dlatego mam włączony hyperthreading.
Lub jeśli naprawdę chcesz skrypt Perla, zgodnie z żądaniem ...
perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'
dmidecode
był wiarygodny.
lscpu
nie zawsze będzie on wiarygodny. Podoba mi się odpowiedź Scottbba.
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
Ten wynik wskazuje, że HT jest włączony, ponieważ siblings
liczba (12) jest większa niż 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
Jeśli czytasz /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
, zwróci rozdzieloną przecinkami listę rodzeństwa wątków (tj. „Rdzeni” Hyperthreada) CPU 0.
Na przykład na moim 2-gniazdowym 6-rdzeniowym Xeonie, z włączonym hyperthreadingiem otrzymuję:
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,12
Ale po wyłączeniu hiperwątkowania w systemie BIOS otrzymuję:
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0
Zakładając, że CPU 0 będzie zawsze dostępny, sprawdzenie thread_sibling_list
pliku procfs CPU 0 dla więcej niż jednego węzła lub poszukiwanie przecinka, a nawet czegoś więcej 0
, wskaże, czy hiperwątkowanie jest włączone.
Odpowiedziałbym w Perlu, ale 1) nie znam Perla i 2) zakładam, że rozwiązanie jest dość trywialne.
W systemie Linux działa to dobrze:
$ 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
W powyższym przykładzie mamy 2 gniazda NUMA (SOCKET = 1 lub 2). Mamy 16 rdzeni fizycznych (CORE = 0 do 15). Każdy CORE ma hyperthread rodzeństwa (Na przykład CORE = 0 zawiera CPU 0,16.
Możemy zweryfikować hiperwątek w następujący sposób:
$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,16
Hierarchia pamięci podręcznej jest następująca:
CPU 0 --> L1D_0|L1I_0 -> L2_0 -> L3_0
^ ^
CPU 16 ---| |
|
CPU 1 --> L1D_1|L1I_1 -> L2_1 --->
^
CPU 17 ---|
...
lscpu -p daje wyjście w formacie csv do łatwego parsowania programu.
$ 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
...
Oto podejście oparte na pythonie - sugeruje również sposoby wyłączenia go w razie potrzeby.
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
(oprócz wyłączenia go w bios). Zobacz także odpowiedź Oscara na bezpośrednie sprawdzenie.
Wiele zastrzeżeń i co jeśli jest w odpowiedziach tutaj ... wydaje się, że odpowiedź nie jest taka oczywista. lscpu
ma swoje gotcha, które odnoszą się do wszystkich „rdzeni zliczających i procesorów logicznych, a następnie porównują” odpowiedź. Ponieważ możesz wyłączyć procesory logiczne za pomocą prostej komendy echa (... może to mieć krytyczne znaczenie w środowisku dużego przedsiębiorstwa, na przykład w zależności od trybu turbo).
Oto moja próba; dzięki @scottbb za inspirację:
printf "HT is "; egrep -q [:punct:] /sys/devices/system/cpu/cpu0/topology/thread_siblings_list && echo on || echo off
Na moich komputerach z procesorem Dell Xeon lista rodzeństwa zawiera przecinek, gdy HT jest włączony. Na moim laptopie zawiera łącznik (procesor i5-3210m). Więc szukam interpunkcji.
Myśli? Krytyka?
Pytający poprosił o perla, więc proszę:
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 [-.]
ponieważ jest to mniej do pisania. FWIW, sprawdziłem kilka Xeonów / i5 / i7 (w tym wariantów mobilnych) i żaden z nich nie ma myślnika w thread_siblings_list
. Nie wystarczy po prostu sprawdzić CPU0 - zatem coś takiego byłoby bardziej wytrzymałe: grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
. Jednak tylko a grep 1 /sys/devices/system/cpu/smt/active -q
jest jeszcze bardziej do rzeczy - por. Odpowiedź Oscara
Najłatwiejszym sposobem sprawdzenia, czy SMT (ogólny dla HT, który jest po prostu brandingiem Intela) jest aktywny:
cat /sys/devices/system/cpu/smt/active
daje 0 dla nieaktywnych lub 1 dla aktywnych
Możesz go włączyć lub wyłączyć w czasie wykonywania za pomocą:
echo [on|off] > /sys/devices/system/cpu/smt/control
/sys/devices/system/cpu/smt/control
jest również możliwe i daje plon on|off|forceoff|notsupported|notimplemented
.
Lepiej sprawdź lscpu, w którym widać „Wątki na rdzeń: 1”, oznacza tylko jeden wątek na 1 rdzeń.
# 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
Stephaniea już wspomniała lscpu
. Chciałem dodać do tego trochę więcej.
Na moim procesorze AMD Epyc, ilekroć istnieje logiczny rdzeń offline, lscpu
wyświetla nową linię o nazwieOff-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
musisz być rootem.