Combien de processeurs doivent être utilisés avec Hyperthreading?

22

Disons que j'ai un processeur de serveur avec 18 cœurs, avec hyperthreading, ce qui signifie que je peux voir 36 cpus dans htop.

Pour utiliser pleinement le processeur et ne pas avoir d'impact sur les performances d'un seul thread, dois-je viser à ce que les 36 "cœurs" fonctionnent à 100%, et les cœurs HT feront juste moins de travail et rapporteront toujours 100%, ou cela signifierait-il que le les cœurs «pleins» sont déjà interrompus par la tâche sur son «cœur HT» et font donc moins de travail sur un seul thread?

Je suis conscient qu'il y a beaucoup de variables qui affectent les performances HT, je veux juste savoir ce que les compteurs d'unités centrales signifient lorsqu'ils traitent avec HT.

Tassadar
la source
6
L'hyperthreading ne vous donne pas vraiment le double du processeur. Pensez-y plutôt comme un processeur lit dans deux programmes, et chaque fois qu'un programme est sur le point de faire quelque chose qui prendra plusieurs cycles, ou lorsqu'il n'utilise pas toutes les ressources (additionneurs, multiplicateurs, chargeurs, etc.), il basculera vers le autre programme afin qu'il puisse les utiliser. Donc, voir 100% sur tous les threads nécessite une heureuse coïncidence de programmes compatibles fonctionnant sur un noyau.
simpleuser
4
En raison de cette conception, l'hyperthreading fonctionne bien avec des charges de travail mixtes. Par exemple, un hyperviseur où toutes les machines virtuelles exécutent des services différents. Dans ce genre de scénario, il n'est probablement même pas nécessaire de tester. Pour des charges de travail plus homogènes, des tests sont généralement nécessaires pour être sûr.
Michael Hampton

Réponses:

14

Si le second noyau virtuel est autorisé à contribuer lorsque le premier serait autrement coincé, il vaut mieux que pas , vous obtenez (au moins) un peu de travail supplémentaire effectué.

La question devient: quand le fait d'avoir deux threads différents en fait-il un pire? La prédiction de branche et les dépendances entre les instructions ne changeront pas. En attente de l'accès à la mémoire maintenant ... les deux threads rivalisent sur l'accès à la mémoire, à la fois en termes d'utilisation du cache et de bande passante.

Si certains processeurs fonctionnent avec HT et d'autres non, cela signifie-t-il également que vous affecterez des threads spécifiques à un type ou à l'autre? Je ne pense pas: vos programmes exécuteront leurs threads sur des cœurs virtuels aléatoires. Alors, comment le fractionnement de la configuration aide-t-il? Étant donné que chaque CPU a son propre cache, le seul effet est dû à la bande passante mémoire et au fardeau de la cohérence du cache.

En général, vous atteignez un point où avoir quelque chose de plus que vous pourriez faire coûte plus cher que de laisser certaines unités d'exécution du processeur devenir inactives. Cela ne dépend pas directement du nombre de threads, mais de ce que font les threads et de l'architecture détaillée de la mémoire et des nuances de performances des différents composants.

Il n'y a pas de réponse simple. Même avec un programme spécifique en tête, la machine peut différer de celles des personnes racontant leurs propres expériences.

Vous devez l'essayer vous-même et mesurer ce qui est le plus rapide, avec ce travail spécifique sur cette machine exacte. Et même alors, cela peut changer avec les mises à jour logicielles et le changement d'utilisation au fil du temps.

Jetez un œil au volume 3 du magnum opus d'Anger . Si vous examinez attentivement un processeur spécifique, vous pouvez trouver des ressources limitées parmi le pipeline profond de nombreuses étapes nécessaires à l'exécution de code. Vous devez trouver un cas où l'excès de financement le fait s'exécuter plus lentement, au lieu de ne pas prendre plus de travail. En général, cela signifierait une sorte de mise en cache; et où la ressource est partagée entre les threads.


Que signifie le compteur CPU: il signale tout le temps qui n'est pas passé à exécuter le thread inactif. Les deux threads logiques affectés à un noyau ne seront pas inactifs même si le travail réel effectué sur l'un d'eux peut être faible. Le temps passé avec le pipeline bloqué pendant quelques cycles jusqu'à ce que les résultats soient prêts, que la mémoire soit récupérée, que les opérations atomiques soient clôturées, etc. et le temps montre toujours en cours d'utilisation. L'attente sur la RAM ne s'affichera pas comme inactive. Seul quelque chose comme les E / S fera le bloc de threads et arrêtera le temps de chargement vers lui. Un mutex de système d'exploitation le fera en général, mais avec l'essor des systèmes multicœurs, ce n'est plus une chose sûre, car un «verrou tournant» ne fera pas revenir le fil sur l'étagère.

Ainsi, un compteur CPU de 100% ne signifie pas que tout se passe bien, si le CPU est souvent bloqué en attente de mémoire. Un nombre inférieur de cœurs logiques affichant 90% pourrait très bien faire plus de travail, car il termine le calcul du nombre et attend maintenant sur le disque.

Ne vous inquiétez donc pas du compteur CPU. Regardez les progrès réels fait, seulement .

JDługosz
la source
23

Les indicateurs de CPU sont très mauvais pour vous dire combien de performances supplémentaires vous pouvez retirer de vos CPU hyperthreadés. Pour cela, vous devez exécuter vos propres benchmarks à différents taux de sur-abonnement au cœur physique. Certaines charges de travail fonctionnent mieux avec HT complètement désactivé, alors incluez également ce cas dans vos tests. Ce pourrait être un 1: 2 (36 travailleurs parallèles), ou 1: 1,5, voire 1: 2,5! Cela dépend de votre charge de travail.

Plus en détail, HT est implémenté sur le silicium de manière à réduire le temps d'inactivité du processeur lorsqu'un contexte doit être commuté ou qu'une prédiction de branche échoue. Cela permet d'atteindre plus facilement 100% d'utilisation de l'unité d'exécution qu'avec des astuces de système d'exploitation pur. HT a évolué depuis son introduction, et il y a plus de parallélisme sur les puces modernes que celles que nous utilisions il y a 10 ans.

Il existe deux profils d'exécution qui affecteront l'emplacement de votre point de surabonnement optimal:

  • Longue durée d'exécution . Si vos employés s'exécutent pendant des minutes ou des heures avant le recyclage, comme les gros travaux de rendu ou la modélisation d'environnement, vous obtiendrez des performances monocœur plus efficaces par employé. Cela réduira votre ratio.
  • Durée d'exécution courte . Si vos employés effectuent un cycle en quelques secondes ou en petites minutes, comme les threads d'applications Web, la surcharge liée à l'activation d'un nouveau processus signifie que votre ratio sera plus élevé.
sysadmin1138
la source
Petites minutes? Tu veux dire, quelques minutes?
Ismael Miguel
Plutôt. 1 à 5 environ. À 120 secondes par travailleur avec 18 travailleurs, vous en retournez un nouveau toutes les 7 secondes. Une grande partie se résume à la mise en cache de la localité.
sysadmin1138
1
Vous ne l'avez pas compris. Vous dites "petites minutes" sur votre 2e point. Les minutes ont toujours la même "taille", qui est de 60 secondes. Parfois 61 secondes.
Ismael Miguel
4

Vous devriez voir les 36 cœurs fonctionner à 100% - en supposant que le logiciel peut le faire (ce qui n'est pas anodin - la planification peut être délicate avec autant de cœurs, donc les creux inférieurs à 100% sont acceptables).

De toute évidence, lorsque vous "divisez" un minerai avec de l'hyperthreading, la signification de ces 200% n'est pas "2x100% - dans le travail effectué. Mais cela est invisible pour toute mesure prise (qui provient de l'utilisation du processeur et n'a aucun concept de travail effectué). La quantité de travail à effectuer dépend de la nature du travail - quelque part au-dessus de 1,5 x le travail sans hyper-threading est à prévoir la plupart du temps.

TomTom
la source
3

La façon dont l'hyperthreading est implémentée varie en fonction de l'uarch CPU spécifique. De Nehalem à Skylake, Intel a considérablement réduit les parties partagées à ratio fixe (c.-à-d.: 50/50) du pipeline, se dirigeant vers des structures partagées de manière dynamique.

Quoi qu'il en soit, en termes généraux, l'activation de HT a conduit à une exécution à un seul thread légèrement plus lente, mais en raison du fonctionnement du planificateur Linux, cela ne se produit que lorsque le nombre ou le thread en cours d'exécution est supérieur au nombre de cœurs physiques. Comme dans de telles situations (lorsque threads> cœurs) vous appréciez généralement le débit total d'une importance maximale, l'hyperthreading reste un gain net.

Comment est-ce possible? Le point clé à comprendre est que le CPU ne présente pas les cœurs physiques et les cœurs virtuels comme des cœurs égaux, il expose plutôt ces derniers de manière à ce que le planificateur Linux puisse éviter de les planifier si d'autres cœurs physiques sont disponibles. En d'autres termes, il utilise d'abord tous les cœurs physiques, puis il commence à utiliser le virtuel.

Cela signifie que, généralement, HyperThreading est une fonctionnalité très précieuse (d'autres processeurs, comme Power8, utilise des techniques SMT encore plus approfondies) et que pour maximiser le débit, vous devez l'activer, en chargeant le processeur avec au moins un thread par cœur virtuel ou physique. Pour un exemple pratique, pour extraire toutes les performances d'un processeur 18 cœurs, vous devez utiliser au moins 36 threads.

Il existe deux exceptions:

  1. si tout ce que vous voulez est de minimiser la latence d'un ensemble limité de threads (où threads <cœurs physiques), vous pouvez désactiver HT
  2. les très anciens CPU (Pentium4 et, de manière beaucoup plus petite, Nehalem) ont des règles de partition inflexibles qui obligent le CPU à diviser de nombreuses ressources clés au rapport 50/50, indépendamment de l'état / de la charge du second thread. Dans ce cas, vous avez dû comparer votre cas d'utilisation pour vous assurer que le débit ajouté vaut les performances de thread unique nettement inférieures.
shodanshok
la source