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.
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.
Réponses:
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
( \b
Correspond aux limites des mots et permet d'éviter les faux positifs dans les cas où "ht" fait partie d'un autre drapeau.)
lscpu
est le moyen de vérifier.
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
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.
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"
$NUMCORE > $NUMLOG
nous 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?
lscpu
, vous lscpu
fournirez les mêmes informations ainsi que de nombreuses méta-données supplémentaires et la sortie de celle-ci lscpu
sera plus facilement analysable. mais cette solution fonctionne et utilise uniquement /proc/cpuinfo
.
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 Xenserver
lesquels 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)
/sys/devices/system/cpu/smt/control
. Voir aussi la réponse d'Oscar
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
ht
dans les drapeaux de la CPU.
physical id
semble représenter la prise / puce. Le core id
semble indiquer le même noyau physique
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`);'
dmidecode
soit fiable.
lscpu
ce ne sera pas toujours fiable. J'aime la réponse de Scott.
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 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 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_list
fichier 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.
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
...
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))
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.
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. lscpu
a 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
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 -q
est encore plus pertinent - cf. La réponse d'Oscar
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
/sys/devices/system/cpu/smt/control
est également possible et donne on|off|forceoff|notsupported|notimplemented
.
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
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é, lscpu
affiche 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
dmidecode
vous devez être root.