すべてのプログラムでの特定の時間の負荷平均

すべてのプログラムでの特定の時間の負荷平均

私は「パフォーマンス テスト」を行う Linux ツールを探しています。同じことを行う 2 つの (またはそれ以上のバージョンの) プログラムがあります。バージョン同士を比較するには、これらを特定の時間 (30 秒から 5 分の間) 実行し、実行中のシステムで全体の負荷平均を確認します (たとえば、私のプログラム foo は 2 分間にシステム時間の約 30% を必要とします)。これを快適に行うには、平均システム全体を確認できると便利です。さまざまなバージョンは、プログラムのコレクションではなく、1 つの ID を持つ 1 つのプログラムで構成されているためです。したがって、ログ ファイルに出力できる場合は、興味のあるプログラムを手動で検索できます。

誰かそのようなプログラムを知っていて、その使い方を教えてもらえませんか?

答え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;
};

関連情報