Vérifier si HyperThreading est activé ou non?

51

Comment puis-je vérifier si l'hyperthreading est activé sur une machine Linux, en utilisant un script Perl pour le vérifier?

J'essaie la manière suivante:

dmidecode -t processor | grep HTT

Faites-moi savoir si je suis sur la bonne voie.

autobus à impériale
la source
2
car dmidecodevous devez être root.
Nils
5
J'aime la façon dont tout le monde a ignoré le bit "script perl" ;-)
SamB
Cela devrait être la réponse acceptée: unix.stackexchange.com/a/522295/1131
maxschlepzig

Réponses:

27

Notes ajoutées le 8 juillet 2014: Comme l'a souligné Riccardo Murri , ma réponse ci-dessous indique uniquement si le processeur indique qu'il prend en charge l'hyperthreading. Généralement, les systèmes d'exploitation * nix sont configurés pour activer l'hyperthreading si cette fonction est prise en charge. Cependant, pour vérifier cela par programme, voyez par exemple la réponse de Nils !

---- Réponse originale du 25 mars 2012:

Vous êtes vraiment sur la bonne voie :) avec

dmidecode -t processor | grep HTT

Sous Linux, en général, je cherche simplement "ht" sur la ligne "flags" de /proc/cpuinfo. Voir par exemple

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

ou si vous voulez inclure le "ht" dans le motif

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

( \bCorrespond aux limites des mots et permet d'éviter les faux positifs dans les cas où "ht" fait partie d'un autre drapeau.)

xebeche
la source
19
Cela ne vous indiquera que si le processeur est compatible HT, pas si HT est réellement utilisé.
Riccardo Murri
3
le champ HTT n'indique pas que le processeur a réellement un hyperthreading dans ses cœurs. Vérifiez la valeur de 'frères et sœurs' et 'cpu cores' dans / proc / cpuinfo
Silver Moon
@ Silver-Moon Pouvez-vous expliquer? dmidecode lit le SMBIOS et devrait indiquer les capacités du processeur. Il ne dit pas si l'hyper-threading est vu ou utilisé par le système d'exploitation. Mais cela a déjà été commenté. Voir aussi Nils answer
xebeche le
1
@xebeche sur la sortie de mon système dmidecode affiche "HTT (multi-threading)" mais mon processeur est "core 2 quad Q8400" qui ne possède pas d'hyperthreading. vérifier les spécifications intel.
Silver Moon
1
+1 à Riccardo; J'ai désactivé HT sur un serveur compatible HT et je le vois imprimer "HTT". lscpuest le moyen de vérifier.
Sudo
96

J'ai toujours juste utilisé ce qui suit et j’ai examiné «Fil (s) par cœur:».

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

Notez cependant que cette technique échouera si un processeur logique a été désactivé avec un simple contrôle.

echo 0 > /sys/devices/system/cpu/cpuX/online
stephaniea
la source
4
C'est la meilleure réponse à ce jour. Il ne nécessite aucune lecture des feuilles de thé, de nombreuses informations utiles et aucun grepping requis.
MrMas
11
OMG, vous avez utilisé une commande shell pour obtenir votre réponse?! C'est tellement old-school--1 pour ça. Qu'en est-il un beau script Python ??? Cela ne vous prendrait qu'un après-midi pour écrire. Comme ce n'est pas Python, encore -1. Mais +3 pour la brièveté.
Mike S
@ Mike S beaucoup de sarcasmes mais ... La sortie de lscpu n'est pas correcte si, par exemple, un seul cœur hyper-threadé est en panne sur un processeur à 4 cœurs (ce qui est un scénario totalement valide). Dans ce cas, il indiquera "Filetage (s) par cœur: 1" bien que 3 cœurs soient réellement hyperthreaded (7 threads au total).
Cedric Martin
@ Cedric Martin vous avez remarqué. :-) ... Oooo! Bonne prise ... je l'ai fait! Pris une machine double 8 cœurs (Dell R620 / E5-2667 v2) ... il signale 32 CPU ... Effectué echo 0 > /sys/devices/system/cpu/cpu31/online, maintenant rapports lscpu Thread(s) per core: 1. Mauvais lscpu! Je suppose que je ne l'utiliserai plus.
Mike S
3
@ Mike S Vous pouvez toujours utiliser lscpu , mais je suppose que ce n'est pas le cas. En utilisant, par exemple, "lscpu -e -a" , listez correctement chaque thread et indique s'il est actif ou non. C'est juste que "Fil (s) par noyau" n'a pas beaucoup de sens quand vous pouvez activer / désactiver les threads différemment sur chaque noyau.
Cedric Martin
18

Si le nombre de processeurs logiques est le double du nombre de cœurs, vous avez HT. Utilisez le script suivant pour décoder / 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
la source
Si $NUMCORE > $NUMLOGnous pouvons dire que l'hyperthreading est activé, non? En fait 2 * $NUMCORE = $NUMLOG, est-ce toujours vrai ou certains processeurs peuvent avoir 4x plus de cœurs?
Tombart
@Tombart Actuellement, HT est le facteur 2. Je peux imaginer que ce sera peut-être plus à l'avenir. Un noyau est noté comme physique. Le nombre de cœurs par socket peut être dérivé de frères et sœurs.
Nils
Si vous en avez lscpu, vous lscpufournirez les mêmes informations ainsi que de nombreuses méta-données supplémentaires et la sortie de celle-ci lscpusera plus facilement analysable. mais cette solution fonctionne et utilise uniquement /proc/cpuinfo.
Trevor Boyd Smith le
8

Les exemples ci-dessus montrent si le processeur est capable de HT, mais pas s'il est utilisé. La dernière méthode fonctionne, mais pas les serveurs à double socket et les ordinateurs virtuels testés sur Xenserverlesquels il n’affiche pas de CPU physique, car il n’y en a pas.

J'ai trouvé que c'était le moyen le plus simple et le moins codé, qui fonctionnait également sur tous mes environnements de test. mais nécessite 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 ################################### "

Je pense que cela fonctionnera sur toutes les plateformes et vous dira si son processeur est capable et s'il est activé. Peut-être un peu en désordre, je suis cependant un débutant en script. J'ai testé avec centos XENSERVER vm, Ubuntu et Openfiler (rpath)

utilisateur63814
la source
Votre script pourrait être beaucoup simplifié par une simple lecture /sys/devices/system/cpu/smt/control. Voir aussi la réponse d'Oscar
maxschlepzig
6

Vous pouvez vérifier la capacité HT du processeur avec cette commande

# grep ht /proc/cpuinfo

Vous pouvez lister les processeurs physique et logiciel vus par le noyau avec la commande suivante:

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

Il donne cette sortie sur un processeur monocœur HT activé:

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

Vous pouvez lire le résultat comme ceci:

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
la source
1
Cela ne vous indiquera que si le processeur est compatible HT, pas si HT est réellement utilisé. Les nœuds dont le processeur est compatible HT mais pour lesquels HT n'est pas activé continueront à être annoncés htdans les drapeaux de la CPU.
Riccardo Murri
@RiccardoMurri Autant que je sache, lorsque HT est désactivé, son drapeau n'apparaît pas dans / proc / cpuinfo
Coren
6
Je suis à peu près sûr que non. J'ai les deux serveurs HT-enabled et HT-disabled, et tous affichent l'indicateur ht.
Riccardo Murri
2
Si vous avez un processeur Xeon à 4 cœurs, il apparaîtra comme un identifiant physique et quatre processeurs. Ainsi, vous pouvez avoir plusieurs processeurs par ID physique sans hyperhtreading.
Andomar
2
J'ai une machine à 2 prises, et cela physical idsemble représenter la prise / puce. Le core idsemble indiquer le même noyau physique
Heartinpiece
6

Ce liner semble me convenir (nécessite des privilèges root):

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

La sortie est:

Core Count: 2
Thread Count: 4

Le nombre de threads est le double du nombre de noyaux. Par conséquent, l'hyperthreading est activé.

Ou si vous voulez vraiment votre script Perl, comme demandé ...

perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'
Billyw
la source
1
HT est désactivé sur un système Intel à haute capacité, mais le nombre de threads renvoyé avec dmidecode est le double du nombre de cœurs. On dirait que cela montre si le processeur est compatible HT, pas si HT est activé ou non.
Dmitri Chubarov
@ Dimitri Weird. Je viens d'exécuter ceci sur un serveur compatible HT (avec deux Intel Xeon E5-2670 v3) avec l'hyperthreading désactivé, et le nombre de cœurs et de threads était identique. Je ne suis pas sûr de ce qui causerait la différence de comportement. Je vais devoir approfondir.
Billyw
Je viens d'exécuter cela sur un Dell R610 avec deux processeurs X5680, Hyperthreading désactivé, et le nombre de threads est le double du nombre de cœurs. La réponse de stephaniea (lscpu) semble fonctionner. J'ai vérifié deux fois l'iDRAC (processeur Dell éteint, processeur hors bande [pour ceux qui ne sont pas au courant]) et il dit que l'hyperthreading est désactivé. Donc, je ne pense pas que ce dmidecodesoit fiable.
Mike S
J'ai vérifié un Dell 1950 (processeurs x5460, pas d'hyperthreading possible) et lscpu était correct. Aussi un Dell R620 (E5-2690 [v1, je crois]) et c'était correct.
Mike S
Mais le commentaire de @Cedric Martin dans l’une des réponses ci-dessus montre que lscpuce ne sera pas toujours fiable. J'aime la réponse de Scott.
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

Ce résultat indique que HT est activé car le siblingsnombre (12) est supérieur à 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
la source
2

Si vous lisez /sys/devices/system/cpu/cpu0/topology/thread_siblings_list, il retournera une liste séparée par des virgules des frères du fil (c.-à-d. Hyperthread "cœurs") de la CPU 0.

Par exemple, sur mon Xeon 6 cœurs à 2 sockets, avec l'hyperthreading activé, je reçois:

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

Mais après avoir désactivé l'hyperthreading dans le BIOS, je reçois:

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

En supposant que la CPU 0 soit toujours disponible, puis, le fait de rechercher le thread_sibling_listfichier procfs de la CPU 0 pour plus d'un noeud ou de rechercher une virgule, voire rien de plus 0, indique si l'hyperthreading est activé.


Je répondrais en Perl, mais 1) je ne connais pas Perl et 2) je suppose que la solution est assez simple.

scottbb
la source
2

Sous Linux, cela fonctionne bien:

$ 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  

Dans l'exemple ci-dessus, nous avons 2 prises NUMA (SOCKET = 1 ou 2). Nous avons 16 cœurs physiques (CORE = 0 à 15). Chaque CORE a un hyperthread frère (par exemple, CORE = 0 contient 0,16 CPU.

Nous pouvons vérifier le hyperthread comme suit:

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

La hiérarchie de la mémoire cache est la suivante:

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

lscpu -p donne une sortie au format csv pour une analyse facile du programme.

$ 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
la source
2

Voici une approche basée sur Python - elle suggère également des moyens de la désactiver si nécessaire.

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
la source
La suggestion pour désactiver l'hyperthreading est sous-optimale - le moyen direct de désactiver l'hyperthreading est echo off > /sys/devices/system/cpu/smt/control(en plus de le désactiver dans le bios). Voir aussi la réponse d' Oscar pour un contrôle direct.
maxschlepzig
1

Beaucoup de mises en garde et des hypothèses dans les réponses ici ... il semble que la réponse ne soit pas si évidente. lscpua son getcha, qui s'applique à tous les "compteurs de cœurs et de processeurs logiques, puis comparent". Parce que vous pouvez arrêter les processeurs logiques avec une simple commande echo (... cela peut être essentiel dans un environnement de grande entreprise où vous dépendez du mode turbo, par exemple).

Voici mon essai merci à @scottbb pour l'inspiration:

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

Sur mes ordinateurs Dell Xeon, la liste des frères et sœurs inclut une virgule lorsque HT est activé. Sur mon ordinateur portable, il comprend un trait d'union (processeur i5-3210m). Donc, je pars pour la ponctuation.

Pensées? Des reproches?

Le demandeur a demandé perl, alors voilà:

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
la source
Je voudrais juste utiliser grep -q [-.]comme c'est moins de taper. FWIW, j'ai vérifié plusieurs Xeons / i5 / i7 (y compris les variantes mobiles) et aucun d'entre eux n'a de trait d'union dans le fichier thread_siblings_list. Il ne suffit pas de simplement vérifier cpu0 - donc, quelque chose comme ça serait plus robuste: grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list. Cependant, juste un grep 1 /sys/devices/system/cpu/smt/active -qest encore plus pertinent - cf. La réponse d'Oscar
maxschlepzig
1

Le moyen le plus simple de vérifier si le protocole SMT (générique pour HT, qui n'est que la marque Intel) est actif est le suivant:

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

vous donne 0 pour inactif ou 1 pour actif

Vous pouvez réellement l'activer ou le désactiver au moment de l'exécution avec:

echo [on|off] > /sys/devices/system/cpu/smt/control
Oscar Tiderman
la source
Catting /sys/devices/system/cpu/smt/controlest également possible et donne on|off|forceoff|notsupported|notimplemented.
maxschlepzig
0

Mieux vaut vérifier lscpu, où vous pouvez voir "Fil (s) par noyau: 1", signifie qu’un seul thread par 1 noyau.

    # 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
la source
0

Stephaniea a déjà mentionné lscpu. Je voulais ajouter un peu plus à cela.

Sur mon processeur AMD Epyc, chaque fois qu’un noyau logique est déconnecté, lscpuaffiche une nouvelle ligne supplémentaire appeléeOff-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
la source