Carga promedio por tiempo específico con todos los programas.

Carga promedio por tiempo específico con todos los programas.

Estoy buscando una herramienta de Linux para realizar algunas "pruebas de rendimiento". Tengo dos (o más versiones) de programas que hacen lo mismo. Para comparar versiones entre sí, quiero ejecutarlas durante un tiempo específico (algo entre 30 segundos y 5 minutos) y luego ver su carga promedio en el sistema en ejecución durante todo el tiempo (por ejemplo, mi programa foo necesita en 2 minutos aproximadamente el 30% del sistema). tiempo). Para hacer esto de una manera cómoda, sería bueno ver el sistema promedio completo, porque las distintas versiones no constan de un programa con una ID en lugar de una colección de programas. Entonces, si es posible tener una salida en un archivo de registro, entonces puedo buscar manualmente programas que sean interesantes.

¿Alguien conoce un programa de este tipo y puede ayudarme a trabajar con él?

Respuesta1

Las estadísticas por proceso se pueden encontrar en

/proc/$PID/stat

Puede leer la documentación ejecutando man procy buscando /proc/[pid]/stat:

man -P'less +/\\\/proc\\\/\\\[pid\\\]\\\/stat' proc

...

(14) utime %lu Cantidad de tiempo que este proceso ha sido programado en modo usuario, medido en ticks de reloj (dividido por sysconf(_SC_CLK_TCK)). Esto incluye el tiempo de invitado, guest_time (tiempo dedicado a ejecutar una CPU virtual, ver más abajo), de modo que las aplicaciones que no conocen el campo de tiempo de invitado no pierdan ese tiempo en sus cálculos.

(15) stime %lu Cantidad de tiempo que este proceso ha sido programado en modo kernel, medido en ticks de reloj (dividido por sysconf(_SC_CLK_TCK)).

No un:Los otros campos podrían ser importantes, por ejemplo, si su herramienta genera muchos subprocesos (hijos).

Por ejemplo, hay un Perl rápido que hace este trabajo, pero con un retraso fijo de 1 segundo:

#!/usr/bin/perl -w

my ( $lut, $lst ) = ( 0, 0 );
my $pid = $ARGV[0] or die "No pid";

open FH, "</proc/$pid/stat" or die "Can't open \`\`/proc/$pid/stat''";
open UT, "</proc/uptime"    or die "Can't open \`\`/proc/uptime''";

sub getvals {
    seek FH, 0, 0;
    seek UT, 0, 0;
    my $st  = <FH>;
    my $ut  = <UT>;
    my $out = $lut;
    my $ost = $lst;
    $lut = ( split " ", $ut )[0] * 100;
    $lst = eval( join( "+", ( split " ", $st )[ 13, 14 ] ) );
    return $lut - $out, $lst - $ost;
}
getvals;
$| = 1;
while (1) {
    sleep 1;
    printf "%7.2f%%\n", eval sprintf "100/%s*%s", getvals;
};

información relacionada