2012-01-19 8 views
2

Amazon EC2とJavaを使用して、正しく理解するのが難しい特定の動作に直面しています。私が持っているのは、iTextを使用して複数の単一ページのPDFファイルを複数のファイル(ページあたり1つのファイル)に分割するコードです。私は約100万ページ(約2,500のソースファイル)を抽出しています。そのため、EC2でどのような設定がそのようなジョブに最も適しているかを判断するためのテストを行っています。EC2とJava:スレッドを使用したときのパフォーマンスが最悪です

ワーカースレッドを開始せずに各ソースファイルを順番に処理し、Executorsを使用してJavaスレッドを使用して同じタスクを実行できる小さなアプリケーション(以下のリンク)を作成しました。

私のローカルMacbook Proでは、スレッドバージョンはシーケンシャルバージョンより約30〜40%速いですが、試したすべての単一EC2インスタンスで、スレッドバージョンはシーケンシャルランよりも最悪の状態でした。

私は小規模なインスタンスを試しましたが、大規模で高CPUの超大規模でした。私が理解しようとしているのは、スレッド版でこのような悪い結果を引き起こす可能性があることです。私のコードやI/OがEC2のものであれば、あるいは単にこの特定のタスクのスレッドが本当に悪い選択であるならば?私はどんな手がかりも受け入れています。

関連するコードは、https://gist.github.com/1641643です(「フラグ向けプログラミング」には申し訳ありませんが、テストの切り替えは簡単でした)。結果に大きな変更を加えずにExecutors.newFixedThreadPool(2,4,8など)の異なる値を試しました。

+0

+1の「フラグ指向プログラミング」 - これまでに聞いたことがなく、[Googleは同意する](http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=%22flag+oriented+programming% 22)ここで素晴らしい新しい用語を作りました:) –

+0

-Xprof java引数を使ってみます。実行中のプログラムのCPU統計を生成します。おそらくあなたはそこに問題を見つけることができます。 –

答えて

1

すべてのスレッドが1つのハードディスクを読み書きすると、ディスクは強制的に読み取りと書き込みの場所を強制的に変更します。シングルスレッドアプローチでは、スレッドはwole入力ファイルを一度に読み込み、その結果を一度に書き込むことができます。

+0

私はByteArrayOutputStreamを使用してディスクに書き戻すのではなく、すべてのものをメモリに保持しています。そして、スレッドのバージョンは順次実行よりもかなり優れています。 Oはここで大きな問題です。私はS3にファイルを書き込んで、何が起こるか見る。ありがとう –

1

また、あなたがテストを実行しているjdkのバージョンを確認してください - 使用しているamazon AMIはopenJDKで設定されています(sunバージョンを使用している場合は別の方法で動作します)。

+0

残念ながら、それは効果がありませんでした。私もUbuntu AMIを使ってみましたが、何の意味もありませんでした。 –

関連する問題