スレッド数による性能低下 – プログラミング – Home

スレッド数による性能低下
 
通知
すべてクリア

[解決済] スレッド数による性能低下


NEO
 NEO
(@NEO)
ゲスト
結合: 21年前
投稿: 18
Topic starter  

プロセス内のスレッド数が多すぎると、起動しているスレッドの動作が遅くなったりする
ことはあるでしょうか?


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 14年前
投稿: 40
 

ありますとも。


返信引用
NEO
 NEO
(@NEO)
ゲスト
結合: 21年前
投稿: 18
Topic starter  

やっぱりそうですよね。

スレッドの数が760くらいのプロセスで、1つスレッドを増やしただけで他のスレッドがそ
れまでよりも極端に遅くなっているようなのですが、
増やしたスレッドで行っている処理の内容が原因になり得るでしょうか?
増やしたスレッドとその他のスレッドでは、相互の排他制御を行っていないものとします。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

ありますとも。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

処理内容だけに話は止まらないと思います。

スレッド間のCPU割り当てのスケジューリングの関係で
あるスレッド数を超えると割り当ての効率が悪くなるような
ケースも有るでしょう。この辺の最適値はHWのスペックも
絡んでくると思うので一概には言えないと思います。
スレッドを一つ増やしただけだから、影響は少ないと考える事は
少々乱暴に感じます。

個人的にはスレッド数が760と言うのは多すぎるような気がします。
本当に並列で処理すべき物が760も同時に存在しうるのか?
とか、それだけのスレッドを並列に処理するのが最善の策なのか
と検討する必要がないでしょうか?
実際にはもっと少ないスレッド数で処理自体は並列に処理する
ような方式の方が結果的に処理が早くなったりする事はないでしょうか?

マルチコアのCPUが当たり前になってマルチスレッドによる恩恵が
出易い状況になっているとは思いますが、実際にそこまでの並列処理が
必要なのか、現在想定しているHWで可能なのかに関しては
一意にこれなら大丈夫と言う値を出す事は難しいと思うので
各々のシステム構成を踏まえて最適な値の範囲を割り出していく
必要があると思います。


返信引用
NEO
 NEO
(@NEO)
ゲスト
結合: 21年前
投稿: 18
Topic starter  

スレッド数に関しては、私がプログラム開発に参画する前にすでに決まっていて、開発ス
ケジュールの関係でそれを変えるにはリスクが高すぎるので、今のままになっています。
参画してプログラムの構造を知ったときは、多すぎるなと思ってはいました。
今は何とか動いていますが、やはり一般的な構造ではないと思います。

原因がスレッド数が多いこととは決まったわけではありませんが、仮にそうだとしても開
発の取りまとめの人にしてみれば、できればスレッド数は今のままで別の解決策を探って
ほしいということになると思います。

今のところ、スレッド数が多いことが原因であると言えるような材料は見つかっていません。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

 OSのパフォーマンスモニターは参考になると思います。
後、HWとの通信の使用をもう一度確かめる必要があると思います。
またいつも忘れてしまうのですが、デバイスドライバーとアプリケーション(DLLを含
む)
とのデータのやり取りには100mS以上の時間が掛かります。


返信引用
NEO
 NEO
(@NEO)
ゲスト
結合: 21年前
投稿: 18
Topic starter  

増やしたスレッドでは、ファイルを読みながら、TCPで通信しています。

(1)TCPセッション確立。
(2)256バイトずつ読んで100ms Sleep。
(3)1024バイト読んだらTCPで送信。
(4)TCPセッション切断。

(2)~(3)をファイルを全部送るまで繰り返し。(3)->(2)に戻る前に500ms Sleep。
こんな感じです。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

スレッドひとつにつきメモリ1MB(デフォルト)が予約される/ある程度使用される
⇒数百スレッドでは結構な量になる
スレッドからスレッドへスイッチするたびにオーバヘッドがかかる
⇒仮に一回分はわずかでも数百スレッドで頻繁にスイッチしながら動作すれば
馬鹿にできない時間になる
(通常そんなスレッドを回すことは少ないと思われるため、
スレッド数が少ない場合に最適化していて?)どこかに検索時間等のオーダが
数に応じて悪化する処理があるのかも?

などなど。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

最初はスレッドという技術についての質問のようにみえたけど
だんだんと、NEOさんが直面してる固有の問題に話がシフトしはじめてますね

ここをそのまま使うにしても、
いったん質問内容を仕切りなおした方がいいのではないでしょうか?

具体的に困ってる内容、それでどういう風にしたいのか
開発・動作環境、これまでに試した調査結果とか・・・


返信引用
NEO
 NEO
(@NEO)
ゲスト
結合: 21年前
投稿: 18
Topic starter  

いったん締めます


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

>今のところ、スレッド数が多いことが原因であると言えるような材料は見つかっていま
せん。

とのことですが、回答者の皆さんが遠回しに言っているように、
明らかにスレッドが多すぎますね。Banさんの発言にあるように
760MByteものメモリが予約スタックで消費されているます。
システムが使用しているメモリ(約500MByte)も加算し、32bitOSの
メモリ空間がたかだか2000MByteであることを勘案すれば、
とてもほめられたデザインとは言えませんね(笑)。
もちろんスイッチ時のオーバーヘッドも大変な量になるでしょう。
確かに1プロセスあたり2048(-α)スレッドが上限ですが、これはあくまで
計算上の話。スレッドのコストを度外視してデザインするとえらいめにあいます。


返信引用
hirocco
 hirocco
(@hirocco)
ゲスト
結合: 14年前
投稿: 138
 

700個以上のスレッドが全て別々の1キロバイトのファイルを開いていて、
700個以上のスレッドがそれぞれのタイミングでネットワークに通信してるんですか?
それってメモリもだけど、ネットワークも混みそうですね


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました