Sprawdzanie, czy HyperThreading jest włączony, czy nie?

51

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.

dubler
źródło
2
bo dmidecodemusisz być rootem.
Nils,
5
Podoba mi się, jak wszyscy ignorowali fragment „skryptu perla” ;-)
SamB
To powinna być zaakceptowana odpowiedź: unix.stackexchange.com/a/522295/1131
maxschlepzig

Odpowiedzi:

27

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

( \bdopasowuje granice słów i pomaga unikać fałszywych alarmów w przypadkach, gdy „ht” jest częścią innej flagi).

xebeche
źródło
19
Dzięki temu dowiesz się tylko, czy procesor jest zdolny do HT, a nie, jeśli HT jest faktycznie używany.
Riccardo Murri
3
pole HTT nie wskazuje, że procesor faktycznie ma hiperwątkowanie w swoich rdzeniach. sprawdź wartość „rodzeństwa” i „rdzenia procesora” w / proc / cpuinfo
Silver Moon
@ Silver-Moon Czy potrafisz wyjaśnić? dmidecode czyta SMBIOS i powinien poinformować o możliwościach procesora. Nie mówi, czy hiperwątkowanie jest widoczne lub używane przez O / S. Ale zostało to już skomentowane. Zobacz także odpowiedź Nilsa
xebeche
1
@ xebeche na moim systemie wyjście dmidecode pokazuje „HTT (wielowątkowość)”, ale mój procesor to „core 2 quad Q8400”, który nie ma hiperwątkowości. sprawdź specyfikacje Intel.
Silver Moon
1
+1 do Riccardo; Mam wyłączoną HT na serwerze obsługującym HT i widzę, że drukuje „HTT”. lscpujest sposobem na sprawdzenie.
sudo
96

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
Stephaniea
źródło
4
To najlepsza jak dotąd odpowiedź. Nie wymaga czytania liści herbaty, wielu pomocnych informacji i nie wymaga grepowania.
MrMas
11
OMG, użyłeś polecenia powłoki, aby uzyskać odpowiedź ?! To takie oldschoolowe -1 do tego. Co powiesz na ładny skrypt w języku Python? Pisanie zajęłoby ci tylko popołudnie. Ponieważ to nie jest Python, kolejne -1. Ale +3 za zwięzłość.
Mike S
@Mike S dużo sarkazmu, ale ... Wyjście lscpu nie jest poprawne, gdy powiedzmy, że tylko 1 hiperwątkowy rdzeń jest wyłączony na 4 rdzeniach procesora (co jest w pełni poprawnym scenariuszem). Ponieważ wtedy zgłosi „Wątki na rdzeń: 1”, chociaż 3 rdzenie są w rzeczywistości hiperwątkowane (łącznie 7 wątków).
Cedric Martin
@Cedric Martin zauważyłeś. :-) ... Oooo! Dobry połów ... Zrobiłem to! Wziął podwójną 8-rdzeniową maszynę (procesor Dell R620 / E5-2667 v2) ... zgłasza 32 procesory ... Wykonano echo 0 > /sys/devices/system/cpu/cpu31/online, teraz raporty lscpu Thread(s) per core: 1. Źle lscpu! Chyba już tego nie użyję.
Mike S
3
@ Mike S. Nadal możesz używać lscpu , ale chyba nie ta linia. Używając, powiedzmy, „lscpu -e -a” poprawnie wypisuje każdy wątek i mówi, czy jest aktywny, czy nie. Po prostu „Wątki na rdzeń” nie mają większego sensu, gdy można włączać / wyłączać wątki inaczej na każdym rdzeniu.
Cedric Martin
18

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"
Nils
źródło
Jeśli $NUMCORE > $NUMLOGmożemy powiedzieć, że hyperthreading jest włączony, prawda? To 2 * $NUMCORE = $NUMLOGprawda, czy to zawsze prawda, czy niektóre procesory mogą mieć 4x więcej rdzeni?
Tombart
@Tombart Obecnie HT jest czynnikiem 2. Mogę sobie wyobrazić, że w przyszłości może być więcej. Rdzeń jest opisany jako fizyczny. Liczbę rdzeni na gniazdo można ustalić na podstawie rodzeństwa.
Nils
Jeśli masz lscpudostępne, lscpudostarczy te same informacje wraz z dużą ilością dodatkowych metadanych, a dane wyjściowe lscpumożna łatwiej przeanalizować. ale to rozwiązanie działa i wykorzystuje tylko /proc/cpuinfo.
Trevor Boyd Smith
8

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 Xenservertam, 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)

użytkownik63814
źródło
Twój skrypt można znacznie uprościć, czytając /sys/devices/system/cpu/smt/control. Zobacz także odpowiedź Oscara
maxschlepzig
6

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
Coren
źródło
1
Dzięki temu dowiesz się tylko, czy procesor jest zdolny do HT, a nie, jeśli HT jest faktycznie używany. Węzły, których procesor obsługuje HT, ale HT nie jest włączony, nadal będą się reklamować htw flagach CPU.
Riccardo Murri
@RiccardoMurri O ile mi wiadomo, gdy HT jest wyłączony, flaga ht nie pojawia się w / proc / cpuinfo
Coren
6
Jestem prawie pewien, że tak nie jest. Mam zarówno serwery z obsługą HT, jak i HT, a wszystkie z nich pokazują flagę ht.
Riccardo Murri,
2
Jeśli masz procesor Xeon z 4 rdzeniami, będzie on wyświetlany jako jeden identyfikator fizyczny i cztery procesory. Możesz mieć wiele procesorów na identyfikator fizyczny bez hiperwertowania.
Andomar,
2
Mam maszynę z 2 gniazdami i physical idwygląda na to, że reprezentuje gniazdo / układ. core idWydaje się wskazywać na tym samym fizycznym rdzenia
Heartinpiece
6

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`);'
billyw
źródło
1
Wyłączyłem HT w systemie opartym na Intel, ale liczba wątków zwrócona z kodem dmidecode jest dwa razy większa niż liczba rdzeni. Wygląda na to, że pokazuje, czy procesor obsługuje HT, a nie czy HT jest włączony czy nie.
Dmitrij Chubarow,
@Dmitri Weird. Właśnie uruchomiłem to na serwerze obsługującym HT (ma dwa procesory Intel Xeon E5-2670 v3) z wyłączonym hyperthreading, a liczba rdzeni i wątków była taka sama. Nie jestem pewien, co spowodowałoby różnicę w zachowaniu. Będę musiał przyjrzeć się temu głębiej.
billyw
Właśnie uruchomiłem to na Dell R610 z dwoma procesorami X5680, wyłączanie Hyperthreading, a liczba wątków jest dwa razy większa niż liczba rdzeni. Odpowiedź Stephaniei (lscpu) wydaje się działać. Dokładnie sprawdziłem iDRAC (zgaszony Dell, procesor poza pasmem (dla tych, którzy nie są tego świadomi)) i mówi, że Hyperthreading jest wyłączony. Więc nie sądzę, aby dmidecodebył wiarygodny.
Mike S
Sprawdziłem Dell 1950 (procesory x5460, brak możliwości hiperwątkowania) i lscpu było prawidłowe. Także Dell R620 (E5-2690 [v1, jak sądzę]) i było poprawne.
Mike S
Ale komentarz @Cedrica Martina w jednej z powyższych odpowiedzi pokazuje, że lscpunie zawsze będzie on wiarygodny. Podoba mi się odpowiedź Scottbba.
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

Ten wynik wskazuje, że HT jest włączony, ponieważ siblingsliczba (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
mpapec
źródło
2

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_listpliku 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.

scottbb
źródło
2

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
...
edW
źródło
2

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))
Neil McGill
źródło
Sugestia wyłączenia hipertekstu jest suboptymalna - bezpośrednim sposobem wyłączenia hipertekstu jest echo off > /sys/devices/system/cpu/smt/control(oprócz wyłączenia go w bios). Zobacz także odpowiedź Oscara na bezpośrednie sprawdzenie.
maxschlepzig
1

Wiele zastrzeżeń i co jeśli jest w odpowiedziach tutaj ... wydaje się, że odpowiedź nie jest taka oczywista. lscpuma 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
Mike S.
źródło
Chciałbym po prostu użyć, 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 -qjest jeszcze bardziej do rzeczy - por. Odpowiedź Oscara
maxschlepzig
1

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
Oscar Tiderman
źródło
Kotwiczenie /sys/devices/system/cpu/smt/controljest również możliwe i daje plon on|off|forceoff|notsupported|notimplemented.
maxschlepzig
0

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
Gineesh
źródło
0

Stephaniea już wspomniała lscpu. Chciałem dodać do tego trochę więcej.

Na moim procesorze AMD Epyc, ilekroć istnieje logiczny rdzeń offline, lscpuwyś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
talekeDskobeDa
źródło