Preparación
Para calcular el uso de la CPU para un proceso específico, necesitará lo siguiente:
/proc/uptime
#1
tiempo de actividad del sistema (segundos)
/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
- 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.
- En la mayoría de los casos,
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
- 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
}