所有程序特定时间的平均负载

所有程序特定时间的平均负载

我正在寻找一个 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;
};

相关内容