如何确定PerlLogHandler性能影响?

时间:2010-01-23 21:57:27

标签: performance perl apache2 mod-perl2

我想创建一个自定义的Apache2日志handler,在apache网站上找到的模板是:

#file:MyApache2/LogPerUser.pm
#---------------------------
package MyApache2::LogPerUser;

use strict;
use warnings;

use Apache2::RequestRec ();
use Apache2::Connection ();

use Fcntl qw(:flock);
use File::Spec::Functions qw(catfile);

use Apache2::Const -compile => qw(OK DECLINED);

sub handler {
  my $r = shift;

  my ($username) = $r->uri =~ m|^/~([^/]+)|;
  return Apache2::Const::DECLINED unless defined $username;

  my $entry = sprintf qq(%s [%s] "%s" %d %d\n),
      $r->connection->remote_ip, scalar(localtime),
      $r->uri, $r->status, $r->bytes_sent;

  my $log_path = catfile Apache2::ServerUtil::server_root,
      "logs", "$username.log";
  open my $fh, ">>$log_path" or die "can't open $log_path: $!";
  flock $fh, LOCK_EX;
  print $fh $entry;
  close $fh;

  return Apache2::Const::OK;
}
1;

鸡群的性能成本是多少?此日志记录过程是并行完成的,还是与HTTP请求串行完成的?与此同时,性能并不重要,但我不希望用户再等一下来添加类似的内容。

2 个答案:

答案 0 :(得分:3)

不要过分担心成本可能是多少,而是试一试并找出答案。

首先,使用ab或您最喜欢的网络服务器酷刑测试程序对您当前的配置进行基准测试。许多人忘记了这第一步。

接下来,实施您的更改,然后重试。比较结果。

一些可能有用的链接。它们可能有点过时,但基础是相同的:

但请记住,在您提供回复后,您可以执行某些操作。在客户端等待响应时,您不必执行所有操作。而且,我不会为flocks过多的汗水。如果你不喜欢它们,还有其他各种方法,包括:

  • 每个孩子写一个不同的文件并稍后合并
  • 将消息发送到对消息进行排序的单个进程
  • 写入数据库(单个过程理念的更具体示例)
  • 设置自定义日志格式并让apache处理它

答案 1 :(得分:1)

我发现鸡群是必要的恶魔,特别是在Solaris上,即使在负载很重的服务器上也没有性能问题。当你处理许多并发请求时,它们是必需的;如果没有它们,您将获得在其他日志条目中间写入的日志条目。布莱恩的解决方案可行,但第二和第三会引入他们自己的瓶颈,这可能比鸡群更糟糕。

顺便说一下,日志处理程序在发送请求后运行,因此如果日志处理程序暂时停止,则对用户没有性能影响。在服务器过载之前,对ab的输出也不会产生明显的影响,这将使得很难区分出鸡群的影响。在ab测试运行时,您必须观察一些磁盘IO指标,看看是否存在问题。