【问题标题】:How can I determine PerlLogHandler performance impact?如何确定 PerlLogHandler 性能影响?
【发布时间】:2011-01-08 15:44:24
【问题描述】:

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

【问题讨论】:

    标签: performance perl apache2 mod-perl2


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 1970-01-01
        • 2018-11-16
        • 2012-01-11
        • 2015-05-29
        相关资源
        最近更新 更多