J'ai un système exécutant une application de trading financier dans une installation distante. Je n'ai pas accès à l'OIT / DRAC, mais je dois désactiver l'hyperthreading. Le système utilise des processeurs hex-core Intel Westmere 3,33 GHz X5680. Je peux redémarrer, mais je veux m'assurer que le système n'active pas l'hyperthreading en raison de problèmes de performances. Existe-t-il un moyen propre de le faire à partir de Linux?
Edit: La noht
directive ajoutée à la ligne de commande de démarrage du noyau n'a pas fonctionné. Idem pour RHEL.
sysbench --num-threads=1 --test=cpu run
avec différents threads numériques et HT activés et désactivés indique que la désactivation de HT diminue les performances lorsqu'il existe de nombreux threads, et même s'il n'y a qu'un seul thread, il n'y a aucun avantage à désactiver HT. Je suggère donc de le laisser tel quel: c'est optimal.echo 1
au lieu deecho 0
devrait les réactiver .Un script pour désactiver l'hyperthreading au démarrage de la machine ...
Pour désactiver l'hyperthreading, j'inclus un script sur la machine /etc/rc.local. Il n'est pas extrêmement propre, mais il est facile à installer, indépendamment de l'architecture du processeur et devrait fonctionner sur n'importe quelle distribution Linux moderne.
Comment ça marche?
Les informations et les contrôles du noyau Linux sont accessibles sous forme de fichiers dans le répertoire / sys sur les distributions Linux modernes. Par exemple:
/ sys / devices / system / cpu / cpu3 contient les informations et les contrôles du noyau pour le cpu logique 3.
cat / sys / devices / system / cpu / cpu3 / topology / core_id affichera le numéro de cœur auquel appartient ce cpu logique.
echo "0"> / sys / devices / system / cpu / cpu3 / online permet de désactiver le cpu logique 3.
Pourquoi ça marche?
Je ne sais pas exactement pourquoi ... mais le système devient plus réactif avec l'hyperthreading (sur mon ordinateur portable i5 et les serveurs Xeon massifs avec plus de 60 cœurs). Je suppose que cela a à voir avec les caches par processeur, l'allocation de mémoire par processeur, l'allocation du planificateur de processeur et les itérations complexes des priorités de processus. Je pense que les avantages de l'hyperthreading sont plus importants que la complexité de la création d'ordonnanceurs cpu qui savent comment l'utiliser.
Pour moi, le problème avec l'hyperthreading est: si je démarre autant de threads gourmands en CPU que j'ai de cœurs logiques, j'aurai des changements de contexte rapides pour les tâches gourmandes en CPU, mais coûteux pour les tâches d'arrière-plan, car l'hyperthreading est totalement consommé par le tâches intensives du processeur. D'un autre côté, si je démarre autant de threads gourmands en CPU que j'ai de cœurs physiques, je n'aurai aucun changement de contexte pour ces tâches et des changements de contexte rapides pour les tâches d'arrière-plan. Cela semble bien, mais les tâches d'arrière-plan trouveront des processeurs logiques gratuits et s'exécuteront presque immédiatement. C'est comme s'ils étaient des performances en temps réel (nice -20).
Dans le premier scénario, l'hyperthreading est uselle, les tâches en arrière-plan utiliseront des commutateurs de contexte coûteux car j'ai optimisé l'hyperthreading avec le traitement normal. La seconde est inacceptable car jusqu'à 50% de ma puissance de processeur est priorisée pour les tâches d'arrière-plan.
Les tâches "intensives en CPU" dont je parle sont les serveurs d'exploration de données et d'autorisation d'intelligence artificielle (mon travail). Rendu Blender dans des ordinateurs bon marché et des clusters (pour esquisser ma future maison).
C'est aussi une conjecture.
J'ai l'impression que c'est mieux, mais ce n'est peut-être pas le cas.
la source
Pour les noyaux vraiment anciens (Linux 2.6.9 ou plus), ajoutez le paramètre noht au noyau au démarrage.
Cette option de ligne de commande du noyau a été supprimée depuis au moins Linux 2.6.18 .
Sur http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :
Si vous utilisez lilo, éditez /etc/lilo.conf (et exécutez lilo par la suite) ou si vous utilisez grub, éditez votre /boot/grub/menu.lst.
la source
noht
entrée dans la ligne de commande du noyau grub. Le système n'a pas honoré lanoht
commande. Idem pour RHEL. Voir: bugzilla.redhat.com/show_bug.cgi?id=440321#c9noht
option du noyau a été supprimée. C'est malheureux, car Linux permet une solution de contournement pour certains errata de compteur de performances Haswell (BJ122, BV98, HSD29) uniquement si HT est activé , et cela se produit avant même que initramfs ne soit chargé.Vous pouvez utiliser la "thread_siblings_list" pour chaque cœur pour désactiver le deuxième cœur de la paire HT.
Le pipeline de commandes suivant est hacky, non optimisé et fait de cette façon, espérons-le, pour le rendre plus facile à comprendre.
prenez donc toutes les listes de frères et sœurs de threads, extrayez le deuxième processeur pour chaque paire, obtenez une liste unique, puis désactivez-les.
Est-ce que ça a du sens?
si je fais "cat / proc / cpuinfo" après avoir exécuté ce qui précède, le nombre de cœurs est divisé par deux.
la source
echo 0 > /sys/devices/system/cpu/cpu$X/online
devientecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
Les noyaux plus récents fournissent un contrôle SMT (Simultaneous Multithreading).
Vous pouvez vérifier l'état de SMT avec;
Changez l'état avec
Les options sont;
Nous l'avons testé avec Linux Kernel 4.4.0
la source
La réponse de Lukas est agréable mais ne fonctionne pas vraiment pour désactiver HT car l'ID de base ne peut pas servir à l'identification des frères et sœurs HT. Ce script fonctionne à la place:
la source
J'ai dû attendre de pouvoir entrer au BIT / Drac. Les paramètres de démarrage du noyau ne fonctionnent pas sur les distributions Linux actuelles.
la source
Dans le paquet libsmbios-bin (Debian, Ubuntu, etc.), vous avez les binaires isCmosTokenActive et activateCmosToken. Avec la liste des jetons , vous pouvez ensuite essayer quelque chose comme ceci:
Activez ensuite le jeton CPU_Hyperthreading_Disable:
Vérifier:
Maintenant, la grande question est de savoir si vous avez simplement besoin d'un redémarrage pour que cela prenne effet, ou si un cycle d'alimentation complet est requis. Essayez-le et voyez comment ça se passe!
la source
Sur la base des informations fournies par Paul M ici, je le "script" de cette façon:
Bien sûr, cela ne désactive pas l'hyper-threading dans le même sens que le bricolage avec le BIOS , fondamentalement, cela indique uniquement au planificateur de tâches du noyau de ne pas utiliser certains cœurs, car nous savons qu'ils sont faux.
Un logiciel qui a fait son hypothèse en fonction de l'état précédent du sous-système
/proc
ou de son/sys
sous-système peut encore fonctionner sous-optimal ou même échouer en raison de ce changement d'exécution, de sorte que son redémarrage peut être nécessaire. Par exemple, j'ai remarqué qu'ilirqbalance
était susceptible d'échouer dans ces circonstances.la source
Désactiver HT:
Activer HT:
Remarque: Cela ne désactive pas vraiment HyperThreading mais désactive les "faux" cœurs obtenant presque le même résultat.
la source
tee
, mais cela ne répond toujours pas à une vraie réponse à la question. Ces commandes ne s'appliquent qu'à des configurations matérielles spécifiques et peuvent avoir des effets inattendus sur d'autres configurations matérielles. Et une explication de ce que font ces commandes est complètement absente.Vieux sujet, mais avait raison d'essayer cette expérience. Tout d'abord, je ne suis pas du tout certain que la désactivation des CPU (légèrement faux) au moment de l'exécution soit vraiment équivalente à la désactivation de l'hyperthreading au démarrage. Cela dit, j'ai vu une petite augmentation des performances dans notre application. (Mais pas assez pour garder.)
Utilisé la valeur thread_siblings (commune aux CPU hyperthreadés) comme clé pour activer / désactiver:
Essayez la commande sans le dernier sudo sh pour vérifier qu'elle est correcte.
la source