Средняя загрузка за определенное время со всеми программами

Средняя загрузка за определенное время со всеми программами

Я ищу инструмент Linux для проведения некоторых "тестов производительности". У меня есть две (или более версий) программ, которые делают одно и то же. Чтобы сравнить версии друг с другом, я хочу запустить их на определенное время (что-то между 30 с и 5 мин), а затем увидеть их среднюю загрузку в работающей системе за все время (например, моей программе foo требуется около 30% системного времени за 2 мин). Чтобы сделать это удобным способом, было бы неплохо увидеть всю среднюю систему, потому что различные версии состоят не из одной программы с одним идентификатором, а из набора программ. Поэтому, если возможно иметь вывод в файл журнала, то я могу вручную искать программы, которые представляют интерес.

Кто-нибудь знает такую ​​программу и может помочь мне, как с ней работать?

решение1

Статистику по процессу можно найти в

/proc/$PID/stat

Вы можете прочитать документацию, запустив man procпоиск по запросу /proc/[pid]/stat:

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

...

(14) utime %lu Количество времени, на которое этот процесс был запланирован в пользовательском режиме, измеряется в тиках часов (делится на sysconf(_SC_CLK_TCK)). Сюда входит гостевое время, guest_time (время, потраченное на работу виртуального ЦП, см. ниже), так что приложения, не знающие о поле гостевого времени, не теряют это время из своих расчетов.

(15) stime %lu Количество времени, в течение которого этот процесс был запланирован в режиме ядра, измеряемое в тактах (делится на sysconf(_SC_CLK_TCK)).

Примечание:Другие поля могут быть важны, например, если ваш инструмент генерирует много подпроцессов (потомков).

Для примера, есть быстрый perl, выполняющий эту работу, но с фиксированной задержкой в ​​1 секунду:

#!/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;
};

Связанный контент