- PR -

スレッドプーリングの実装

投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-05-20 12:43
こんにちわ。

ある業務の「一括更新」という機能があります。
これは10件なら10件同時に更新処理できる
業務なのですが、非常に処理速度が遅いです。

現状の実装方法としては、1件処理をfor文で
単純にループしているだけですので、単純に
時間は件数倍になります。


そこで、繰り返し処理をスレッド化し平行処理
させることで機能改善をしました。

処理速度は2倍程度速くなりましたが、今度は
逆にAPサーバのCPU使用率がかなり高負荷に
なっています。

ある程度は仕方ないと思うのですが、何か
改善点がないかと模索中です。

このような場合、スレッドプーリングとか
使用すると良いのかなぁと思いますが
何分博識なため、よくわからずにいます。

質問:
 通常、スレッドプーリングをjavaで行う
 場合、自前の実装がほとんどになるので
 しょうか?それとも、何か便利なライブ
 ラリなんかが多用されるのでしょうか?
 
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2004-05-20 13:03
引用:

このような場合、スレッドプーリングとか
使用すると良いのかなぁと思いますが
何分博識なため、よくわからずにいます。



「良いのかなぁ」という推測ベースで動くのではなく、
一度プロファイリングしてみましょう。
思ってもいないところにボトルネックがあるかも知れませんよ。

プロファイリグの結果、スレッドの生成処理がネックであると判明し、
スレッドプールを使いたいという結論に達したのであれば、
Doug Lea の util.Concurrent なんか良いかもしれません。
PooledExecutor っていうのがまさにスレッドプールのクラスのようです。

あと、「博識」っていうのは「いろんなことをよく知っている」って意味です...
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2004-05-20 13:08
パフォーマンスチューニングに関しての日本語資料として私がよく読んでいるのは

@ITにも寄稿されている安藤幸央さんのページです。
http://javanews.jp/javap/

ほかにもアマゾンあたりで本を検索したら、
高い本が沢山出てくると思いますので、図書館などで借りてみてはどうでしょうか。

・・・・このあと30行くらい書いたところで、誤ってCTRL+Zを押してしまいま・・orz

その要約は、DBをチューニングしたほうがいいですよ。
もしくは仕様を確認しましょう。というようなことでした。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-05-20 13:26
コンチワ。

Concurrentライブラリ探してみます。

今回、他社が既に開発済みの
ソースをいじるので、なるべく
改造範囲を狭めたいというのが
あります。

従って、根本(SQL,設計)を直すと
というのは考えていません。
# 本来はやるべきなんでしょうけど。


>あと、「博識」っていうのは「いろんなことをよく知っている」って意味です...
お恥ずかしい限りです。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-05-20 14:04
Commons-threadpool なんていかがでしょう。
http://jakarta.apache.org/commons/sandbox/threadpool/

スレッドプーリングはスレッドの新規作成などのオーバヘッドを削減することはできますが、実際の処理速度が早くなったりするわけではありません。
よって「CPU使用率がかなり高負荷に」という現象を防ぐことはできないと思います。

また、アプリケーションサーバをお使いでしたら MDB を使うことで手軽に非同期処理を行えます。

[ メッセージ編集済み 編集者: インギ 編集日時 2004-05-20 14:05 ]
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-05-20 14:46
引用:

インギさんの書き込み (2004-05-20 14:04) より:
スレッドプーリングはスレッドの新規作成などのオーバヘッドを削減することはできますが、実際の処理速度が早くなったりするわけではありません。
よって「CPU使用率がかなり高負荷に」という現象を防ぐことはできないと思います。


スレッドの上限を定めて、処理時間とCPU負荷の兼ね合いを取りたいと言う事では?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-05-20 15:08
最近のプロジェクトでパフォーマンス改善というのがありましたが、
殆どのボトルネックがDB絡みでした。
SQLが悪かったりというのも多かったのですが、
インデックスの見直しだけでかなり早くなりました。

インギさんもおっしゃるように、スレッドプールの意味は
スレッド生成の時間短縮用であり、今回の要件では意味がないように感じます。
DBのチューニングを見直してみてはいかがでしょうか。
(ボトルネックの調査が先ですが・・・)
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 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ユーザとかきたらどうします?

スキルアップ/キャリアアップ(JOB@IT)