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 top
fonctionne 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 top
ne 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?
la source
Réponses:
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.
la source
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
w
sortie est la charge av. pendant 1/5/15 minutes.la source
À 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:
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:
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
la source