# Top, conky e dual core

## HoX

Ho 2 problemi che vorrei porre alla vostra attenzione:

1. Ho notato che se scrivo uno script tipo

```
#!/bin/bash

while true

do

done
```

conky mi segna un utilizzo della cpu (su entrambi i core) del 60% (a riposo è del 2%) che mi sembrano tanti (considerando che non fa nulla).

Ho provato anche una versione in c (sperando che il problema di prestazione fosse solo di bash), ma anche il binario fa la stessa cosa.

Però se uso top per vedere l'utilizzo della cpu ottengo valori tra il 2-4% per quel processo.

Come mai questa differenza? E' normale? E' normale che venga utilizza così tanta CPU-Conky?

2. Sempre con conky vedo che i due core hanno sempre lo stesso identico utilizzo (%) e mi è venuto il dubbio che in realtà non funzioni a dovere l'utilizzo dei due core... come posso verificare?

----------

## skypjack

Per la domanda 2 ti dico che conky, almeno per la mia esperienza, è un po' disorientato dai dual core intel (ho un Core Duo non 2, purtroppo per il non 2) e il confronto fra ciò che dice e ciò che veramente accade non è assolutamente credibile / fattibile.

Se vuoi seguire la cpu, l'unica è seguire il processore come singolo e farsi un'idea generale, perchè seguire i due core separatamente per quanto mi riguarda non mi da informazioni utili / plausibili (o meglio, da le stesse identiche informazioni riguardo al carico percentuale per entrambi i core, cosa che si può verificare non essere vera).

Per quanto riguarda il primo punto, non ho ben chiaro... Sarà l'ora, sarà il sonno, ma non ho capito cosa vuoi dire, se puoi spiegarti meglio sarò felice di darti il mio parere...

----------

## HoX

 *skypjack wrote:*   

> Per quanto riguarda il primo punto, non ho ben chiaro... Sarà l'ora, sarà il sonno, ma non ho capito cosa vuoi dire, se puoi spiegarti meglio sarò felice di darti il mio parere...

 

In poche parole non capisco perchè un semplice loop-infinito mi prenda un 58% di utilizzo della cpu... (sempre stando a conky)... per non far nulla mi sembra parecchio no? capisco un 1 o 2%, ma 58% di risorse cpu per far nulla mi pare troppo

----------

## skypjack

Aspetta, però, un loop infinito non è vero che non fa nulla.

Potrei capire mi dicessi "un thread mi prende tanto, quando è in attesa su una risorsa" allora ti direi "ok, strano, dovrebbe essere dormiente se ben fatto", ma un loop infinito "looppa"!! Ovvero, consuma, soprattutto laddove le risorse sono disponibili, visto che per sua natura è avaro e il sistema non ha motivo per negargliele (ma si scrive così?).

Perchè ti preoccupa tanto l'idea che un loop infinito consumi? A quest'ora ti fai strane idee...  :Very Happy: 

ps: ovviamente scherzo, non fraintendere, non volevo schernirti (modalità "prevenzione flame attivata").  :Wink: 

[EDIT]: E aggiungo, che te non ti stanchi a stare fermo sul divano a non fare un tubo? Amico mio, poltrire affatica, è la riprova che si consuma molto, da qui l'ovvio comportamento pseudo-umano delle nostre macchine preferite...  :Laughing: Last edited by skypjack on Thu Jun 07, 2007 9:50 pm; edited 1 time in total

----------

## HoX

 *skypjack wrote:*   

>  un loop infinito "looppa"!! 

 

e fin qui sono d'accordo... ma se la cpu usa il 60% delle risorse per quello:

1- mi consuma un sacco di batteria (su laptop) per far nulla (nel senso che il corpo del loop è vuoto)

2- se devo eseguire software più pesanti vengono rallentati in una maniera impressionante, no?

----------

## skypjack

Guarda, concordo in pieno, ma perchè dovrei eseguire un loop infinito, un "while(1);" immotivato?

Nel senso, senza dubbio ruba risorse agli altri processi, ma a chi dovrebbe venire in mente di fare una cosa del genere (a parte te alle 23:52 di sera per poi intortarmi in una discussione filosofica come questa)?  :Laughing: 

[EDIT]: Non è vero che consuma batterie e risorse per fare nulla, anche se il corpo del while è vuoto la macchina mica lo sa, per lei è un processo da eseguire e fa il suo dovere, dedicando le risorse di cui ha bisogno!! Anche tirarsi una zappa sui piedi fa male ed è controproducente, ma se lo fai mica quella si ferma a mezz'aria perchè si rende conto che è una stupidaggine!! Sta all'uomo fare le cose con gnegnero e lanciare un loop infinito (senza offesa) non è proprio la cosa più furba del mondo!!  :Wink: 

[EDIT 2]: Comunque se qualcuno legge questa discussione ci prende per pazzi, secondo me!!  :Laughing: 

----------

## HoX

 *skypjack wrote:*   

> Guarda, concordo in pieno, ma perchè dovrei eseguire un loop infinito, un "while(1);" immotivato?

 

Allora... in principio il loop non era vuoto ma eseguiva tutta una serie di azioni... poi sono andato a vedere conky e ho visto che consumavano un sacco di risorse... quindi ho cercato di capire cosa consumasse tanto e alla fine mi sono ritrovato con il loop vuoto... chiaramente non avvierei mai un loop vuoto. Cmq ora so che è normale e va bene così... anche se mi domando come si possa avviare una azione infinita senza sacrificare il pc

del resto suppongo che il sistema sia pieno di loop no? com'è che quelli non consumano così tanto?

----------

## Kernel78

Un ciclo vuoto esegue comunque delle operazioni, riducendo all'osso il concetto fa un controllo della condizione e in base al risultato sposta il puntatore al codice da eseguire. Dal punto di vista tecnico sono operazioni anche più impegnative di una somma o una sottrazione e se non ci metti uno sleep per rallentare un po' il pc si dedicherà anima e corpo a eseguire questo ciclo visto che per lui si tratta comunque di istruzioni da eseguire, non sono mica dei noop  :Wink: 

----------

## skypjack

 *Anema wrote:*   

> del resto suppongo che il sistema sia pieno di loop no? com'è che quelli non consumano così tanto?

 

In realtà, qualcuno la batteria te la finisce sul portatile, prima o poi!!  :Wink: 

----------

## lavish

 *skypjack wrote:*   

> se qualcuno legge questa discussione ci prende per pazzi, secondo me!! 

 

Moved from Forum italiano (Italian) to Forum di discussione italiano.

----------

## skypjack

[OT]

Doh!!!

Lavish, per colpa tua sto programmando la mia tastiera così da controllare le parole inserite e filtrare "discussione" sostituendola con "sequenza di parole che compongono discorsi che potrebbero appartenere ad una discussione ma anche perchè no ad un trattato ultra-tecnico su argomenti specifici degni del Forum Italiano, io aspetterei a muovere"!!

Appena ho finito distribuirò il codice e muoveremo alla conquista del forum!!!  :Laughing: 

[/OT]

----------

## lavish

 *skypjack wrote:*   

> "sequenza di parole che compongono discorsi che potrebbero appartenere ad una discussione ma anche perchè no ad un trattato ultra-tecnico su argomenti specifici degni del Forum Italiano, io aspetterei a muovere"

 

 *LINEE GUIDA wrote:*   

> La sezione principale del forum è riservata alle richieste di supporto e a topic tecnici strettamente legati a gentoo.
> 
> Per tutte le discussioni di più ampio respiro o per qualsiasi discussione inerente all'informatica e a GNU/*nix usate il Forum di discussione. 

 

Non mi pare si possa scappare  :Wink: 

----------

## skypjack

Maledizione!!  :Rolling Eyes: 

Ma troverò il bug nel regolamento, vedrai...  :Laughing: 

----------

## Frez

 *Anema wrote:*   

> del resto suppongo che il sistema sia pieno di loop no? com'è che quelli non consumano così tanto?

 

e infatti il sistema non e' pieno di loop: e' pieno di wait_queue, ovvero di processi sospesi in attesa di un qualche evento.

Come ad esempio: dati da/per il disco, la pressione di un tasto, un movimento del mouse, dati dall'interfaccia di rete, lo scadere di un timer.

I programmi non stanno in loop in attesa di queste cose, semplicemente dicono al S.O. <<ho bisogno di questo "servizio", vado a nanna, svegliami quando i dati sono pronti>>.

L'unico motivo per stare ad eseguire costantemente qualcosa e' ... "aver qualcosa da fare", cioe' elaborare dati (che siano pronti, non sul disco ancora da reperire ovviamente).

Eseguire all'infinito anche una sola istruzione di salto su se stessi e' una operazione che utilizza la cpu, anche se inutilmente (ma come accennato in un altro post sopra: per il computer non fa differenza eseguire una fft o eseguire all'infinito un jump sullo stesso indirizzo, ai suoi occhi sono entrambe operazioni attendibili ed oneste  :Smile:  )

----------

## HoX

 *Frez wrote:*   

> e infatti il sistema non e' pieno di loop: e' pieno di wait_queue

 

Innanzitutto: figo... c'è sempre da scoprire qualcosa qui...

e poi: come faccio ad usare un wait_queue su uno script?

Dovrebbe vedere quando cambia la variabile NET_CURRENT_DESKTOP di Xorg.

Per ora io uso

```
while true

do

     sleep 0.2 #inserito per diminuire l'utilizzo di cpu come "suggerito" da Kernel78

     xprop -root | grep ^NET_CURRENT_DESKTOP | cut -d' ' -f3

done
```

----------

## skypjack

Non so (non credo) tu possa farlo via script bash. Ti consiglio di aumentare lo sleep, tanto per cominciare...  :Wink: 

----------

## HoX

 *skypjack wrote:*   

>  Ti consiglio di aumentare lo sleep, tanto per cominciare... 

 

per il momento lo lascio così che è accettabile come compromesso tra prestazione (utilizzo cpu intorno al 6%) e velocità... dovendo eseguire delle azioni quando cambia il workspace non posso mettere uno sleep troppo alto

----------

## gioi

Guarda Anema, secondo me parti da un presupposto sbagliato...

indipendentemente dalla funzioni realmente eseguite da un loop (volendo "semplificare" l'architettura di un PC ad una macchina di tuning o roba simile, quanto meno consta di tre operazioni: un confronto, un incremento ed un salto), ciò che "misurano" i vari CPU meters non sono le risorse impiegate, ma il carico cui è sottoposta la cpu.

Questo perchè non credo esista un discriminante che possa permetterti di dire quante e quali unità funzionali sono impiegate in una cpu ad un determinato istante, cosa che dipende dalla tipologia di codice eseguito (integer, floating point, ma anche sysroutine ecc ecc) e da come lo scheduler gestisce la cosa. 

Ciò che i vari cpu meters ti dicono è che sul totale di "cicli operativi" disponibili X sono impiegati da tal processo, Y da un altro e così via...

Se in un dato istante un ciclo vuoto "assorbe" il 60% dei cicli cpu, non è un'anomalia, come ti hanno giustamente segnalato in molti, ma semplicemente che del carico istantaneo il 60% è costituito da quel loop a vuoto.

Non ti puoi minimamente mettere a confrontare quel 60% di carico con il carico dato da operazioni ben più onerose (a titolo d'esempio la codifica/decodifica video), perchè se facessi partire il medesimo loop in contemporanea ad un processo ben più oneroso, ti accorgeresti che la percentuale di carico del loop rispeto a quest'ultimo si ridurrebbe in maniera vistosa....

Il problema è appunto questo: non puoi prendere come assoluta una valutazione relativa...

----------

## Frez

Quello che stai facendo si chiama "polling".

La mia formazione non informatica mi costinge a spiegazioni da "contadino del pc" (quale sono io  :Smile:  )

In linea di massima, quando sei in attesa di un evento puoi fare due cose:

1. polling, ovvero andare continuamente a vedere se l'evento si sia verificato (magari con un breve intervallo tra un'occhiata e l'altra)

2. farti avvisare quando l'evento si e' verificato.

Normalmente la scelta 2 e' preferibile. Nel tuo caso: se fosse possibile farsi avvisare dal wm quando viene cambiato workspace, il tuo programma potrebbe dormire (e quindi non utilizzare la cpu) ed essere attivato solo quando serve.

In pratica il kernel metterebbe il tuo processo in una wait_queue in attesa dell'evento (ad esempio un semaforo, dati da un socket, un segnale ... )

Nessuno occupa risorse: il tuo processo dorme e il kernel non sta a "pollare" al posto tuo. Semplicemente: quando l'evento si verifica il kernel va a controllare se nella wait_queue associata a quell'evento c'e' qualcuno da "svegliare"  :Smile: 

----------

## HoX

 *Frez wrote:*   

> 1. polling, ovvero andare continuamente a vedere se l'evento si sia verificato (magari con un breve intervallo tra un'occhiata e l'altra)

 

che da quello che ho capito è l'unica cosa che posso fare nel mio bash-script

 *Quote:*   

> 2. farti avvisare quando l'evento si e' verificato.

 

ok... e fin qui ci sono...

 *gioi wrote:*   

> Ciò che i vari cpu meters ti dicono è che sul totale di "cicli operativi" disponibili X sono impiegati da tal processo, Y da un altro e così via...

  il fatto è che top mi dice le cose in base al processo (e il mio processo era intorno al 4% se non ricordo male), ma conky mi dice sul totale della cpu non dei singoli processi... ed è conky che mi segnale il 60% (~5% con sleep 0.2)

----------

## gioi

 *Anema wrote:*   

>  *gioi wrote:*   Ciò che i vari cpu meters ti dicono è che sul totale di "cicli operativi" disponibili X sono impiegati da tal processo, Y da un altro e così via...  il fatto è che top mi dice le cose in base al processo (e il mio processo era intorno al 4% se non ricordo male), ma conky mi dice sul totale della cpu non dei singoli processi... ed è conky che mi segnale il 60% (~5% con sleep 0.2)

 

Conky non ha un "driver" tutto suo per analizzare il carico della cpu, ha uno script di interfaccia a proc (mi sembra, o forse era a sys? ora non ricordo), che va a "leggere" in un dato istante quali sono i processi "attivi" (nel senso che fanno qualcosa) e poi fa una media riportando il processo X ha usato il processore per il x% del tempo, il processo Y per il y% ecc ecc

Rispetto a top che considera anche altri aspetti (tipo il tempo in cui la cpu non è stata utilizzata e così via) fa una media diversa...

In altre parole top dovrebbe dirti PER QUANTO TEMPO la cpu è utilizzata da un dato processo, mentre corky ti dice in IN UN CERTO LASSO DI TEMPO (di solito piccolo, al limite quasi infinitesimale) in che percentuale la cpu è stata utilizzata da un dato processo...

La differenza è abissale... 

E se prendi due processi, uno oneroso che però magari lavora in background per un periodo di tempo discretamente lungo, ed uno breve ma che porta un "picco" dovuto ad esempio ad una ricorsione piuttosto rapida, in top avrai una stima realistica della percentuale di carico del tuo sistema, mentre in corky avrai una statistica distorta, in cui in un determinato istante, sembrerà che il sistema si sia piantato per eseguire il secondo processo e solo dopo abbia ripreso a funzionare correttamente...

----------

## HoX

 *gioi wrote:*   

> In altre parole top dovrebbe dirti PER QUANTO TEMPO la cpu è utilizzata da un dato processo, mentre corky ti dice in IN UN CERTO LASSO DI TEMPO (di solito piccolo, al limite quasi infinitesimale) in che percentuale la cpu è stata utilizzata da un dato processo...
> 
> La differenza è abissale... 

 

uhm... capito... grazie delle info

----------

