GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso ottenere l'utilizzo totale della CPU di un'applicazione da /proc/pid/stat?

Preparazione

Per calcolare l'utilizzo della CPU per un processo specifico avrai bisogno di quanto segue:

  1. /proc/uptime
    • #1 tempo di attività del sistema (secondi)
  2. /proc/[PID]/stat
    • #14 utime - Tempo di CPU speso nel codice utente, misurato in tick di clock
    • #15 stime - Tempo della CPU trascorso nel codice del kernel, misurato in tick di clock
    • #16 cutime - Bambini attesi Tempo di CPU trascorso nel codice utente (in tick di clock )
    • #17 cstime - Bambini attesi Tempo della CPU trascorso nel codice del kernel (in ticchetti di clock )
    • #22 starttime - Ora di inizio del processo, misurata in tick di clock
  3. Hertz (numero di tick di clock al secondo) del tuo sistema.
    • Nella maggior parte dei casi, getconf CLK_TCK può essere utilizzato per restituire il numero di tick dell'orologio.
    • Il sysconf(_SC_CLK_TCK) La chiamata alla funzione C può anche essere usata per restituire il valore in hertz.

Calcolo

Per prima cosa determiniamo il tempo totale impiegato per il processo:

total_time = utime + stime

Dobbiamo anche decidere se vogliamo includere il tempo dei processi figli. Se lo facciamo, allora aggiungiamo questi valori a total_time :

total_time = total_time + cutime + cstime

Quindi otteniamo il tempo totale trascorso in secondi dall'inizio del processo:

seconds = uptime - (starttime / Hertz)

Infine calcoliamo la percentuale di utilizzo della CPU:

cpu_usage = 100 * ((total_time / Hertz) / seconds)

Vedi anche

Top e ps non mostrano lo stesso risultato cpu

Come ottenere l'utilizzo totale della cpu in Linux (c++)

Calcolo dell'utilizzo della CPU di un processo in Linux


Se è necessario calcolare quanta cpu% è stata utilizzata da un processo negli ultimi 10 secondi

  1. gettotal_time (13+14) in jiffies => t1starttime(22) in jiffies => s1

--delay di 10 secondi

total_time (13+14) in jiffies => t2starttime(22) in jiffies => s2

t2-t1 *100 / s2 - s1 non darebbe % ??


Sì, puoi dirlo. Puoi convertire questi valori in secondi usando la formula:

      sec = jiffies / HZ ; here - HZ = number of ticks per second

Il valore HZ è configurabile - fatto al momento della configurazione del kernel.


Ecco la mia semplice soluzione scritta in BASH . È un monitor di sistema linux/unix e un gestore di processi tramite procfs, come "top " o "ps ". Esistono due versioni semplice monocromatica (veloce) e colorata (un po' lenta, ma utile soprattutto per monitorare lo stato dei processi). Ho fatto l'ordinamento in base all'utilizzo della CPU.

https://github.com/AraKhachatryan/top

  • utime , tempo , cutime , cstime , ora di inizio utilizzato per ottenere l'utilizzo della CPU e ottenuto da /proc/[pid]/stat file.

  • stato , ppid , priorità , bello , num_thread parametri ottenuti anche da /proc/[pid]/stat file.

  • residente e data_and_stack parametri utilizzati per ottenere l'utilizzo della memoria e ottenuto da /proc/[pid]/statm file.


    function my_ps
    {
        pid_array=`ls /proc | grep -E '^[0-9]+$'`
        clock_ticks=$(getconf CLK_TCK)
        total_memory=$( grep -Po '(?<=MemTotal:\s{8})(\d+)' /proc/meminfo )

        cat /dev/null > .data.ps

        for pid in $pid_array
        do
            if [ -r /proc/$pid/stat ]
            then
                stat_array=( `sed -E 's/(\([^\s)]+)\s([^)]+\))/\1_\2/g' /proc/$pid/stat` )
                uptime_array=( `cat /proc/uptime` )
                statm_array=( `cat /proc/$pid/statm` )
                comm=( `grep -Po '^[^\s\/]+' /proc/$pid/comm` )
                user_id=$( grep -Po '(?<=Uid:\s)(\d+)' /proc/$pid/status )

                user=$( id -nu $user_id )
                uptime=${uptime_array[0]}

                state=${stat_array[2]}
                ppid=${stat_array[3]}
                priority=${stat_array[17]}
                nice=${stat_array[18]}

                utime=${stat_array[13]}
                stime=${stat_array[14]}
                cutime=${stat_array[15]}
                cstime=${stat_array[16]}
                num_threads=${stat_array[19]}
                starttime=${stat_array[21]}

                total_time=$(( $utime + $stime ))
                #add $cstime - CPU time spent in user and kernel code ( can olso add $cutime - CPU time spent in user code )
                total_time=$(( $total_time + $cstime ))
                seconds=$( awk 'BEGIN {print ( '$uptime' - ('$starttime' / '$clock_ticks') )}' )
                cpu_usage=$( awk 'BEGIN {print ( 100 * (('$total_time' / '$clock_ticks') / '$seconds') )}' )

                resident=${statm_array[1]}
                data_and_stack=${statm_array[5]}
                memory_usage=$( awk 'BEGIN {print( (('$resident' + '$data_and_stack' ) * 100) / '$total_memory'  )}' )

                printf "%-6d %-6d %-10s %-4d %-5d %-4s %-4u %-7.2f %-7.2f %-18s\n" $pid $ppid $user $priority $nice $state $num_threads $memory_usage $cpu_usage $comm >> .data.ps

            fi
        done

        clear
        printf "\e[30;107m%-6s %-6s %-10s %-4s %-3s %-6s %-4s %-7s %-7s %-18s\e[0m\n" "PID" "PPID" "USER" "PR" "NI" "STATE" "THR" "%MEM" "%CPU" "COMMAND"
        sort -nr -k9 .data.ps | head -$1
        read_options
    }


Linux
  1. In che modo Linux gestisce più separatori di percorsi consecutivi (/home////nomeutente///file)?

  2. Linux:ottenere informazioni sull'utilizzo della memoria di un processo da /proc/pid/smaps?

  3. Come limitare l'utilizzo della CPU su un pool di applicazioni in IIS

  4. Come ottenere l'utilizzo totale della CPU in Linux usando C++

  5. Come ottenere l'ID del processo per terminare un processo nohup?

Come visualizzare l'utilizzo della CPU dalla riga di comando

Come ottenere l'utilizzo della CPU di un singolo processo in Linux

Comprendere i file /proc/mounts, /etc/mtab e /proc/partitions

Come ottenere l'utilizzo della CPU

Come scoprire da quale cartella è in esecuzione un processo?

In che modo il tempo della CPU e l'utilizzo della CPU sono uguali?