2015-03-31 78 views
0

我正在將我們團隊的bugzilla升級到最新的穩定版本。 在以前使用的Bugzilla 2.x中,網頁的加載時間大約爲2秒,這被用戶接受。不過,Bugzilla 4.4.8需要3到4秒才能渲染頁面。 我的問題是,Perl導入Bugzilla需要的模塊似乎有問題。是什麼導致perl非常慢地導入模塊?

我通過直接用perl檢查index.cgi腳本,編寫一個只導入perl Bugzilla模塊的testscript.cgi,並通過註釋出使用語句來檢查導致長時間運行的原因。

#!/usr/bin/perl 

use strict; 
use lib qw(. lib); 
use Bugzilla; 
use Bugzilla::Constants; 
use Bugzilla::Error; 
use Bugzilla::Update; 

print "Content-Type: text/html\n\n"; 
print "<html><body>\n"; 

foreach (@INC){ 
    print "$_<br>\n"; 
} 

print "</body></html"; 

禁用Bugzilla導入時,服務器的響應時間會縮短到50ms。 我繼續把它和本地的Perl/Apache/Bugzilla安裝在我的筆記本上進行比較:〜630ms來渲染我認爲可接受的頁面。

我想起了這種困難行爲的一個可能起源:如果它必須遍歷模塊的太多目錄呢?

Solaris機器@INC:

. 
lib/sun4-solaris 
lib 
/opt/perl-5.20.2/lib/site_perl/5.20.2/sun4-solaris 
/opt/perl-5.20.2/lib/site_perl/5.20.2 
/opt/perl-5.20.2/lib/site_perl/sun4-solaris 
/opt/perl-5.20.2/lib/site_perl 

筆記本@INC:

. 
lib/i686-linux-gnu-thread-multi-64int 
lib 
/etc/perl 
/usr/local/lib/perl/5.18.2 
/usr/local/share/perl/5.18.2 
/usr/lib/perl5 
/usr/share/perl5 
/usr/lib/perl/5.18 
/usr/share/perl/5.18 
/usr/local/lib/site_perl 

是什麼原因導致的服務器上導入Perl模塊這個長期運行的? 我怎麼測量IO讀取時間?

系統屬性:

的Perl 5.20.2/ 的Solaris 10

更新: 正如意見建議我分析了傑韋利:: NYTProf腳本:腳本在以下時間最多在幾個文件中的語句

use Bugzilla::Install::Filesystem 
use Bugzilla::Install::Localconfig 
use Bugzilla::Install::Util 
use Bugzilla::Auth and subroutines 
use Bugzilla::User 
use Bugzilla::Template 
+0

嘗試['Devel :: NYTProf'](http://search.cpan.org/perldoc/Devel::NYTProf) – dawud 2015-03-31 12:09:05

+0

也試試'Benchmark :: Stopwatch'。 – 2015-03-31 12:38:55

+0

我不明白爲什麼我現在應該使用NYTProf或Stopwatch,因爲我現在已經在使用我的代碼片斷了很多時間。我的問題是關於這個擴展運行時間的原因。我認爲它比perl更系統化。 – 2015-03-31 12:44:00

回答

0

這不是一個真正的完整答案,但是它是用來評論的。

你使用的是一個PATH變量。當您搜索路徑時,系統會打開(使用opendir())每個目錄,然後嘗試打開/統計找不到的文件。這對於大量大目錄來說效率不高。

確切的實現可能因平臺而異。我也看到了更有效的統計使用。您可以在Solaris中與桁架看到這一點:

假設testscript.cgi具有認領嘗試開放的系統調用:

truss -t open testscript.cgi 

注意ENOENT錯誤未能找到文件。

嘗試統計

truss -t stat testscript.cgi 

同上上ENOENT - 可以說stat64中

我所知道的唯一的解決方案是不是一個偉大的一個 - 創建一個特殊的目錄。 將符號鏈接添加到pm文件,如果沒有名稱混淆條目 - 對不同的包進行重複。如果有多個條目foo.pm,可能會遇到問題。這個例子只使用pm條目。 我只熟悉perl 5.8及更早的版本。你需要修改這個以適應正在發生的事情。因此@INC將擁有基本的perl路徑和一個或兩個特殊的目錄。

在你解決所有這些問題之前,確保你的Solaris inode緩存已經足夠。

我能做的最好的。其他人可能有更好的解決方案。