如何在Perl中修复高MultiTail CPU消耗?

时间:2011-09-22 06:16:43

标签: perl

我用Perl编写了一个脚本,它基本上是多文件文件(使用Perl库File::MultiTail):在拖尾每行之后它会做很多其他的事情,但这是另一个故事,所以我只是根据这个部分粘贴一个简历导致问题的代码:

    #!/usr/bin/perl
use File::MultiTail;

$path="my/path";
$files="*.log";

sub first{
    $True=0;
    my $file=MultiTail->new(OutputPrefix => 'f',
    Files => ["$path"],
    RemoveDuplicate => $True,
    ScanForFiles => "0");

    while(defined(my $line=$file->read)) {
        print"$line\n";
        $file->update_attribute(Files => ["$path"]);
    }

}

&first();

脚本运行良好:每次出现新的日志行时,它会从多个文件中删除每一行,但我的问题是这个脚本使用100%的CPU,我想知道如何让它不是检查文件在每一秒钟,我可以像睡眠一样延迟10;它确实解放了CPU,但我需要实时查看这些行,我不知道如何解决它。

2 个答案:

答案 0 :(得分:1)

似乎File::MultiTail是一段旧代码(1998):也许它没有以有效的方式进行文件检查,或者随着文件数量的增加而无法很好地扩展。 在while循环中进行尽可能多的I / O检查,看起来浪费了CPU时间。

也许您可以使用更新的模块File::Tail来节省I / O上的CPU周期,因为该模块非常努力地不要“忙等待”

我在考虑这样的事情:

#!/usr/bin/env perl

use 5.012;
use strict;
use File::Tail;

my @logs  = glob '/var/log/*.log';
my @tails = ();

foreach ( @logs ) {
    push @tails, File::Tail->new( $_ );
}

foreach ( @tails ) {
    while ( defined ( my $line = $_->read ) ) {
        say $line;
    }
}

为了知道这个CPU是否比File::MultiTail更加友好,你必须检查CPU时间(真实,用户,系统)。

答案 1 :(得分:1)

我认为answer正是您所寻找的。请参阅usage of select with File::Tail from CPAN