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.
linux
cpu
hyperthreading
autobus à impériale
la source
la source
dmidecode
vous devez être root.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
Sous Linux, en général, je cherche simplement "ht" sur la ligne "flags" de
/proc/cpuinfo
. Voir par exempleou si vous voulez inclure le "ht" dans le motif
(
\b
Correspond aux limites des mots et permet d'éviter les faux positifs dans les cas où "ht" fait partie d'un autre drapeau.)la source
lscpu
est le moyen de vérifier.J'ai toujours juste utilisé ce qui suit et j’ai examiné «Fil (s) par cœur:».
Notez cependant que cette technique échouera si un processeur logique a été désactivé avec un simple contrôle.
la source
echo 0 > /sys/devices/system/cpu/cpu31/online
, maintenant rapports lscpuThread(s) per core: 1
. Mauvaislscpu
! 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 :
la source
$NUMCORE > $NUMLOG
nous pouvons dire que l'hyperthreading est activé, non? En fait2 * $NUMCORE = $NUMLOG
, est-ce toujours vrai ou certains processeurs peuvent avoir 4x plus de cœurs?lscpu
, vouslscpu
fournirez les mêmes informations ainsi que de nombreuses méta-données supplémentaires et la sortie de celle-cilscpu
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
.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)
la source
/sys/devices/system/cpu/smt/control
. Voir aussi la réponse d'OscarVous pouvez vérifier la capacité HT du processeur avec cette commande
Vous pouvez lister les processeurs physique et logiciel vus par le noyau avec la commande suivante:
Il donne cette sortie sur un processeur monocœur HT activé:
Vous pouvez lire le résultat comme ceci:
la source
ht
dans les drapeaux de la CPU.physical id
semble représenter la prise / puce. Lecore id
semble indiquer le même noyau physiqueCe liner semble me convenir (nécessite des privilèges root):
La sortie est:
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é ...
la source
dmidecode
soit fiable.lscpu
ce ne sera pas toujours fiable. J'aime la réponse de Scott.Ce résultat indique que HT est activé car le
siblings
nombre (12) est supérieur àcpu cores
(6).la source
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:
Mais après avoir désactivé l'hyperthreading dans le BIOS, je reçois:
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 plus0
, 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.
la source
Sous Linux, cela fonctionne bien:
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:
La hiérarchie de la mémoire cache est la suivante:
lscpu -p donne une sortie au format csv pour une analyse facile du programme.
la source
Voici une approche basée sur Python - elle suggère également des moyens de la désactiver si nécessaire.
la source
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:
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à:
la source
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 fichierthread_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 ungrep 1 /sys/devices/system/cpu/smt/active -q
est encore plus pertinent - cf. La réponse d'OscarLe 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:
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:
la source
/sys/devices/system/cpu/smt/control
est également possible et donneon|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.
la source
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:
la source