所有程式特定時間的平均負載

所有程式特定時間的平均負載

我正在尋找一個 Linux 工具來進行一些「效能測試」。我有兩個(或更多版本)的程式具有相同的功能。為了相互比較版本,我想在特定的時間(30 秒到5 分鐘之間)運行它們,然後查看它們在運行系統中的整個時間的平均負載(例如,我的程式foo 在2 分鐘內需要大約30 % 的系統)時間)。為了以一種舒適的方式做到這一點,最好能看到整個普通系統,因為各種版本不是由具有一個 ID 的一個程式組成,而是由一組程式組成。因此,如果可以將輸出寫入日誌文件,那麼我可以手動搜尋感興趣的程式。

有誰知道這樣的程式並且可以幫助我如何使用它?

答案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(運行虛擬 CPU 所花費的時間,請參見下文),以便不知道來賓時間欄位的應用程式不會在計算中遺失該時間。

(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;
};

相關內容