web-dev-qa-db-fra.com

Mesure de charge de la CPU avec hyperthreading sur Linux

Comment puis-je obtenir la vraie utilisation d'un processeur d'hyperthreading multicœurs?

Par exemple, envisagez un processeur 2 noyau, exprimant 4 cœurs virtuels.

Une seule charge de travail filetée apparaîtrait désormais à 100% en top, car un noyau des cœurs virtuels est complètement utilisé. La CPU et top fonctionne comme prévu, comme il y aurait 4 vrais noyaux.

Avec deux threads Cependant, les choses deviennent Arkward: si tout fonctionne bien, ils sont équilibrés aux deux vrais noyaux. Nous avons donc une utilisation de 200%: deux fois 100% et deux noyaux virtuels inactifs, et utilisent tout le pouvoir de la CPU disponible. . Cela me semble bien.

Toutefois, si les deux threads fonctionnaient sur un seul noyau réel, ils apparaîtraient comme en utilisant deux fois 100%, ce qui rend l'utilisation de 200% de base virtuelle. Mais du vrai côté, ce serait un noyau partageant sa puissance sur les deux threads, qui n'utilisent que la moitié de la puissance totale de la CPU.

Donc, les numéros d'utilisation indiqués par top ne peuvent pas être utilisés pour mesurer la charge de travail total de la CPU.

Je me demande également comment l'hyperthreading équilibre deux virtuels sur un noyau réel. Si deux threads prennent une quantité de cycles différente, les noyaux virtuels 's'adaptent "de sorte que les deux représentent une charge à 100% même si la charge réelle diffère?

12
dronus

Martin Tegtmeier chez Oracle a écrit un blog-poste intéressant à propos de cette dernière année: https://blogs.oracle.com/solaris/cpu-utilisation-of-multi-Threeded-Architecures-Expliné-v2

La réponse courte; L'hyperthreading dégage vraiment la capacité du sommet à signaler les pourcentages globaux de l'utilisation des processeurs/processeurs de la CPU.

Dans le pire des cas, un processeur à 2 cœurs 4-virtuel exécutant 2 threads à 100% - utilisation-per-noyau, pourrait presque saturer la CPU. (Selon l'utilisation du port d'exécution; seuls les threads qui utilisent des ressources informatiques entièrement différentes sur la CPU pourraient toujours s'exécuter sans affecter les performances sur le thread actuel.) Toutefois, le haut signalera toujours 50% de ralenti dans ce cas.

5
TinkerTank

L'utilisation de base est très différente de la charge sur le système. L'utilisation de base ne montre que dans quelle mesure le noyau calcula quelque chose ou attend des instructions. Il peut être à 100% qui correspond à un moment donné de la CPU calculera 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 toute 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érant pas la CPU. Pour ce type de scénario, vous ne verrez pas une utilisation élevée du processeur, mais le système peut être bien sur sa capacité.

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

Il n'est pas important si l'utilisation de la CPU est de 100 ou 10%. La moyenne de charge peut être aussi élevée que 200 ou 300, dans ces cas, le système sera à peine réactif.

Dans une moyenne de charge de fonctionnement normale, la moyenne de charge 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 chiffres que vous verrez dans une sortie w est chargé AV. pour 1/5/15 minutes.

4
Hkntn

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

Je pense que l'article que je fais référence sur le lien suivant est bien ciblé de répondre à cette question: http://perfynamics.blogspot.ch/2014/01/monitoriing-cpu-utilisation-under-hyper.html Englisons

CITATION:

L'idée derrière HT est d'autoriser un thread d'application différent à exécuter lorsque les stands d'applications actuellement en cours d'exécution; En raison de la déficience des branches, des bulles dans le pipeline, etc. pour rendre cela possible, il doit y avoir un autre port ou comme registre. Ce registre devient visible pour le système d'exploitation lorsque HT est activé. Cependant, le système d'exploitation (et tout le chemin de la chaîne alimentaire à tous les outils de perfs que vous utilisez) pense maintenant à deux fois la capacité du processeur est disponible, c'est-à-dire 100% de CPU à chaque port.

Mais sous la cagoule, il n'y a toujours que ne Unité d'exécution: le noyau unique, physique, vous avez commencé avec avant que HT ait été activé. La différence est qu'elle est partagée d'une certaine manière entre les 2 ports. Comment le noyau unique est-il commuté entre les deux ports est très compliqué mais est le plus facilement compris en termes de files d'attente interrogées. Je vais dans ce niveau de détail dans mes cours de GCAP.

Les meilleures mesures de test que j'ai, indiquent que chaque port HT ne peut pas devenir plus de 75% occupé, en moyenne ou 150% de la capacité totale de 200% prévue conformément au système d'exploitation. La capacité "manquante" de 50%, que j'ai mentionnée plus tôt, est une illusion. Intel a affirmé que quelque chose dans la fourchette de 120% à 130% peut être attendu pour des applications générales.

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

mvn clean install -DskipTests -T 5

Et je peux vous assurer mes 8 cœurs virtuels et 4 noyaux physiques sont tous allés à 100% d'utilisations de la CPU. Et je n'ai certainement pas 8 noyaux sur ma machine.

Longue histoire courte, vous pouvez assumer ce qui suit si la charge totale de la CPU est supérieure à 100%, vous êtes au plus, et probablement assez précoce, en utilisant exactement 100% du noyau physique. Que les ménes, si vous avez du noyau physique 1 divisé dans le système d'exploitation CPU 1 et CPU 2. Et sur la CPU 1, vous avez une utilisation totale de 50% et sur la CPU 2, vous avez une utilisation totale de 50%, probablement dans la vie réelle que vous êtes mettre une pression d'une utilisation totale de 100% sur cette CPU. Vous l'avez maximisé.

Mais bien sûr, le système d'exploitation dans ses outils de surveillance du système n'a aucune idée de vous vendre une illusion. De la situation situationiste du système d'exploitation et de la façon dont il gère les ressources, il va simplement croire que l'interprétation de ces deux noyaux virtuels reste 50% d'inactivité, donc s'il y a plus de tâches à exécuter, il tentera de les distribuer uniformément sur ces deux cœurs . Ainsi, lorsque vous atteignez plus de 100% d'utilisation du processeur, pendant une période d'utilisation de la CPU, il y a toujours des travaux fidèbres à courir dans cette période de temps qui n'a jamais eu de changement pour obtenir un temps de couplage sur la CPU. Finalement, il l'obtiendra, mais il y a toujours des threads qui ne fonctionnent même pas même s'ils sont programmés.

Merci

0
99Sono