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.
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.)
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
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"
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)
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`);'
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
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
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.
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
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))
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
...
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
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
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é.
lscpu | grep Thread
Renvoie -> Fil (s) par noyau: 1
Si 1 hyper threading n'est PAS activé.
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