2011-11-14 181 views
0

我在php中構建了一個應用程序,其中一個功能可分析大約10000個文本文件並從中提取內容並將其放入mysql數據庫。代碼本身只是一個for循環,其中每個文件都通過file_get_contents()加載,並在該迭代結束後從內存中加載unset()。文件分析是一個cron作業,並且一個php文件完成所有這些處理。EC2比共享主機慢?

然而,問題在於,應用程序最初是建立在共享服務器上的,而且一切都非常順利。我沒有注意到任何延遲或重大滯後,但是爲了能夠處理更多的負載,我將所有內容都移到了EC2服務器(微型實例)。

我現在遇到的問題是,每次運行cronjob(按小時處理文件),它會使整個服務器速度變慢,導致正常頁面大約需要5-8秒才能加載,擊敗了將其轉移到EC2的目的。

cron本身是一個非常漫長的過程。下面是一些測試腳本處理的結果(每小時)

SQL Insertion Time: 23.138303995132 seconds 
Memory Used: 10.05 MB 
Execution: 411.00507092476 seconds 

但在每一個小時的頂部的服務器,儘管相比於共享服務器有更多的專用硬件加速減慢這麼多7分鐘(我至少想)。來自EC2儀表板的圖表顯示CPU使用率接近100%,但我不明白它是如何達到該水平的。

任何人都可以幫助我確定爲什麼會發生這種情況的原因嗎?我注意到,當cron運行在共享服務器上時,甚至沒有絲毫的延遲,但EC2的情況完全不同。

請隨時問我任何我錯過了提及。

回答

2

微實例非常慢。如果您使用更大的實例,它將運行得更快。

我們所有的生產箱都使用EC2。我無法對該平臺說出足夠多的好消息。我永遠不會回到另一個主機。另外,如果你想用C++編寫你的代碼,它會更快地運行LOT。我寫了一個簡單的mysql插入代碼here。它是多線程的,所以你可以異步運行mysql更新或插入。

請讓我知道你是否需要任何幫助,但我相信你可以繼續使用微型實例並獲得很高的速度。

希望對您有所幫助...

PS。我願意幫助你爲你的用途編寫一個C++版本......僅僅因爲它很有趣! :-)

+0

噢...還有一件事:確保您在服務器上安裝了APC。這也會產生巨大的差異。 – Homer6

+0

感謝您的評論!我同意,如果它的編譯速度會更快,但其中的一些文本文件中包含HTML,並且PHP提供了非常好的DOM解析器庫。移植所有這些將會非常乏味。 – Kartik

+0

讓我安裝apc,看看是否有所作爲! – Kartik

0

那麼EC2的設計是可擴展的。

由於您的代碼運行在1個循環中以逐個打開每個文件,因此它不適用於可伸縮設計。

嘗試更改您的代碼以打破它們,以便通過php腳本的不同實例同時處理這些文件。這樣,腳本的每個副本都可以在一個線程中運行。如果您有多臺服務器(或EC2中的服務器實例),則可以在不同的計算機上運行它們以加速實現更高速度。

+0

嗨,這是有道理的,我可以拆分我的代碼,分類後分析文件,但阻止我這樣做的事情是腳本本身需要〜12MB或RAM的613 MB實例(我不知道所有這些都可用),共享主機絕對沒有問題。因此,在我將費用增加一倍以上之前,想知道是否有人知道這樣的事情是否是一個問題。 – Kartik

+0

嗯,我不是EC2的專家,所以糾正我,如果我錯了...... EC2運行所有的服務器作爲虛擬服務器,因此訪問硬件是虛擬化的。這意味着磁盤訪問可能會慢一些? – iWantSimpleLife

+0

我不確定,但我明白你想說什麼。我將通過使用apc和memcached來改進代碼,並查看它是否會降低CPU使用率。 – Kartik