web-dev-qa-db-fra.com

Vérifier si HyperThreading est activé ou non?

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 de la manière suivante:

dmidecode -t processor | grep HTT

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

57
doubledecker

Notes ajoutées le 8 juillet 2014: Comme Riccardo Murri l'a souligné, ma réponse ci-dessous montre uniquement si le processeur signale la prise en charge hyper-Threading. Généralement, * nix O/S est configuré pour activer l'hyperthreading s'il est pris en charge. Cependant, pour vérifier cela par programme, voyez par exemple réponse de Nils !

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

Vous êtes en effet sur la bonne voie :) avec

dmidecode -t processor | grep HTT

Sous Linux, je recherche généralement juste "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

(\b correspond aux limites de Word et permet d'éviter les faux positifs dans les cas où "ht" fait partie d'un autre indicateur.)

28
xebeche

J'ai toujours juste utilisé ce qui suit et regardé "Thread (s) par noyau:".

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

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

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"
19
Nils

Les exemples ci-dessus montrent si le CPU est capable de HT, mais pas s'il est utilisé. La dernière méthode fonctionne mais pas les serveurs à double socket et les VM testées sur Xenserver où elle 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 de code, 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 crois que cela fonctionnera sur toutes les plates-formes et vous dira si son processeur est capable et s'il est activé. Peut-être un peu désordonné, je suis un débutant dans les scripts. J'ai testé avec centos XENSERVER vm, Ubuntu et Openfiler (rpath)

9
user63814

Cette doublure semble faire l'affaire pour moi (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 cœurs, j'ai donc activé l'hyperthreading.

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

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

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

# grep ht /proc/cpuinfo

Vous pouvez lister les CPU physiques et logiciels vus par le noyau avec la commande suivante:

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

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

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
5
Coren
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 siblings nombre (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
4
mpapec

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

Par exemple, sur mon Xeon 6 cœurs à 2 connecteurs, avec l'hyperthreading activé, j'obtiens:

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

Mais après avoir désactivé l'hyperthreading dans le BIOS, j'obtiens:

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

En supposant que le CPU 0 sera toujours disponible, puis vérifier le CPU 0 thread_sibling_list fichier procfs pour plusieurs nœuds, ou à la recherche d'une virgule, ou tout simplement plus que 0, indiquera 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 un one-liner assez trivial.

3
scottbb

La façon la plus simple de vérifier si SMT (générique pour HT, qui n'est que la marque Intel) est active est juste de faire:

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 lors de l'exécution avec:

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

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))
2
Neil McGill

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 le CPU 0,16.

Nous pouvons vérifier l'hyperthread comme ceci:

$ 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
...
2
edW

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

Sur mon processeur AMD Epyc, chaque fois qu'il y a un noyau logique hors ligne, lscpu affiche une nouvelle ligne supplémentaire appelée 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
1
talekeDskobeDa

Beaucoup de mises en garde et de suppositions dans les réponses ici ... il semble que la réponse ne soit pas si évidente. lscpu a son gotcha's, qui s'applique à tous les "count cores et processeurs logiques, puis compare" la réponse. Parce que vous pouvez arrêter les processeurs logiques avec une simple commande d'écho (... cela peut être critique 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 machines Dell Xeon, la liste des frères et sœurs comprend une virgule lorsque HT est activé. Sur mon ordinateur portable, il comprend un trait d'union (processeur i5-3210m). Je demande donc 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
1
Mike S

que diriez-vous lscpu. Ensuite, vous obtenez beaucoup d'informations sur vos processeurs, y compris le nombre de threads par cœur. Si c'est 1, le multithreading est désactivé.

0
Martijn
lscpu | grep Thread

Renvoie -> Fil (s) par noyau: 1

Si 1 hyper threading n'est PAS activé.

0
mannoj

Mieux vaut vérifier lscpu, où vous pouvez voir "Thread (s) par core: 1", signifie seulement un thread par 1 core.

    # 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
Gineesh