2012-08-27 39 views
0

我有一個龐大的Perl應用程序,我需要更快;基於它花費大部分運行時間與數據庫交談,我想知道我可以運行多少寫得很好的SQL語句並達到性能目標。爲此,我編寫了一個非常簡單的處理程序,它可以執行SELECT和INSERT,當我在300個併發請求(總共10,000個)上進行基準測試時,結果相當差(平均值爲1900ms)。mod_perl和oracle與php和oracle的性能

我們給客戶的性能目標是基於他們用PHP編寫的另一個應用程序,所以我編寫了一個快速的PHP腳本,功能上與我的簡單mod_perl測試處理程序的功能相同,它給出了400ms平均!

的PHP代碼:

$cs = "//oracle.ourdomain.com:1521/XE"; 
$oc = oci_pconnect("hr","password",$cs); 
if(!$oc) { print oci_error(); } 
$stid = oci_parse($oc, 'SELECT id FROM zz_system_options WHERE id = 1'); 
oci_execute($stid); 
$stmt = oci_parse($oc, "INSERT INTO zz_system_options (id,option_name) VALUES (zz_system_optionsids.nextval,'load testing')"); 
oci_execute($stmt); 
echo "hello world"; 

Perl代碼是:

use strict; 
use Apache2::RequestRec(); 
use Apache2::RequestIO (); 
use Apache2::Const -compile => qw(:common); 
use DBI; 
our $dbh; 
sub handler 
{ 
    my $r = shift; 

    # Connect to DB 
    $dbh = DBI->connect("DBI:Oracle:host=oracle.ourdoamin.com;port=1521;sid=XE", "hr", "password") unless $dbh; 
    my $dbi_query_object = $dbh->prepare("SELECT id FROM zz_system_options"); 
    $dbi_query_object->execute(); 
    $dbi_query_object = 
     $dbh->prepare("INSERT INTO zz_system_options (id,option_name) VALUES (zz_system_optionsids.nextval,?)"); 
    $dbi_query_object->execute("load testing"); 
    # Print out some info about this... 
    $r->content_type('text/plain'); 
    $r->print("Errors: $err\n"); 
    return Apache2::Const::OK; 
} 

接下來的mod_perl在Apache的配置調用一個PerlRequire一個startup.pl腳本加載所有的「使用'd模塊。如果所有工作都正常,並且我沒有理由認爲它不是,那麼每個請求應該只運行'sub handler'中的行 - 這意味着Perl和PHP應該做幾乎相同的事情。

服務器詳細信息: - 硬件節點是四核心至強L5630 @ 2.13GHz,配有24Gb RAM,Apache虛擬機的操作系統是Gentoo,Oracle的操作系統是Centos 5。

版本:最近兩週內更新的操作系統,Apache版本2.2.22,mod_perl版本2.0.4,DBI版本1.622,DBD :: Oracle版本1.50,Oracle即時客戶端版本10.2.0.3,Oracle數據庫10g快捷版10.2.0.1.0版本,PHP版本5.3

Apache的MPM的配置是將ServerLimit 2000 MaxClients的2000年和MaxRequestsPerChild 300

事情我檢查:在測試過程中唯一的負載是從試驗應用/ ORACLE,既不虛機器遇到任何bean的限制,例如內存,Oracle在任何時候都會爲每個Apache孩子顯示1次會話,每次運行後都會進行插入操作。

所以,我的問題是;我可以使mod_perl版本更快,如果是這樣,怎麼樣?

+1

您應該首先比較相同的東西,因爲您的SELECT和INSERT查詢與您的PHP和您的Perl腳本不同:您在PHP SELECT上使用'WHERE id = 1',並且您在Perl INSERT上使用_place-holders_ (_place-holders_已知會影響表演 - 更好或更差)。 – Ouki

+0

重複測試沒有佔位符(缺少WHERE是從不同版本剪切和粘貼)。新的結果是Perl的平均值爲1810ms - PHP與未編輯的一樣。 –

+0

找到解決方案。在我的PHP測試中,我使用http而不是https。切換到https的結果與Perl非常相似。 Doh! –

回答

0

如果您更改了PHP代碼並且時間沒有改變,那麼您顯然不會測量代碼時間,對嗎?

重要的問題是 - 爲什麼你反覆連接Perl腳本而不是PHP腳本?

最後,這個測試可能不會告訴你任何有用的東西,除非你的所有查詢都是簡單的單表單行選擇和插入。

+0

對不起,我不確定我在哪裏說過我更改了PHP代碼 - PHP代碼在整個過程中一直保持不變(除了修復SQL中的差異以外,Perl還有所不同)。另外,在perl中連接後的'if'不是'db',而是聲明爲'我們',因此將在對同一個apache子進程的請求之間共享。 –

+0

至於它是否告訴我任何有用的東西,它告訴我mod_perl比php慢或者我的設置錯誤。我真的希望它是後者。而且'慢'我的意思是設置和響應請求我們的應用程序然後有很多其他的事情要做,他們可能會或可能不會更快perl/php,但1700毫秒做很少是相當多的東西需要在代碼的其餘部分「保存」。 –

+0

1.「用...重複測試」,2.「它告訴我要麼......我希望」 - 你在猜測,這意味着它沒有告訴你任何有用的東西嗎?即使你重構了你的測試,這也不可能告訴你任何關於你的應用程序的有用信息。 –