Durchschnittliche Auslastung für einen bestimmten Zeitraum mit allen Programmen

Durchschnittliche Auslastung für einen bestimmten Zeitraum mit allen Programmen

Ich suche nach einem Linux-Tool, um einige „Leistungstests“ durchzuführen. Ich habe zwei (oder mehr Versionen) von Programmen, die dasselbe tun. Um die Versionen miteinander zu vergleichen, möchte ich diese für eine bestimmte Zeit (irgendwas zwischen 30 s und 5 min) laufen lassen und dann ihre durchschnittliche Auslastung im laufenden System für die gesamte Zeit sehen (z. B. benötigt mein Programm foo in 2 min etwa 30 % der Systemzeit). Um dies auf bequeme Weise tun zu können, wäre es schön, das gesamte durchschnittliche System zu sehen, da die verschiedenen Versionen nicht aus einem Programm mit einer ID bestehen, sondern aus einer Sammlung von Programmen. Wenn also eine Ausgabe in eine Protokolldatei möglich ist, kann ich manuell nach Programmen suchen, die interessant sind.

Kennt jemand ein solches Programm und kann mir bei der Arbeit damit helfen?

Antwort1

Stat nach Prozess finden Sie in

/proc/$PID/stat

Sie können die Dokumentation lesen man proc, indem Sie Folgendes ausführen und nach Folgendem suchen /proc/[pid]/stat:

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

...

(14) utime %lu Zeit, die dieser Prozess im Benutzermodus verbringt, gemessen in Taktimpulsen (dividieren durch sysconf(_SC_CLK_TCK)). Dies schließt die Gastzeit und die Gastzeit (Zeit, die für den Betrieb einer virtuellen CPU aufgewendet wurde, siehe unten) ein, damit Anwendungen, die das Gastzeitfeld nicht kennen, diese Zeit bei ihren Berechnungen nicht verlieren.

(15) stime %lu Zeitdauer, die dieser Prozess im Kernelmodus eingeplant war, gemessen in Taktraten (dividieren durch sysconf(_SC_CLK_TCK)).

Kein:Die anderen Felder könnten wichtig sein, beispielsweise wenn Ihr Tool viele Unterprozesse (untergeordnete Prozesse) generiert.

Als Beispiel gibt es ein schnelles Perl, das diese Aufgabe erledigt, allerdings mit einer festen Verzögerung von 1 Sekunde:

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

verwandte Informationen