mesure de la charge du processeur avec hyperthreading sur linux


12

Comment puis-je obtenir la véritable utilisation d'un processeur activé hyperthreading multicœur?

Par exemple, considérons un processeur à 2 cœurs, exprimant 4 cœurs virtuels.

Une charge de travail à un seul thread apparaîtrait désormais à 100% top, car un cœur des cœurs virtuels est complètement utilisé. Le CPU et topfonctionne comme prévu, comme il y aurait 4 vrais cœurs.

Cependant, avec deux threads, les choses se compliquent: si tout fonctionne bien, ils sont équilibrés par rapport aux deux cœurs réels, nous avons donc une utilisation de 200%: deux fois 100% et deux cœurs virtuels inactifs, et utilisons toute la puissance CPU disponible . Ça me semble bien.

Cependant, si les deux threads s'exécutaient sur un seul cœur réel, ils apparaîtraient comme utilisant deux fois 100%, ce qui fait 200% d'utilisation du cœur virtuel. Mais du vrai côté, ce serait un cœur partageant sa puissance sur les deux threads, qui n'utilisent alors que la moitié de la puissance totale du CPU.

Par conséquent, les nombres d'utilisation indiqués par topne peuvent pas être utilisés pour mesurer la charge de travail totale du processeur.

Je me demande également comment l'hyperthreading équilibre deux virtuels sur un noyau réel. Si deux threads prennent un nombre de cycles différent, les cœurs virtuels «s'adapteront-ils» de sorte que les deux affichent une charge de 100% même si la charge réelle diffère?


1
Vous comprenez que le système opérateur n'est pas conscient de la différence entre un noyau virtuel hyperthreading et le noyau physique, n'est-ce pas?
Ramhound

Il semble que oui, mais ce n'est pas nécessaire? La cartographie du noyau réel et virtuel est une simple carte un à deux. Le problème est de savoir comment mesurer la charge sur un cœur virtuel qui modifie réellement ses performances disponibles en se planifiant avec un autre sur le cœur réel. Mais toutes les données sont disponibles, je pense, la question est de savoir où sont les outils qui en tirent un bon résultat?
dronus

1
J'aime juste avoir une mesure de charge où 100% signifierait que chaque cycle de chaque noyau réel est utilisé.
dronus

1
Pour parler simplement: comment savoir à un moment donné, si mon processeur serait capable de faire plus de travail, sans ralentir le travail en cours?
dronus

1
@Ramhound, donc si j'ai un processeur physique à 4 cœurs avec 8 cœurs logiques et que ma moyenne de charge est de 4,00, suis-je à 100% d'utilisation ou à 50%?
Buttle Butkus

Réponses:


5

Martin Tegtmeier d'Oracle a écrit un article de blog intéressant à ce sujet l'année dernière: https://blogs.oracle.com/solaris/cpu-utilization-of-multi-threaded-architectures-explained-v2

La réponse courte; L'hyperthreading gâche vraiment la capacité de top à rapporter les pourcentages globaux d'utilisation / d'inactivité du processeur.

Dans le pire des cas, un processeur à 2 cœurs à 4 cœurs virtuels exécutant 2 threads à 100% d'utilisation par cœur pourrait presque saturer le processeur. (En fonction de l'utilisation du port d'exécution; seuls les threads qui utilisent des ressources informatiques entièrement différentes sur le processeur peuvent toujours s'exécuter sans affecter les performances du thread actuel.) Cependant, top signalera toujours 50% d'inactivité dans ce cas.



4

L'utilisation du cœur est très différente de la charge du système. L'utilisation du cœur ne montre que combien le cœur calcule quelque chose ou attend des instructions. Il peut être de 100%, ce qui correspond à un moment donné où le CPU calcule quelque chose.

Mais la charge est une chose différente, la charge est généralement mesurée pour déterminer si un processus doit attendre une ressource ou non. Si les processus n'attendent aucune ressource, vous verrez un système très performant. Mais parfois, vous verrez des systèmes lents mais une faible utilisation du processeur. Cela signifie généralement que certains processus attendent une ressource et ne libèrent pas le CPU. Pour ce type de scénario, vous ne verrez pas une utilisation élevée du processeur, mais le système peut être bien au-dessus de sa capacité.

Dans un système Linux, la charge moyenne est une valeur calculée pour mesurer les performances globales d'un système. La valeur de la moyenne de charge doit être comparée aux ressources informatiques parallèles, les noyaux étant spécifiques. Donc, si un système avec 4 cœurs physiques a une charge moyenne de 4 ou plus, nous pouvons dire en toute sécurité que certains processus attendront une ressource.

Ce n'est pas important si l'utilisation du processeur est de 100 ou 10%. La charge moyenne peut atteindre 200 ou 300, dans ces cas, le système sera à peine réactif.

Dans des conditions de fonctionnement normales, la charge moyenne du serveur ne doit pas dépasser le nombre de cœurs pendant une longue durée. Les pointes courtes ne sont pas importantes à mon avis. 3 nombres que vous verrez dans une wsortie est la charge av. pendant 1/5/15 minutes.


0

À mon avis, aucune des réponses ci-dessus n'est satisfaisante.

Je pense que l'article auquel je fais référence sur le lien suivant est bien ciblé pour répondre à cette question: http://perfdynamics.blogspot.ch/2014/01/monitoring-cpu-utilization-under-hyper.html

CITATION:

L'idée derrière HT est de permettre à un thread d'application différent de s'exécuter lorsque l'application en cours se bloque; en raison d'une mauvaise prédiction de branche, de bulles dans le pipeline, etc. Pour rendre cela possible, il doit y avoir un autre port ou registre AS. Ce registre devient visible pour le système d'exploitation lorsque HT est activé. Cependant, le système d'exploitation (et tout au long de la chaîne alimentaire jusqu'aux outils de perf que vous utilisez) pense maintenant deux fois la capacité du processeur est disponible, c'est-à-dire 100% CPU sur chaque port AS.

Mais sous le capot, il n'y a toujours qu'une seule unité d'exécution: le noyau physique unique avec lequel vous avez commencé avant l'activation de HT. La différence est qu'il est partagé d'une manière ou d'une autre entre les 2 ports AS. La façon dont le cœur unique est commuté entre les deux ports est très compliquée, mais est plus facilement comprise en termes de files d'attente interrogées. J'entre dans ce niveau de détail dans mes cours GCaP.

Les meilleures mesures de test que j'ai, indiquent que chaque port HT ne peut pas être occupé à plus de 75%, en moyenne, ou 150% de la capacité totale attendue de 200% selon le système d'exploitation. La capacité "manquante" de 50%, dont j'ai parlé plus haut, est une illusion. Intel a affirmé que quelque chose dans la plage de 120% à 130% peut être attendu pour les applications générales.

En fait, je suis presque sûr que le système d'exploitation peut atteindre 100% sur chaque cœur virtuel, cela ne fait aucun doute. Je viens de faire un:

mvn clean install -DskipTests -T 5

Et je peux vous assurer que mes 8 cœurs virtuels et 4 cœurs physiques ont tous été utilisés à 100% par le processeur. Et je n'ai certainement pas 8 cœurs sur ma machine.

En bref, vous pouvez supposer ce qui suit si la charge totale du processeur dépasse 100%, vous êtes au maximum, et très probablement avec précision, en utilisant exactement 100% du cœur physique. Cela dit, si vous avez CORE 1 physique divisé en CPU 1 et CPU 2 du système d'exploitation. Et sur CPU 1 vous avez une utilisation totale de 50% et sur CPU 2 vous avez une utilisation totale de 50%, très probablement dans la vraie vie mettre une pression d'une utilisation totale de 100% sur ce CPU. Vous l'avez atteint au maximum.

Mais bien sûr, le système d'exploitation dans ses outils de surveillance du système n'a aucune idée qu'il vous vend une illusion. Du point de vue du système d'exploitation et de la façon dont il gère les ressources, il pensera simplement que chacun de ces deux cœurs virtuels est toujours inactif à 50%, donc s'il y a plus de tâches à exécuter, il essaiera de les répartir uniformément sur ces deux cœurs . Ainsi, lorsque vous dépassez 100% d'utilisation du processeur, pendant une période d'utilisation du processeur, il y a toujours un travail en file d'attente à exécuter pendant cette période de temps qui n'a jamais eu de changement pour obtenir une tranche horaire sur le processeur. Finalement, il l'obtiendra, mais il y a toujours des threads qui ne fonctionnent même pas, même s'ils sont programmés pour s'exécuter.

Merci

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.