GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtengo el uso total de CPU de una aplicación de /proc/pid/stat?

Preparación

Para calcular el uso de la CPU para un proceso específico, necesitará lo siguiente:

  1. /proc/uptime
    • #1 tiempo de actividad del sistema (segundos)
  2. /proc/[PID]/stat
    • #14 utime - Tiempo de CPU dedicado al código de usuario, medido en ticks de reloj
    • #15 stime - Tiempo de CPU invertido en el código del kernel, medido en marcas de reloj
    • #16 cutime - Esperado para niños Tiempo de CPU invertido en el código de usuario (en marcas de reloj )
    • #17 cstime - Esperado para niños Tiempo de CPU invertido en el código del kernel (en marcas de reloj )
    • #22 starttime - Hora en que comenzó el proceso, medida en ticks de reloj
  3. Hertz (número de tics de reloj por segundo) de su sistema.
    • En la mayoría de los casos, getconf CLK_TCK se puede utilizar para devolver el número de tics de reloj.
    • El sysconf(_SC_CLK_TCK) La llamada a la función C también se puede usar para devolver el valor en hercios.

Cálculo

Primero determinamos el tiempo total empleado en el proceso:

total_time = utime + stime

También tenemos que decidir si queremos incluir el tiempo de los procesos secundarios. Si lo hacemos, agregamos esos valores a total_time :

total_time = total_time + cutime + cstime

A continuación, obtenemos el tiempo total transcurrido en segundos desde que comenzó el proceso:

seconds = uptime - (starttime / Hertz)

Finalmente calculamos el porcentaje de uso de CPU:

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

Véase también

Top y ps no muestran el mismo resultado de cpu

Cómo obtener el uso total de la CPU en Linux (c++)

Cálculo del uso de CPU de un proceso en Linux


Si necesita calcular cuánto% de CPU usó un proceso en los últimos 10 segundos

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

--retraso de 10 segundos

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

t2-t1 *100 / s2 - s1 no daría el % ??


Sí, puedes decirlo. Puede convertir esos valores en segundos usando la fórmula:

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

El valor HZ es configurable; se realiza en el momento de la configuración del kernel.


Aquí está mi solución simple escrita en BASH . Es un monitor de sistema linux/unix y administrador de procesos a través de procfs, como "arriba " o "ps ". Hay dos versiones monocromática simple (rápida) y una versión en color (un poco lenta, pero útil especialmente para monitorear el estado de los procesos). Hice una clasificación por uso de CPU.

https://github.com/AraKhachatryan/top

  • utime , tiempo , tiempo lindo , cstime , hora de inicio utilizado para obtener uso de la CPU y obtenido de /proc/[pid]/stat archivo.

  • estado , ppid , prioridad , agradable , num_threads parámetros obtenidos también de /proc/[pid]/stat archivo.

  • residente y datos_y_pila parámetros utilizados para obtener uso de memoria y obtenido de /proc/[pid]/statm archivo.


    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. ¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

  2. Linux:¿en qué se diferencia el enlace simbólico /proc//exe de los enlaces simbólicos ordinarios?

  3. Linux:¿cómo probar si un dispositivo de bloque es de solo lectura desde/sys o/proc?

  4. Cómo limitar el uso de la CPU en un grupo de aplicaciones en IIS

  5. ¿Cómo obtener la cantidad de CPU/núcleos en Linux desde la línea de comandos?

Cómo mostrar el uso de la CPU desde la línea de comandos

Cómo obtener el uso de la CPU de un solo proceso en Linux

Comprender los archivos /proc/mounts, /etc/mtab y /proc/partitions

¿Cómo obtengo mi dirección IP desde la línea de comandos?

¿Cómo comprobar si stdin es/dev/null desde el shell?

¿En qué se parecen el tiempo de CPU y el uso de CPU?