Perl - 比较停机时间

时间:2012-07-01 20:09:09

标签: arrays perl

想知道是否有人处理了这类问题并提出了任何建议:

我正在解析日志文件以查看主机是否/何时出现故障以及它们的总停机时间是多少。我的问题是我不知道如何确定主机是否属于另一个堕落主机的时间范围内(我不想算两次)

示例:

主持人A降至14:15-14:18

主持人B降至14:16-14:21

主持人C降至14:17-14:20

这会导致

主机A占3分钟的停机时间

主持人B持续3分钟

主机C为0(其他主机当时已关闭)

现在,我正在推动一个数组upTime:downTime - 我认为一个数组最容易通过并进行比较。不知道解决这个问题的最佳方法是什么..

                push(@arr, "$tempdown:$upTime"); 
        }
    }
}   
}


#temp vars x and y rep downtime and uptime
#count from x..y and see if any other service has fallen within x-y
for my $index (@arr) {
my $tempx;
my $tempy;
if ($index=~/(.*):/ && /($index=~(.*:(.*)/) {
    $tempx = $1;
    $tempy = $2;
}
for ($tempx..$tempy) {
.
.
.

2 个答案:

答案 0 :(得分:1)

在我看来,您希望将您的数据组织为:

  • T s - 一段停机时间的开始时间。
  • T e - 停机时间的结束时间。
  • H t - 主持人'负责'一段停机时间。

您将能够按照T s 的顺序对停机时间段进行排序。您需要一种机制来解决两台(或多台)机器同时启动一段停机时间的关系(根据记录时间的分辨率)。再往下,我建议二级密钥是最新的T e ,然后三级密钥按主机名字母。

然后,您可以通过T s 逐步查看停机时间段的有序列表。

对于每个停机时间段:

  • H t 在整个失败期间受到指责。
  • 对于在T e 之前开始的每个停机时间段:
    • 从其他主机的停机时间中减去周期T s .. T e
  • 为下一次迭代重新排序数据。

根据您的样本数据,我们得到:

  • T s = 14:15,T e = 14:18,H t = A
  • T s = 14:16,T e = 14:21,H t = B
  • T s = 14:17,T e = 14:20,H t = C

这是按正确的排序顺序。我们假设同时具有停机时间的主机按字母顺序排序。

算法选择A:

  • 主持人A被指责为14:15-14:18(3分钟)。

调整其他主机的周期:

  • T s = 14:18,T e = 14:21,H t = B
  • T s = 14:18,T e = 14:20,H t = C

算法现在选择B

  • 主持人B被指责为14:18-14:21(3分钟)。

调整其他主机的周期,并删除主机C的记录,因为剩余的时间完全由主机B的停机时间覆盖。

你可以看到决胜局排序非常重要;在第二次迭代中,系统B和C都已关闭,并且必须有一种方法来确定一旦A恢复,哪个是造成停机时间的原因。您可能会认为其中一个标准是“哪个主机最初首先出现故障”,因此您保留了服务器关闭的初始时间T d 的记录。这在算法期间不会改变,但随着算法的进展调整T s 。您可能还会认为订购的一部分是“最新的T e ”,这样在任何给定时间停机时间最长的机器都会因停电而导致停机,并且没有系统早些时候还是下来了。这意味着如果A也从14:19-14:30下降,它将不会得到14:18-14:21的责任,但它将是14:21-14:30。

答案 1 :(得分:1)

当只有小时:分钟而不是像YYYY-MM-DD HH:MM这样的时候,代码很棘手。这可以毫不含糊地解析。如果您可以更改记录器输出以提供完全限定日期,则可以使您的工作更加简单。下面的代码会这样做。 (免责声明:开始时间必须按时间顺序排列,首先需要对它们进行排序。)

(注意:对于这些数据,我将时间分隔符从' - '更改为'\ t')

#!/usr/bin/perl
use strict;
use warnings;
use DateTime::Format::Strptime;

my $re = '(\S{10}\s\S{5})\t(\S{10}\s\S{5})$';
my $max;
my $parser = DateTime::Format::Strptime->new(pattern => '%F %H:%M');

while (<DATA>) {
    chomp;
    my ($start, $stop) = /$re/ or die $!;

    $_ = $parser->parse_datetime($_) for $start, $stop;

    # one time initialization of $max for first record
    $max //= $start;

    # when there are breaks in the continuity
    $max = $start if $max < $start;

    my $minutes = $stop <= $max ? 0 : $max->delta_ms($stop)->in_units('minutes');

    printf "$_ %2d minutes\n", $minutes;
    $max = $stop if $max < $stop; # stop is the new max if stop > max
}

__DATA__
Host A fails at 2012-07-03 14:15    2012-07-03 14:18
Host B fails at 2012-07-03 14:16    2012-07-03 14:21
Host C fails at 2012-07-03 14:17    2012-07-03 14:20
Host D fails at 2012-07-03 23:57    2012-07-04 00:05
Host E fails at 2012-07-03 23:58    2012-07-04 00:07
Host F fails at 2012-07-04 00:00    2012-07-04 00:08
Host G fails at 2012-07-04 00:01    2012-07-04 00:09
Host H fails at 2012-07-04 00:02    2012-07-04 00:08
Host I fails at 2012-07-04 14:17    2012-07-04 14:20
Host J fails at 2012-07-04 23:57    2012-07-04 23:59
Host K fails at 2012-07-05 00:00    2012-07-05 00:10
Host L fails at 2012-07-05 00:02    2012-07-05 00:09
Host M fails at 2012-07-05 00:02    2012-07-05 00:11
Host N fails at 2012-07-05 00:02    2012-07-05 00:10

它产生了以下输出:

Host A fails at 2012-07-03 14:15        2012-07-03 14:18  3 minutes
Host B fails at 2012-07-03 14:16        2012-07-03 14:21  3 minutes
Host C fails at 2012-07-03 14:17        2012-07-03 14:20  0 minutes
Host D fails at 2012-07-03 23:57        2012-07-04 00:05  8 minutes
Host E fails at 2012-07-03 23:58        2012-07-04 00:07  2 minutes
Host F fails at 2012-07-04 00:00        2012-07-04 00:08  1 minutes
Host G fails at 2012-07-04 00:01        2012-07-04 00:09  1 minutes
Host H fails at 2012-07-04 00:02        2012-07-04 00:08  0 minutes
Host I fails at 2012-07-04 14:17        2012-07-04 14:20  3 minutes
Host J fails at 2012-07-04 23:57        2012-07-04 23:59  2 minutes
Host K fails at 2012-07-05 00:00        2012-07-05 00:10 10 minutes
Host L fails at 2012-07-05 00:02        2012-07-05 00:09  0 minutes
Host M fails at 2012-07-05 00:02        2012-07-05 00:11  1 minutes
Host N fails at 2012-07-05 00:02        2012-07-05 00:10  0 minutes

希望这有帮助,

克里斯