我有一個龐大的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版本更快,如果是這樣,怎麼樣?
您應該首先比較相同的東西,因爲您的SELECT和INSERT查詢與您的PHP和您的Perl腳本不同:您在PHP SELECT上使用'WHERE id = 1',並且您在Perl INSERT上使用_place-holders_ (_place-holders_已知會影響表演 - 更好或更差)。 – Ouki
重複測試沒有佔位符(缺少WHERE是從不同版本剪切和粘貼)。新的結果是Perl的平均值爲1810ms - PHP與未編輯的一樣。 –
找到解決方案。在我的PHP測試中,我使用http而不是https。切換到https的結果與Perl非常相似。 Doh! –