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など)の異なる値を試しました。
+1の「フラグ指向プログラミング」 - これまでに聞いたことがなく、[Googleは同意する](http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=%22flag+oriented+programming% 22)ここで素晴らしい新しい用語を作りました:) –
-Xprof java引数を使ってみます。実行中のプログラムのCPU統計を生成します。おそらくあなたはそこに問題を見つけることができます。 –