2012-04-28 19 views
0

MapReduceフレームワークを使用してGoogle App Engineで作業(この場合はMD5ブルートフォーザ)を行っていくつかの実験を行っています。コードはGoogle App Engine内で非常にゆっくり実行されます

私もちょうど

https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/mapreduce/HashMapper.javaのみ毎秒約4,000のハッシュを(これは、単一の呼び出しがマップする内部時間で処理します。このコード開発サーバーを使用して、コードは非常にゆっくりとGAE内で実行され、問題を抱えています()内にはGoogleアプリエンジンのapiが全く使用されていません)。

コードを外に出してスタンドアロンで実行しました - https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/StandaloneTest.java、そのバージョンは1秒あたり100万を超えます。それは遅く実行されている中央ループです。これは、そのコードのどれもgoogleアプリケーションエンジンとは関係がないため、奇妙です。

私はGoogle Appエンジンコードでプロファイラーを実行しようとしましたが、便利なものは何も見つかりませんでした。checkRestricted()などの呼び出しが多かったようです。私は、セキュリティマネージャを削除しようとした

でも、この単純なコード:同じの開発者モードでのサーブレット内部400msのオーバー

 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ミリ秒で実行し、私は通常のプログラムでそれを置けば、とで、プロセッサ。

(興味深いことに、マッパーだからたくさん速い。生産はGoogle App Engine上で毎秒約60,000行わハッシュを取得しますが、スタンドアロンのプログラムに比べてまだ非常に遅い)

+1

私は実際にはわかりませんが、何か他のものをチェックする前に、GAEが使用するJIT(および関連するオプション)とスタンドアロンコードは何を使用していますか?なぜなら、おそらくそれがあなたを助けてくれるのを知っていたからです:-)また、生産GAEとスタンドアロンの間の15の違いの一部(おそらくすべてではありません)は、あなたのマシンは、各アプリケーションに与える有効なCPUスピードよりも高速です。開発サーバーの場合、生のスピードはおそらくGoogleにとって優先事項ではありません! –

+0

ありがとうございました - 私はそれぞれのプロセスを見るためにvisualvmを使いましたが、GAEサーバーのカスタムjitオプションを見ることができず、両方ともホットスポット20.6-b01を使用しています。私は見なければならない他の場所がありますか? – Jords

+0

私は生産GAEオプションを意味しました。彼らは良い最適化を使用していると思っていましたが、あなたが良く使っていたと知っていたすべてのために。彼らが使っているものを文書化しているかどうかは分かりませんが、何か特別なことをしていないのであれば、私はすぐにそれらが何倍も遅くなるとは思わないでしょう。私はそれが優先事項だと思ったように、開発パフォーマンスを困惑させようとはしませんでした。だから、彼らが計測器でいっぱいの開発者コードを詰め込んだとしても、それについて何もできないかもしれません。 –

答えて

1

デフォルトfrontend instanceは、128MBのメモリを持っており、 600MHzのCPU制限です。これはパフォーマンスの違いを説明することができます。

+0

インスタンスのタイプを最速のものに変更し、速度を毎秒c.60,000からインスタンスあたり毎秒250,000に改善しました。それでも、デスクトップ上のスレッドを1つだけ使用して約130万を得ることができます。私は現在、hadoopを使ってec2を実行するようになっています。パフォーマンスがどのように比較されるかは面白いでしょう。 – Jords

0

MapReduceは、純粋なハープ・マッパーと比較して遅いすべてのデータ・ストア・エンティティを反復処理します。ブロブを繰り返したり、ハッシュをグループ化したりすることを検討してください。 1つのマップ・プロセスで10分の作業を処理できることに注意してください。次に、処理する各データ・チャンクの最適なサイズを決定できます。

+0

私は実際にそれをやっています - 問題は、マップ関数内のコードがGoogleアプリケーションエンジンでは非常に遅く、開発サーバー内ではさらに遅くなっていたことでした。私は実際にアマゾンでハープ・クラスターを使用するように切り替えました。それははるかに優れています。 – Jords

0

私のCPUバウンドタスクの測定結果によると、アプリケーションエンジンは、インスタンスの仕様を考えれば、予想よりも約10倍遅くなっています。たとえば、2.5 GHzマシンでは通常3秒かかる計算には、2.4 GHzのバックエンドインスタンスでは通常30秒かかります。

ローカル開発モードに関して、アプリエンジンのすぐに使用できるパフォーマンスはさらに悪化します。ただし、特にカスタムクラスローダーを使用する場合は、vm引数-Dappengine.disableRestrictedCheck = "true"を設定することで、これをある程度緩和することができます。

関連する問題