2010-01-23 49 views
1

我想創建一個自定義的Apache2日誌處理程序,那就是在Apache的網站上找到的模板是:如何確定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

我發現羊羣是一種必要的惡,尤其是在Solaris上,即使在負載很重的服務器上,我也沒有任何性能問題。在處理多個併發請求時,它們是必需的;沒有它們,你會得到寫在其他日誌條目中間的日誌條目。布賴恩的解決方法將起作用,但第二個和第三個將引入自己的瓶頸,這可能會比羊羣更糟。

順便說一下,日誌處理程序在發送請求後運行,所以如果日誌處理程序暫時停頓,那麼對用戶沒有任何性能影響。在服務器超負荷之前,ab的輸出也不會有明顯的影響,這會使得區分雞羣的影響變得困難。在ab測試運行時,您必須觀察一些磁盤IO指標,看看是否有問題。