Carregue a média para o tempo específico com todos os programas

0

Estou procurando uma ferramenta do Linux para fazer alguns "testes de desempenho". Eu tenho duas (ou mais versões) de programas que fazem o mesmo. Para comparar as versões umas com as outras, quero executá-las por um tempo específico (algo entre 30s e 5m) e depois ver sua média de carga no sistema em execução o tempo todo (por exemplo, meu programm foo precisa em cerca de 30% do sistema Tempo). Para fazer isso de uma maneira confortável, seria bom ver todo o sistema médio, porque as várias versões não consistem em um programa com um ID em vez de uma coleção de programas. Então, se é possível ter uma saída em um arquivo de log, posso procurar manualmente por programas que sejam interessantes.

Alguém conhece esse programa e pode me ajudar a trabalhar com ele?

    
por alabamajack 25.09.2016 / 13:16

1 resposta

0

Stat por processo pode ser encontrado em

/proc/$PID/stat

Você pode ler a documentação executando man proc , pesquisar por /proc/[pid]/stat :

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

...

(14) utime %lu Amount of time that this process has been scheduled in user mode, measured in clock ticks (divide by sysconf(_SC_CLK_TCK)). This includes guest time, guest_time (time spent running a virtual CPU, see below), so that applications that are not aware of the guest time field do not lose that time from their calculations.

(15) stime %lu Amount of time that this process has been scheduled in kernel mode, measured in clock ticks (divide by sysconf(_SC_CLK_TCK)).

Nota: Os outros campos podem ser importantes, por exemplo, se sua ferramenta gerar muitos subprocessos (filhos).

Por exemplo, há um perl rápido fazendo esse trabalho, mas com um atraso fixo 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;
};
    
por 25.09.2016 / 13:47