我有一个应用程序,每次向它发出请求时都会写出日志。日期和时间信息是指函数的结束时间。通过使用执行时间,我们计算请求开始的时间。

以下是日志当前的样子:

year | month | day | hour | minute | seconds | Thread | UserName           | ExecTime
2014 | 3     | 26  | 8    | 57     | 300     | 1      | file_download      | 33.86
2014 | 3     | 26  | 8    | 57     | 45      | 1      | file_upload        | 0.359
2014 | 3     | 26  | 8    | 57     | 55      | 1      | folder_browse      | 0.234
2014 | 3     | 26  | 8    | 58     | 11      | 1      | sending_email      | 0.14
2014 | 3     | 26  | 8    | 58     | 20      | 1      | browsing_favorites | 0.985
2014 | 3     | 26  | 8    | 58     | 29      | 1      | file_download      | 0.266
2014 | 3     | 26  | 8    | 58     | 33      | 1      | file_upload        | 0.296
2014 | 3     | 26  | 8    | 58     | 37      | 1      | file_zip           | 0.25
2014 | 3     | 26  | 8    | 58     | 41      | 1      | view_properties    | 0.0
2014 | 3     | 26  | 8    | 58     | 46      | 1      | file_download      | 0.187

仅用于说明目的

由于请求可能跨越几分钟甚至几小时,因此很难逐分钟计算每个线程的利用率。以下输出说明了我所追求的输出:
Thread | month | day | hour | minute | % Busy
1      | 3     | 26  | 8    | 57     | 0.5
2      | 3     | 26  | 8    | 57     | 0.1
3      | 3     | 26  | 8    | 57     | 0.9

仅用于说明目的

例如,如果请求在 12:30:30 开始执行并在 12:32:30 结束,则上表将如下所示:
Thread | month | day | hour | minute | % Busy
1      | 3     | 26  | 12   | 29     | 0
1      | 3     | 26  | 12   | 30     | 0.5
1      | 3     | 26  | 12   | 31     | 1
1      | 3     | 26  | 12   | 32     | 0.5
1      | 3     | 26  | 12   | 33     | 0

仅用于说明目的

输出中的分钟数将是可以在日志中找到的第一个请求和最后一个请求之间的分钟数。

更新

以下是来自@TessellatingHeckler 澄清请求的摘要:
  • 计算开始时间
  • 开始/结束部分分钟计算利用率分数。
  • 将中间的分钟数作为 100% 忙碌
  • 在每分钟内添加多个请求/开始-结束重叠。
  • 将缺失的分钟数填入 0% 忙碌。
  • 每个线程显示一个列表,从计算的第一个条目的开始到最后一个条目,显示日期时间到分钟和 %busy

  • 我知道这很难,但我只需要一种可以很好地转化为代码的方法。我很乐意使用 perl、powershell 或 java。

    谢谢

    最佳答案

    类似以下内容将为您完成大部分工作。不过,您必须自己弄清楚 Busy 的实际含义:

    use List::Util qw(sum);
    
    use strict;
    use warnings;
    
    <DATA>; # Skip Header
    
    my %thread;
    while (<DATA>) {
        chomp;
        my @data = split /\s*\|\s*/;
        push @{$thread{$data[6]}}, \@data;
    }
    
    print "Thread | month | day | hour | minute | ExecTime\n";
    for my $id (sort {$a <=> $b} keys %thread) {
        my $time = sum map {$_->[7]} @{$thread{$id}};
        printf "%-6s | %-5s | %-3s | %-4s | %-6s | %.03f\n", $id, @{$thread{$id}[0]}[1,2,3,4], $time;
    }
    
    __DATA__
    year | month | day | hour | minute | seconds | Thread |  ExecTime ( seconds )
    2014 | 3     | 26  | 8    | 57     | 32      | 1      |  33.86
    2014 | 3     | 26  | 8    | 57     | 45      | 2      |  0.359
    2014 | 3     | 26  | 8    | 57     | 55      | 3      |  0.234
    2014 | 3     | 26  | 8    | 58     | 11      | 1      |  0.14
    2014 | 3     | 26  | 8    | 58     | 20      | 2      |  0.985
    2014 | 3     | 26  | 8    | 58     | 29      | 3      |  0.266
    2014 | 3     | 26  | 8    | 58     | 33      | 3      |  0.296
    2014 | 3     | 26  | 8    | 58     | 37      | 1      |  0.25
    2014 | 3     | 26  | 8    | 58     | 41      | 2      |  0.0
    2014 | 3     | 26  | 8    | 58     | 46      | 1      |  0.187
    

    输出:
    Thread | month | day | hour | minute | ExecTime
    1      | 3     | 26  | 8    | 57     | 34.437
    2      | 3     | 26  | 8    | 57     | 1.344
    3      | 3     | 26  | 8    | 57     | 0.796
    

    关于java - 生成线程利用率摘要,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22674892/

    10-10 01:46