- - PR -
スレッドプーリングの実装
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-05-20 12:43
こんにちわ。
ある業務の「一括更新」という機能があります。 これは10件なら10件同時に更新処理できる 業務なのですが、非常に処理速度が遅いです。 現状の実装方法としては、1件処理をfor文で 単純にループしているだけですので、単純に 時間は件数倍になります。 そこで、繰り返し処理をスレッド化し平行処理 させることで機能改善をしました。 処理速度は2倍程度速くなりましたが、今度は 逆にAPサーバのCPU使用率がかなり高負荷に なっています。 ある程度は仕方ないと思うのですが、何か 改善点がないかと模索中です。 このような場合、スレッドプーリングとか 使用すると良いのかなぁと思いますが 何分博識なため、よくわからずにいます。 質問: 通常、スレッドプーリングをjavaで行う 場合、自前の実装がほとんどになるので しょうか?それとも、何か便利なライブ ラリなんかが多用されるのでしょうか? | ||||
|
投稿日時: 2004-05-20 13:03
「良いのかなぁ」という推測ベースで動くのではなく、 一度プロファイリングしてみましょう。 思ってもいないところにボトルネックがあるかも知れませんよ。 プロファイリグの結果、スレッドの生成処理がネックであると判明し、 スレッドプールを使いたいという結論に達したのであれば、 Doug Lea の util.Concurrent なんか良いかもしれません。 PooledExecutor っていうのがまさにスレッドプールのクラスのようです。 あと、「博識」っていうのは「いろんなことをよく知っている」って意味です... | ||||
|
投稿日時: 2004-05-20 13:08
パフォーマンスチューニングに関しての日本語資料として私がよく読んでいるのは
@ITにも寄稿されている安藤幸央さんのページです。 http://javanews.jp/javap/ ほかにもアマゾンあたりで本を検索したら、 高い本が沢山出てくると思いますので、図書館などで借りてみてはどうでしょうか。 ・・・・このあと30行くらい書いたところで、誤ってCTRL+Zを押してしまいま・・orz その要約は、DBをチューニングしたほうがいいですよ。 もしくは仕様を確認しましょう。というようなことでした。 | ||||
|
投稿日時: 2004-05-20 13:26
コンチワ。
Concurrentライブラリ探してみます。 今回、他社が既に開発済みの ソースをいじるので、なるべく 改造範囲を狭めたいというのが あります。 従って、根本(SQL,設計)を直すと というのは考えていません。 # 本来はやるべきなんでしょうけど。 >あと、「博識」っていうのは「いろんなことをよく知っている」って意味です... お恥ずかしい限りです。 | ||||
|
投稿日時: 2004-05-20 14:04
Commons-threadpool なんていかがでしょう。
http://jakarta.apache.org/commons/sandbox/threadpool/ スレッドプーリングはスレッドの新規作成などのオーバヘッドを削減することはできますが、実際の処理速度が早くなったりするわけではありません。 よって「CPU使用率がかなり高負荷に」という現象を防ぐことはできないと思います。 また、アプリケーションサーバをお使いでしたら MDB を使うことで手軽に非同期処理を行えます。 [ メッセージ編集済み 編集者: インギ 編集日時 2004-05-20 14:05 ] | ||||
|
投稿日時: 2004-05-20 14:46
スレッドの上限を定めて、処理時間とCPU負荷の兼ね合いを取りたいと言う事では? | ||||
|
投稿日時: 2004-05-20 15:08
最近のプロジェクトでパフォーマンス改善というのがありましたが、
殆どのボトルネックがDB絡みでした。 SQLが悪かったりというのも多かったのですが、 インデックスの見直しだけでかなり早くなりました。 インギさんもおっしゃるように、スレッドプールの意味は スレッド生成の時間短縮用であり、今回の要件では意味がないように感じます。 DBのチューニングを見直してみてはいかがでしょうか。 (ボトルネックの調査が先ですが・・・) | ||||
|
投稿日時: 2004-05-20 15:13
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6103&forum=12&8
こちらに書いてあるようなexecuteBatchは試してみましたか? 私は自前でコンテナ全体で同時実行数を調節可能なスレッドプールを作りましたが、 スレッド1つ1つの処理が重くて、サーバ全体が無応答状態になった経験があります。 #結局同時1で凌いでスレッド内部処理などをチューニングしたりしました スレッドで凌ごうというのは結局運用に入ってからのユーセージに大きく左右されるので、 あまりお勧めしません。 #テスト時は1ユーザで少量のスレッドでも、運用時に同時10ユーザとかきたらどうします? | ||||
