Как определить влияние на производительность PerlLogHandler? - PullRequest
1 голос
/ 24 января 2010

Я хочу создать собственный обработчик журнала 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-запросом? Параллельно производительность не будет иметь большого значения, но я бы не хотел, чтобы пользователь ждал еще доли секунды, чтобы добавить что-то вроде этого.

Ответы [ 2 ]

3 голосов
/ 24 января 2010

Вместо того, чтобы слишком беспокоиться о том, какими могут быть затраты, просто попробуйте и узнайте.

Во-первых, сравните текущую конфигурацию с помощью ab или своего любимого тестера пыток веб-сервера. Многие люди забывают этот первый шаг.

Затем внесите изменения и попробуйте снова. Сравните результаты.

Некоторые ссылки, которые могут помочь. Они могут быть немного устаревшими, но основы те же:

Также помните, что вы можете делать что-то после того, как ответили. Вам не нужно делать все, пока клиент ждет ответа. И я бы не потел flocks слишком сильно. Если они вам не нравятся, есть другие способы обойти это, в том числе:

  • Запись в другой файл для каждого ребенка и последующее объединение
  • Отправка сообщения одному процессу, который упорядочивает сообщения
  • Запись в базу данных (более конкретный пример идеи одного процесса)
  • Настройка пользовательского формата журнала и разрешение Apache обрабатывать его
1 голос
/ 02 июня 2010

Я считаю, что стада являются необходимым злом, особенно в Solaris, и у меня не было проблем с производительностью даже на сильно загруженном сервере. Они необходимы, когда вы обрабатываете много одновременных запросов; без них вы получите записи журнала, записанные в середине других записей журнала. Обходные пути Брайана будут работать, но на втором и третьем будут свои узкие места, которые, вероятно, будут хуже, чем стада.

Кстати, обработчик журнала запускается после отправки запроса, поэтому на пользователей не влияет производительность, если обработчик журнала на мгновение останавливается. Также не будет видимого влияния на вывод ab, пока ваш сервер не будет перегружен, что затруднит распознавание влияния скоплений. Вам нужно будет посмотреть некоторые показатели дискового ввода-вывода, пока выполняется тест ab, чтобы увидеть, есть ли проблема.

...