'htop' non mostra la% di CPU corretta, ma 'top' lo fa


12

Durante l'esecuzione mencodercon thread = 4 (su una CPU quad-core). Ho notato che htopnon mostra il suo vero utilizzo della CPU, ma lo topfa.

Sembra che htop stia riferendo solo su un core . È un bug / limitazione di htop ? Cosa sta succedendo qui?

Non ci sono altre voci per la visualizzazione di mencoder in pso htopo top. Suppongo che il 100% significhi che 1 core è al massimo, ma anche questo mi sembra strano; e gli altri core?

Aggiornamento: aggiunto l'output "Monitor di sistema"

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder

Quali flag stai usando per htop?
sep332

sep332 ... Ho appena eseguito "htop" ... quindi è un caso qualunque siano le impostazioni predefinite.
Peter.O

Bingo! sep332 .. dai una risposta e lo segnerò risolto .. Mi hai fatto vedere i miei valori predefiniti .... "H" è un tasto di attivazione / disattivazione di "Nascondi thread utente" ... Quando tutto il resto fallisce " Leggi le informazioni guida ", ma a volte un suggerimento utile nel directon giusto aiuta di più .. Grazie.
Peter

@ Peter.O: accidentalmente ridimensionato (touchpad del mouse!). Lo annullerò se modifichi il tuo post.
SabreWolfy,

Risposte:


24

Come hai detto tu stesso, puoi premere Hper mostrare i thread degli utenti.

Solo per riferimento futuro (e per divertimento), calcoliamo l'utilizzo della CPU!

Un po 'di background:

In un moderno sistema operativo, c'è un Scheduler. Mira a garantire che tutti i processi e i relativi thread ottengano una buona dose di tempo di elaborazione. Non entrerò troppo nella programmazione (è davvero complicato). Ma alla fine c'è qualcosa chiamato coda di esecuzione . Qui è dove tutte le istruzioni di tutti i processi si allineano per attendere che venga eseguito il loro turno.

Qualsiasi processo inserisce le "attività" nella coda di esecuzione e, una volta che il processore è pronto, le espelle e le esegue. Quando un programma va in modalità di sospensione, ad esempio, si rimuove dalla coda di esecuzione e ritorna alla "fine della linea" una volta che è pronto per essere eseguito nuovamente.

L'ordinamento su questa coda ha a che fare con la priorità dei processi (anche chiamata "buon valore", ovvero un processo che funziona bene con le risorse di sistema).

La lunghezza della coda determina il carico del sistema. Un carico di 2,5, ad esempio, significa che ci sono 2,5 istruzioni per ogni istruzione che la CPU può gestire in tempo reale .

Su Linux, a proposito, questo carico viene calcolato a intervalli di 10 ms (per impostazione predefinita).

Ora sui valori percentuali di utilizzo della CPU:

Immagina di avere due orologi, uno viene chiamato te rappresenta il tempo reale . Misura un secondo per ogni secondo. L'altro orologio che chiamiamo c. Funziona solo se è necessario eseguire l'elaborazione. Ciò significa che solo quando un processo calcola qualcosa viene eseguito l'orologio. Questo è anche chiamato tempo della CPU. Ogni processo sul sistema "ha" uno di quelli.

L'utilizzo del processore ora può essere calcolato per un singolo processo:

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

o per tutti i processi:

testo alternativo

Su una macchina multi core, ciò può comportare naturalmente un valore di 3,9, poiché la CPU può calcolare quattro secondi di calcolo ogni secondo, se utilizzata perfettamente.

Wikipedia fornisce questo esempio:

Un'applicazione software in esecuzione su una macchina UNIX a 6 CPU crea tre processi UNIX per soddisfare i requisiti dell'utente. Ognuno di questi tre processi crea due thread. Il lavoro dell'applicazione software è distribuito uniformemente su 6 thread di esecuzione indipendenti creati per l'applicazione. Se non si prevede alcuna attesa per le risorse, il tempo totale della CPU dovrebbe essere sei volte il tempo reale trascorso.

Ecco un piccolo frammento di pitone che lo fa

>>> 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 %

In un mondo perfetto, si potrebbe dedurre da ciò che il carico del sistema è 100 - 66,93 = 33,1%. (Ma in realtà sarebbe sbagliato a causa di cose complesse come l'attesa dell'I / O, la pianificazione delle inefficienze e così via)

Contrariamente al carico , questi calcoli comporteranno sempre un valore compreso tra 0 e il numero di processori, ovvero tra 0 e 1 o da 0 a 100%. Ora non c'è modo di distinguere tra una macchina che esegue tre attività, utilizzando il 100% di CPU, e una macchina che esegue un milione di attività, facendo a malapena qualsiasi lavoro fatto su una di esse, anche al 100%. Se, ad esempio, stai cercando di bilanciare un sacco di processi su molti computer, l'utilizzo della CPU è quasi inutile. Il carico è quello che vuoi lì.

Ora, in realtà, esiste più di uno di quegli orologi con tempi di elaborazione. Ce n'è uno per l'attesa dell'I / O, ad esempio. Quindi potresti anche calcolare l'utilizzo delle risorse I / O.

Questo potrebbe non essere stato utile per quanto riguarda la domanda originale, ma spero che sia interessante. :)


Avrei davvero dovuto includere valori di incertezza, perché usando questo semplice metodo, il calcolo sarà probabilmente fuori di ± 1%, ma non volevo annoiare troppo tutti .
Stefano Palazzo

Grazie per la lezione Ne sapevo la maggior parte, ma alcune cose erano più specifiche di quello che avevo imparato.
NightwishFan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.