我正在编写一个处理大量日志条目的Perl程序。为了加快速度,我使用MCE创建了许多工作进程来并行处理处理。到目前为止事情很好,但我发现自己以非常不科学的方式尝试不同的块大小。在我提出问题之前,这里有一些背景知识。
我们从多个系统日志源接收日志并在中心位置收集日志。中央syslog服务器将这些日志条目写入单个文本文件。有问题的程序从这个文本文件中获取日志,进行一些修改,并将它们发送到其他地方。然后存档原始日志文件。
要阅读我执行此操作的日志文件:
my $tail = 'tail -q -F '.$logdir.$logFile;
open my $tail_fh, "-|", $tail or die "Can't open tail\n";
然后我使用mce_loop_f迭代文件句柄:
mce_loop_f { my $hr = process($_); MCE->gather($hr); } $tail_fh;
这在大多数情况下运行良好,但如果日志活动出现峰值,则程序开始陷入困境。虽然有许多因素可以使事情变得更快而且更快。其中一个我不太确定的因素是MCE中的chunk_size。
我知道chunk_size有一个" auto"值,但是如何处理从尾部管道的文件句柄?自动适合这里吗?
调整chunk_size时我应该考虑哪些因素?日志条目的发生速度为每秒1000-2000个事件,具体取决于一天中的时间(晚上1000个,白天2000个)。
对于MCE,我也是新手,所以如果mce_loop_f对于这个用例不好,请告诉我。