'htop' n'affiche pas le% CPU correct, mais 'top' ne

12

Lors de l'exécution mencoderavec des threads = 4 (sur un processeur quad-core). J'ai remarqué que htopcela ne montre pas sa véritable utilisation du processeur, mais le topfait.

Il semble que htop ne rapporte qu'un seul noyau . Est-ce un bug / limitation de htop ? Qu'est-ce qui se passe ici?

Il n'y a aucune autre entrée pour mencoder apparaître dans psou htopou top. Je suppose que 100% signifie que 1 cœur est au maximum, mais même cela me semble étrange; qu'en est-il des autres cœurs?

Mise à jour: ajout de la sortie "Moniteur système"

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
Peter.O
la source
Quels drapeaux utilisez-vous pour htop?
sep332
sep332 ... Je lance juste "htop" ... donc c'est un cas quels que soient les défauts.
Peter.O
Bingo! sep332 .. faites une réponse à partir de cela et je vais le marquer comme résolu .. Vous m'avez fait regarder mes valeurs par défaut .... "H" est une touche à bascule pour "Masquer les threads utilisateur" ... Quand tout le reste échoue " Lisez l'aide info ", mais parfois une astuce pratique dans le bon directon aide plus .. Merci.
Peter.O
@ Peter.O: accidentellement rétrogradé (pavé tactile de la souris!). Je l'annulerai si vous modifiez votre message.
SabreWolfy

Réponses:

24

Comme vous l'avez dit vous-même, vous pouvez appuyer sur Hpour afficher les threads des utilisateurs.

Juste pour référence future (et pour le plaisir), calculons l'utilisation du CPU!

Un peu d'histoire:

Dans un système d'exploitation moderne, il y a un planificateur. Il vise à garantir que tous les processus et leurs threads obtiennent une part équitable du temps de calcul. Je n'entrerai pas trop dans la programmation (c'est vraiment compliqué). Mais à la fin, il y a quelque chose appelé une file d'attente d'exécution . C'est là que toutes les instructions de tous les processus s'alignent pour attendre que leur tour soit exécuté.

Tout processus place ses "tâches" dans la file d'attente d'exécution, et une fois que le processeur est prêt, il les supprime et les exécute. Lorsqu'un programme se met en veille, par exemple, il se supprime de la file d'attente d'exécution et revient à la «fin de la ligne» une fois qu'il est prêt à s'exécuter à nouveau.

Le tri dans cette file d'attente a à voir avec la priorité des processus (également appelée "valeur intéressante" - c'est-à-dire qu'un processus est agréable à propos des ressources système).

La longueur de la file d'attente détermine la charge du système. Par exemple, une charge de 2,5 signifie qu'il y a 2,5 instructions pour chaque instruction que le processeur peut traiter en temps réel .

Sur Linux, d'ailleurs, cette charge est calculée à 10 ms d'intervalle (par défaut).

Passons maintenant aux valeurs de pourcentage d'utilisation du processeur:

Imaginez que vous avez deux horloges, une est appelée tet représente le temps réel . Il mesure une seconde pour chaque seconde. L'autre horloge que nous appelons c. Il ne s'exécute que s'il y a du traitement à faire. Cela signifie que ce n'est que lorsqu'un processus calcule quelque chose que l'horloge fonctionne. Ceci est également appelé temps CPU. Chaque processus du système «en a» un.

L'utilisation du processeur peut désormais être calculée pour un seul processus:

U = c / t = 0,5 s / 1 s = 0,5

ou pour tous les processus:

texte alternatif

Sur une machine multi-cœurs, cela peut entraîner une valeur de 3,9 bien sûr, car le processeur peut calculer quatre secondes de calcul chaque seconde, s'il est utilisé parfaitement.

Wikipedia fournit cet exemple:

Une application logicielle exécutée sur une machine UNIX à 6 CPU crée trois processus UNIX pour répondre aux besoins des utilisateurs. Chacun de ces trois processus crée deux threads. Le travail de l'application logicielle est réparti uniformément sur 6 threads d'exécution indépendants créés pour l'application. Si aucune attente de ressources n'est impliquée, le temps processeur total devrait être six fois le temps réel écoulé.

Voici un petit extrait de python qui fait cela

>>> import time
>>> t = time.time()
>>> c = time.clock()
>>> # the next line will take a while to compute
>>> tuple(tuple(i**0.2 for i in range(600)) for i in range(6000))
>>> print (time.clock() / (time.time() - t)) * 100, "%"
66.9384021612 %

Dans un monde parfait, vous pouvez en déduire que la charge du système est de 100 à 66,93 = 33,1%. (Mais en réalité, ce serait faux à cause de choses complexes comme l'attente des E / S, l'inefficacité de la planification, etc.)

Contrairement à la charge , ces calculs aboutiront toujours à une valeur comprise entre 0 et le nombre de processeurs, soit entre 0 et 1 ou 0 à 100%. Il n'y a désormais aucun moyen de faire la différence entre une machine qui exécute trois tâches, en utilisant 100% de processeur, et une machine qui exécute un million de tâches, obtenant à peine le travail effectué sur l'une d'entre elles, également à 100%. Si vous essayez, par exemple, d'équilibrer un tas de processus sur de nombreux ordinateurs, l'utilisation du processeur est presque inutile. La charge est ce que vous voulez là-bas.

Maintenant, en réalité, il y a plus d'une de ces horloges de temps de traitement. Il y en a un pour attendre les E / S par exemple. Vous pouvez donc également calculer l'utilisation des ressources d'E / S.

Cela n'a peut-être pas été utile concernant la question initiale, mais j'espère que c'est intéressant. :)

Stefano Palazzo
la source
Je devrais avoir inclus des valeurs d'incertitude, car l' utilisation de cette méthode simple, le calcul sera probablement hors de ± 1%, mais je ne voulais pas ennuyer tout le monde trop bien.
Stefano Palazzo
Merci pour la leçon. Je savais la plupart de cela, mais quelques choses étaient plus spécifiques que ce que j'avais appris.
NightwishFan