2010-01-23 6 views
1

나는 사용자 정의 아파치 로그 핸들러를 만들려면, 그리고 아파치 사이트에서 발견되는 템플릿은 다음과 같습니다PerlLogHandler 성능 영향을 어떻게 결정합니까?

#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 요청과 직렬로 처리됩니까? 병렬로 성능은 그다지 중요하지 않지만 사용자가 다른 것을 추가 할 때까지 기다리지 않아도됩니다.

답변

3

비용이 너무 많이 들지 않고 걱정하지 말고 시도해보고 알아보십시오.

먼저, ab 또는 선호하는 웹 서버 고문 테스터를 사용하여 현재 구성을 벤치마킹하십시오. 많은 사람들이이 첫 걸음을 잊어 버립니다.

다음으로 변경을 구현하고 다시 시도하십시오. 결과를 비교하십시오.

도움이 될만한 링크가 있습니다. 그들은 조금 날짜가있을 수 있지만, 기본은 동일합니다 :

또한 당신이 응답을 제공 한 후 물건을 할 수있는,하지만 기억한다. 클라이언트가 응답을 기다리는 동안 모든 것을 할 필요는 없습니다. 그리고 나는 flocks을 너무 많이 땀을 흘리지 않을 것이다. 당신이 그들을 좋아하지 않는 경우에 포함 주위 다른 여러 가지 방법이 있습니다 :

  • 아동 1 인당 다른 파일에 쓰기 및 메시지를 시퀀스 하나의 프로세스에 메시지를 보내기 나중에
  • 을 병합는
  • 특히, 사용자 정의 로그 형식을 설정 데이터베이스 (단일 프로세스 아이디어의보다 구체적인 예)
  • 에 쓰기 및 아파치
1

내가 필요악으로 양 떼를 발견했습니다 그것을 처리시키는 솔라리스에서, 그리고로드 된 서버에서도 성능 문제가 없었습니다. 많은 동시 요청을 처리 할 때 필요합니다. 그들 없이는 다른 로그 항목의 중간에 기록 된 로그 항목을 가져옵니다. 브라이언의 해결 방법은 효과가 있지만 두 번째와 세 번째는 양떼보다 나빠질 병목 현상을 일으킬 수 있습니다.

그런데 로그 처리기는 요청이 전송 된 후에 실행되므로 로그 처리기가 일시적으로 정지하면 사용자에게 성능에 영향을 미치지 않습니다. 서버가 과부하 될 때까지 ab 출력에 눈에 띄는 영향은 없으므로 무리의 영향을 구별하기가 어렵습니다. 문제가 있는지 ab 테스트가 실행되는 동안 일부 디스크 IO 메트릭을 관찰해야합니다.