2009-04-11 6 views
2

1つのCPUとたくさんのRAMを持つマシンがあるとします。他の種類のアプリケーション(Webサーバーなど)に加えて、10のスレッドと他のユーザーのスレッドを使用していますが、同じマシンで実行されている他の2つのサーバーアプリケーションがあります。各要求の処理ロジックが100%CPUバウンドであり、通常は2秒以内に終了すると仮定します。問題は、1分間に処理されるトランザクションのスループットが良いかもしれないということですか?どうして?いくつかのCPUマシンに複数のスレッドを持つアプリケーションについての質問

上記は実際の環境ではないことに注意してください。質問を明確にするためにデータを補うだけです。私の現在の考えは、アプリケーションが100%CPUに拘束されているので違いはないはずだから、マシンが2番目のアプリに対して1分あたり30個のリクエストを処理できるなら、毎分3リクエストを処理できます1stアプリの10スレッド。しかし、マシン内で実行中の他のアプリケーションが存在し、1つのアプリケーションが常に100%のCPU時間を与えられないという事実を考えれば、間違っているとうれしいです。

答えて

1

興味深い質問です。

私はこれだけのサンプルプログラムを書いています。それはいくつかのプロセッサ集約的な作業を行い、その後復帰するクラスを持っています。私は、実行したいスレッドの総数と、作業を実行させたい総回数を指定します。プログラムはすべてのスレッド間で作業を均等に分割します(スレッドが1つしかない場合は、すべてを取得してすべて起動します)。

私はこれを1台のプロセッサしか持たない実際のコンピュータが見つけられるので、これを1台のproc VMで実行しました。独立

ラン:

これはプロセッサ集中して作業を行っているスレッドの多くと、1つのproc PC上でそれを示すように思わ
1 Thread 5000 Work Units - 50.4365sec 
10 Threads 5000 Work Units - 49.7762sec 

、窓が急速に戻って第四にそれらを切り替えることではない十分にスマートで、彼らはほぼ同じ時間がかかります。

一緒に実行します(または、私が同時に入る押しに得ることができる限り近い):

1 Thread 5000 Work Units - 99.5112sec 
10 Threads 5000 Work Units - 56.8777sec 

これは質問の肉です。 10スレッド+ 1スレッドを実行すると、それらはすべて同じようにスケジューリングされているように見えます。他のスレッドはほぼ2倍の時間を費やしていましたが(実際には、最初の56秒で完了した作業の1/10になっていました。その後もう一方の9 /次の43秒で10分の1 ...ほぼ正しい)。

結果:ウィンドウのスケジューラはスレッドレベルでは公平ですが、プロセスレベルでは公平ではありません。多くのスレッドを作成する場合は、スレッドを高くして乾燥させるほどスマートではない他のプロセスを残すことができます。それとも、あなた自身のためにそれを試みることに興味があるなら

、あなたが私のコードを見つけることができます:-)スレッドプールを右にそれを行うと私たち: http://teeks99.com/ThreadWorkTest.zip

+0

私はウリと同じ意見を持っていましたが、デュオ・コアではあります。素敵な分析に感謝します。 –

1

スケジューリングのオーバーヘッドによって、10スレッドのスレッドが1スレッドのスレッドよりも遅くなる可能性があります。あなたがテストを作成しない限り、あなたは確かに分かりません。マルチスレッドのいくつかの背景については

は、これは非常によく、オペレーティングシステムのスケジューラに依存する場合がありますhttp://en.wikipedia.org/wiki/Thread_(computer_science)

1

を参照してください。たとえば、シングルスレッドの日に戻ると、スケジューラはプロセスについてしか認識せず、割り振るべき量を把握するために「niceness」のような手段を持っていました。

マルチスレッド化されたコードでは、スレッドが1つの別のプロセスがある場合、100スレッドを持つプロセスのCPU時間が99%にならない可能性があります。一方、プロセスが2つしかなく、そのうちの1つがマルチスレッド化されている場合は、OSによって全体的な時間がかかる可能性があります。しかしAFAIKは何も保証されていません。

同じプロセス内のスレッド間の切り替えコストは、プロセス間の切り替え(たとえば、キャッシュの動作による)よりも安いかもしれません。

+0

はちょうど私の2コアマシン上でこれを試してみました:実行1つのスレッドをしばらく実行しているJavaアプリケーション(真)。 loop - 合計CPU時間の50%が占有され、もう1つは空きです。同じことをやっている100スレッドでもう1つ実行すると、今度は2番目のアプリケーションが99%のCPUを占め、1番目のスレッドに対して1%しか残っていません... –

+0

(続き)今はテストする1コアマシンはありません上記の実験は第2段落でのあなたの意見と一致しているようです:複数のスレッドを持つアプリケーションは、より多くのCPU時間を受け取る可能性があります。 –

0

トランザクションのもう一方の端で待機時間が考慮される必要があります。複数のスレッドを持つことで、次のトランザクションを次のトランザクションの準備中に応答するのを待つことができます。少なくともそれは私がそれを理解する方法です。だから、私はいくつかのスレッドが1つより良いものになると思う。

一方、複数のスレッドを処理する際のオーバーヘッドを考慮する必要があります。アプリケーションの詳細は、ここで考慮すべき重要な部分です。

3

タスクの切り替えには常にオーバーヘッドがあります。したがって、スレッドが何かをブロックしていない場合は、一般的にスレッド数が少なくなります。また、スレッドがコードの同じ部分を実行していない場合、swtichを実行するたびにキャッシュがフラッシュされます。

一方、その差は測定できないことがあります。

+0

コンテキストスイッチとキャッシュヒットに注目してくれてありがとう。非常に良い点。 –

関連する問題