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またはお気に入りの Web サーバー トーチャー テスターを使用して、現在の構成をベンチマークします。多くの人は、この最初のステップを忘れています。

次に、変更を実装して再試行します。結果を比較します。

役立つかもしれないいくつかのリンク。少し古いかもしれませんが、基本は同じです。

ただし、応答を提供した後でもできることを覚えておいてください。クライアントが応答を待っている間、すべてを行う必要はありません。そして、私はあまり汗をかきませんflocks。それらが気に入らない場合は、次のようなさまざまな方法があります。

  • 子ごとに異なるファイルに書き込み、後でマージする
  • メッセージを順序付けする単一のプロセスへのメッセージの送信
  • データベースへの書き込み (単一プロセスのアイデアのより具体的な例)
  • カスタム ログ形式を設定し、Apache に処理させる
于 2010-01-24T00:36:45.167 に答える
1

特にSolarisでは、群れが必要悪であることがわかりました。また、負荷の高いサーバーでもパフォーマンスの問題は発生していません。これらは、多数の同時リクエストを処理する場合に必要です。それらがないと、他のログエントリの途中にログエントリが書き込まれます。ブライアンの回避策は機能しますが、2番目と3番目は、おそらく群れよりも悪いボトルネックをもたらします。

ちなみに、ログハンドラーはリクエストが送信された後に実行されるため、ログハンドラーが一時的に停止しても、ユーザーのパフォーマンスに影響はありません。また、サーバーが過負荷になるまでabの出力に目に見える影響はありません。これにより、群れの影響を区別するのが難しくなります。問題があるかどうかを確認するには、abテストの実行中にいくつかのディスクIOメトリックを監視する必要があります。

于 2010-06-02T02:13:42.510 に答える