1

我想创建一个自定义 Apache2 日志处理程序,在 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 请求串行完成的?同时,性能并不重要,但我不希望用户再等一秒钟来添加这样的东西。

4

2 回答 2

3

与其过分担心成本可能是多少,不如尝试一下并找出答案。

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

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

一些可能有帮助的链接。它们可能有点过时,但基本内容是相同的:

不过,请记住,您可以在提供响应后做一些事情。当客户等待响应时,您不必做所有事情。而且,我不会出汗flocks太多。如果您不喜欢它们,还有其他各种方法,包括:

  • 每个孩子写入不同的文件并稍后合并
  • 将消息发送到对消息进行排序的单个进程
  • 写入数据库(单进程思想的更具体示例)
  • 设置自定义日志格式并让 apache 处理它
于 2010-01-24T00:36:45.167 回答
1

我发现羊群是一种必要的邪恶,尤其是在 Solaris 上,即使在负载很重的服务器上,我也没有遇到性能问题。当您处理许多并发请求时,它们是必要的;没有它们,您将获得写在其他日志条目中间的日志条目。布赖恩的变通办法会奏效,但第二个和第三个会引入他们自己的瓶颈,这可能会比羊群更糟。

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

于 2010-06-02T02:13:42.510 回答