web-dev-qa-db-fra.com

"htop" n'indique pas le pourcentage de CPU correct, mais "top"

Tout en exécutant mencoder avec threads = 4 (sur un processeur à quatre cœurs). J'ai remarqué que htop ne montre pas son utilisation du processeur true, mais top le fait.

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 pas d'autres entrées pour mencoder affiché dans ps ou htop ou top. Je suppose que 100% signifie que 1 noyau est saturé au maximum, mais même cela me semble étrange; Qu'en est-il des autres noyaux?

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
11
Peter.O

Comme vous l'avez dit, vous pouvez frapper H pour afficher les discussions des utilisateurs.

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

Un peu de fond:

Dans un système d'exploitation moderne, il existe un planificateur. Il vise à garantir que tous les processus et leurs threads disposent d'une part équitable du temps de calcul. Je ne vais pas trop m'occuper de la planification (c'est vraiment compliqué). Mais à la fin, il y a quelque chose appelé une file d'attente. C'est là que toutes les instructions de tous les processus s'alignent pour attendre leur tour d'être exécutés.

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 retire de la file d'attente d'exécution et revient à la "fin de la ligne" une fois qu'il est prêt à être exécuté à nouveau.

Le tri de cette file d'attente a à voir avec les processus Priorité (également appelée "valeur Nice" - c.-à-d. Un processus est Nice à propos des ressources système).

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

Au fait, sous Linux, cette charge est calculée par intervalles de 10 ms (par défaut).

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

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

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

U = c/t = 0.5s / 1s = 0.5

ou pour tous les processus:

alt text

Sur une machine multi-core, cela peut bien sûr donner une valeur de 3,9, car le processeur peut calculer quatre secondes de calcul par seconde, s'il est utilisé parfaitement.

Wikipedia fournit cet exemple:

Une application logicielle s'exécutant sur une machine UNIX à 6 CPU crée trois processus UNIX pour répondre aux besoins de l'utilisateur. 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 de six fois le temps réel écoulé.

Voici un petit extrait python

>>> 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 pourriez en déduire que la charge du système est de 100 - 66,93 = 33,1%. (Mais en réalité, ce serait une erreur en raison de choses complexes telles que l'attente d'E/S, l'inefficacité de la planification, etc.)

Contrairement à load, ces calculs toujours donneront une valeur comprise entre 0 et le nombre de processeurs, c'est-à-dire entre 0 et 1 ou entre 0 et 100%. Il n'y a maintenant aucun moyen de faire la différence entre une machine exécutant trois tâches, utilisant 100% de l'unité centrale, et une machine exécutant un million de tâches, effectuant à peine le moindre travail sur l'une d'elles, également à 100%. Si vous essayez, par exemple, d’équilibrer un ensemble de processus sur de nombreux ordinateurs, l’utilisation du processeur est pratiquement inutile. La charge est ce que vous voulez là.

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

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

24
Stefano Palazzo