java - 生成线程利用率摘要

标签 java perl powershell

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

这是日志当前的样子:

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 澄清请求的摘要:

  1. 计算开始时间
  2. 为开始/结束部分分钟计算利用率。
  3. 计算中间的分钟数为 100% 忙
  4. 在每分钟内添加多个请求/开始-结束重叠。
  5. 将缺失的分钟数填写为 0% 忙。
  6. 为每个线程显示一个列表,从第一个条目的计算开始到最后一个条目,显示日期时间到分钟和 %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/

相关文章:

linux - 查找仅在特定子程序中搜索模式

powershell - 我可以使用系统帐户调用Invoke-RestMethod吗?

java - 序列化和子类

perl - 什么时候应该使用 & 来调用 Perl 子例程?

java - Eclipse(ZIP 发行版)SWT 链接错误

perl - 在 Perl 中重载 '='

powershell - Powershell命令行抛出

xml - 如何让 Powershell 更快地解析 XML 或进一步优化我的脚本?

java - 如何正确使用synchronized?

Java 9 HttpClient 挂起