Média de carga para um horário específico com todos os programas

Média de carga para um horário específico com todos os programas

Estou procurando uma ferramenta Linux para fazer alguns "testes de desempenho". Tenho duas (ou mais versões) de programas que fazem o mesmo. Para comparar as versões entre si, quero executá-las por um tempo específico (algo entre 30s e 5m) e depois ver a média de carga no sistema em execução durante todo o tempo (por exemplo, meu programa foo precisa em 2min cerca de 30% do sistema tempo). Para fazer isto de uma forma confortável seria bom ver todo o sistema médio, porque as várias versões não consistem num programa com um ID em vez de uma colecção de programas. Portanto, se for possível obter uma saída em um arquivo de log, posso pesquisar manualmente programas que sejam interessantes.

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

Responder1

Estatística por processo pode ser encontrada em

/proc/$PID/stat

Você pode ler a documentação executando man proce pesquisando /proc/[pid]/stat:

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

...

(14) utime %lu Quantidade de tempo que este processo foi agendado no modo usuário, medido em ticks de clock (dividido por sysconf(_SC_CLK_TCK)). Isso inclui o tempo de convidado, guest_time (tempo gasto na execução de uma CPU virtual, veja abaixo), para que os aplicativos que não conhecem o campo de tempo de convidado não percam esse tempo em seus cálculos.

(15) stime %lu Quantidade de tempo que este processo foi agendado no modo kernel, medido em ticks de clock (dividido por sysconf(_SC_CLK_TCK)).

Nota:Os demais campos podem ser importantes, por exemplo, caso sua ferramenta gere muitos subprocessos (filhos).

Por exemplo, existe 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;
};

informação relacionada