2012-04-28 98 views
0

我正在使用MapReduce框架在Google App Engine上做一些實驗(在這種情況下,是一個MD5暴力破解工具)。Google App Engine中的代碼運行速度極其緩慢

我在這裏的代碼運行得非常慢內GAE的問題,甚至只是使用開發服務器

此代碼https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/mapreduce/HashMapper.java將每秒只能處理大約4000哈希(這是的時間內一個調用地圖(),並沒有谷歌應用程序引擎apis在裏面使用)。

我把代碼之外並運行它獨立 - https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/StandaloneTest.java,並且該版本將做超過100萬每秒。這是中央循環運行速度較慢,這很奇怪,因爲沒有任何代碼與谷歌應用程序引擎有任何關係。

我試着運行在谷歌應用程序引擎代碼分析器,但我還沒有發現任何有用的東西 - 好像是一噸()調用checkRestricted之類的東西的,雖然。我試圖消除安全管理

即使這樣簡單的代碼:

 int i; 
    for (i=0; i< 1000000; i++) { 
     i += 2; 
     i += (int) Math.sin(i * (i + (int) System.currentTimeMillis())); 
    } 
    long enda = System.currentTimeMillis(); 
    System.out.println("took " + (enda - starta) + " i:" + i); 

奔跑在117毫秒,如果我把它放在一個正常的程序,並在超過400毫秒的開發模式一個servlet內,在同一處理器。

(有趣的是,映射得到約60000哈希每秒完成對生產谷歌應用程序引擎,所以速度快了很多,但仍然比一個獨立的程序很慢)

+1

我不知道,但在檢查其他任何事情之前,GAE使用什麼JIT(和相關選項),以及您的獨立代碼使用什麼?我問的不是因爲我可以對答案做任何有用的事情,而是因爲如果你知道這可能會幫助你:-)另外,生產GAE和你的獨立之間15倍差距的部分(可能不是全部)可能就是你的機器比它們給每個應用程序的有效CPU速度更快。至於開發服務器,Google的原始速度可能沒有優先級! – 2012-04-28 02:13:48

+0

謝謝 - 我使用visualvm來查看每個進程,並且我看不到GAE服務器的任何自定義jit選項,它們都使用Hotspot 20.6-b01。還有什麼地方我應該看看? – Jords 2012-04-28 02:26:12

+0

我的意思是生產GAE選項 - 你會認爲它們使用了很好的優化,但是我知道你使用的更好。我不知道他們是否在哪裏記錄他們使用什麼,但如果你沒有做任何特別的事情,那麼我不會馬上預計他們會慢多倍。我不會試圖解開開發性能,就像我說我懷疑它是一個優先事項,所以如果他們擠滿了充滿儀器的開發服務器代碼,那麼您可能無法做到這一點。 – 2012-04-28 02:32:09

回答

1

默認frontend instance有128MB的內存和600MHz的CPU限制。這可以解釋性能差異。

+0

我將實例類型更改爲最快的實例類型,速度從每秒c.60,000提高到每秒每秒c.250,000。儘管如此,我的桌面上只有一個線程可以獲得大約130萬。我目前正在使用hadoop在ec2上運行它,看看性能如何比較會很有趣。 – Jords 2012-04-28 09:57:02

0

MapReduce的疊代是相比於純的hadoop映射器緩慢每個數據存儲區的實體。考慮迭代blob,或將你的哈希分組。請記住,一個映射進程可以處理10分鐘的作品,然後您可以確定要處理的每個數據塊的最佳大小。

+0

我實際上是這樣做的 - 問題是map函數內的代碼在谷歌應用程序引擎上運行速度非常慢,而在開發服務器內部甚至更慢。我實際上已經轉向在亞馬遜上使用hadoop集羣,並且它工作得很好,好多了。 – Jords 2012-05-04 23:42:06

0

根據我的測量與CPU密集型任務,App Engine是要慢十倍比我們預期給出的實例的規格。例如,我的2.5 GHz計算機通常需要3秒的計算時間通常在2.4 GHz後端實例上需要30秒。

關於地方發展模式,外的現成應用程序引擎的表現更差。但是,通過設置vm參數-Dappengine.disableRestrictedCheck =「true」可以在一定程度上緩解這種情況,特別是在使用自定義類加載器時。

相關問題