terminale ottenere l'uso massimo delle cpu in periodo

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
giorgiofoga
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 367
Iscrizione: domenica 3 ottobre 2010, 22:04
Desktop: unity - gnome fa lo stess
Distribuzione: dalla 10.04 alla 18.04 RT comprese
Località: padova

terminale ottenere l'uso massimo delle cpu in periodo

Messaggio da giorgiofoga »

ciao a tutti,
per la mia app a scopo di debug, ho inserito una finestrelle dove stampare il valore dell'uso in percentuale in un intervallo di tempo di 60ms .... ogni 5 sec controllo il valore e lo aggiorno .... per capire se le operazioni della mia app stanno avendo un impatto negativo sulle cpu, o se ho nel frattempo caricato altri programmi "esosi" .... di base uso un comando da terminale con awk e leggo il file /proc/stat (di awk non sono per nulla esperto) ...

Codice: Seleziona tutto

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1); }' <(grep 'cpu ' /proc/stat) <(sleep 0.06;grep 'cpu ' /proc/stat)
effettivamante posso ottenere un numero che però non corrisponde all'uso medio dei processori (in questo caso 4) ..... se provo a mettere i processori al 100% .... a volte ottengo 10,xxx a volte 32,xxx .... ok che non serve sia preciso .... ma se ho 3 processori al 100% e uno al 30% mi aspetto di ottenere un 90% circa .... (i dati li confronto son gnome-system-monitor).

per altro usando ps (che non conosco come sopra) ....

Codice: Seleziona tutto

ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
ottengo valori del 42% con le cpu tutte a 2% .....

Se gentilmente qualcuno mi può spiegare lo sbaglio ... ringrazio
giorgiofoga -- gfx -- btk

Codice: Seleziona tutto

  *****sudo apt-get install  bleachDeiNirvana *****  
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8224
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: terminale ottenere l'uso massimo delle cpu in periodo

Messaggio da crap0101 »

premettendo che i vari tool che fanno sti monitoraggi non danno quasi mai gli stessi identici risultati (per diversi motivi: arrotondamenti, considerare o ignorare alcuni dati (pur magari non particolarmente significativi), ecc ecc) certo che un minimo di consistenza ce lo si aspetta. Nota che lo stesso `ps` da qualche parte nel man dice che - con alcuni parametri - difficilmente si arriverà mai a vedere il valore della cpu al 100% (anche quando magari lo è) e , sempre `ps` dà risultati decisamente diversi in base alle opzioni usate. Poi, per dire, top ogni tanto mi segna la cpu al 104% :-D .
A parte questo, mi viene da pensare che il problema principale di quel comando sia lo sleep molto ridotto, che potrebbe falsare i calcoli e farti ottenere quei valori esagerati. Facendo qualche prova:

Codice: Seleziona tutto

crap0101@orange:~/test$ bash /tmp/cputest.sh
ps ...: 37.0
ps S ...: 64.4
sleep 0.06: 32.1429
***** cpuinfo.awk:
cpu:     20.71%
cpu0:    12.50%
cpu1:    38.00%
cpu2:    12.50%
cpu3:    17.65%
*********
sleep 0.6: 19.8312
crap0101@orange:~/test$ bash /tmp/cputest.sh
ps S ...: 64.4
ps ...: 37.0
sleep 0.06: 31.0345
***** cpuinfo.awk:
cpu:     16.67%
cpu0:    14.58%
cpu1:    20.41%
cpu2:    14.00%
cpu3:    18.37%
*********
sleep 0.6: 17.1548
codice generato da questo test script

Codice: Seleziona tutto

crap0101@orange:~/test$ cat /tmp/cputest.sh
#!/bin/bash

(printf "sleep 0.6: %s\n" $(awk '{
    u=$2+$4
    t=$2+$4+$5
    if (NR==1) {
        u1=u
        t1=t
    } else {
        print(($2+$4-u1) * 100 / (t-t1))
    }
}' <(grep 'cpu ' /proc/stat) <(sleep 0.6;grep 'cpu ' /proc/stat)) ) &

(printf "sleep 0.06: %s\n" $(awk '{
    u=$2+$4
    t=$2+$4+$5
    if (NR==1) {
        u1=u
        t1=t
    }
    else {
        print ($2+$4-u1) * 100 / (t-t1)
    }
}' <(grep 'cpu ' /proc/stat) <(sleep 0.06;grep 'cpu ' /proc/stat)) ) &

(printf "ps ...: %s\n" $(ps -A -o pcpu | tail -n+2 | paste -sd+ | bc) ) &

(printf "ps S ...: %s\n" $(ps S -A -o pcpu | tail -n+2 | paste -sd+ | bc) ) &

(printf "***** cpuinfo.awk:\n%s\n" "$(awk -v iter=1 -f /home/crap0101/test/cpuinfo.awk)" ) &

wait
decommenta l'ultimo printf o altrimenti scarica il file in questione da qui
Mentre facevo qualche prova ne ho buttata giù anche una versione (iniziale) in python, nel caso interessasse.

p.s. (non ps :-D): con quei due script linkati, dalle prove fatte, ottengo risultati abbastanza in sintonia con quelli che mi restituisce `htop` (e al momento, sotto carico, non sforano il 100% :-D). Ho usato qualche valore diverso dai tuoi, ma in definitiva nulla di così influente.

p.p.s.
invece del tail puoi usare l'opzione --no-header di ps
...e anche meglio, farlo diventare:

Codice: Seleziona tutto

ps h -Ao pcpu | awk '{t+=$1} END {print t}'
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2728
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: terminale ottenere l'uso massimo delle cpu in periodo

Messaggio da DoctorStrange »

Secondo me, una lettura ogni 60 millisecondi, è lei stessa che incide (negativamente) sulle performance dei core. Mi sembra un intervallo eccessivamente ravvicinato, considerando soprattutto che lo script ti serve solo a scopo di diagnosi generica.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 9 ospiti