0

これを理解するのを手伝ってください。

STA VB6 アプリケーションがあります。.net Web アプリケーションと同じ仮想サーバー上で実行されています。そのサーバーには 2 つのコアがあります。.net アプリケーションのパフォーマンスを測定するために、約 30% の CPU 使用率を記録します。VB6 アプリケーションは約 20% の CPU を使用します。また、データベースへのアパートメント呼び出しを行う間、しばらくの間コアをロックしています。

VB6 アプリケーションがアパート外の呼び出しに 1 分間費やした場合、コアが 1 分間完全にロックされていると想定できますか? つまり、各コアが VB6 アプリケーションに 1 時間あたり 1 時間の「CPU 時間」を提供すると仮定できますか? コアが 2 つある場合、このセットアップは 1 時間あたり 120 分の「CPU 時間」を提供すると言えますか?

ありがとうございました!

4

2 に答える 2

1

誰もコアをロックしません。スレッドとコアを混同しています。

スレッドは、リモート呼び出し中に 1 分間ブロックされる可能性があります(おそらくブロックされません)。しかし、コアは 1 つのスレッドのみを実行することに縛られているわけではありません。そうしないと、最新の Windows (Windows 95 以降) がまったく機能しなくなります。Windows は、わずか 1 つのコアで数百のプロセスを同時に処理できる必要があります。

典型的なセッションでは、カーネルはプロセスのスレッドの一部またはすべてを1 秒間に数十または数百回中断し、各コアに別の処理を割り当てます。最終的に、あなたのスレッドは復活します - おそらく同じコアで、あるいは別のコアで。

特に、リモート呼び出しを行うスレッドは通常、「待機状態」に置かれます。これは、リモート呼び出しが完了するまで、カーネルがスレッドにコアをまったく割り当てないことを意味します

(いくつかの概算が取られましたが、それはその要点です)

各コアが VB6 アプリケーションに 1 時間あたり 1 時間の「CPU 時間」を提供すると仮定できますか? コアが 2 つある場合、このセットアップは 1 時間あたり 120 分の「CPU 時間」を提供すると言えますか?

いいえ。プロセスが消費する CPU 時間を知る唯一の実用的な方法は、パフォーマンス カウンターを調べることです。経過時間あたりの CPU 時間は 1 時間未満になることはほぼ間違いありません。経過時間あたり 1 時間の CPU 時間に近づけるには、合計でほぼ 100% の CPU 使用率になる必要があります (VB6 プロセス自体の場合)。たとえば、2 コア システムではコアあたり 48% 程度で、すべて VB6 プロセスによって消費されます。

さらに、VB6 が使用するような STA スレッドの場合、コアを追加しても、プロセスの実行にかかる時間 (CPU ではなく経過時間) に関しては (STA の外部で重要な作業を行うマルチスレッド COM オブジェクトを除いて) まったく違いはありません。

CPU コアを追加しても、プロセスによる有益な CPU 時間の消費が増加することはほとんどありません。タスクを完了するために必要な通常の CPU 時間の量は、近くに追加のシリコンがあるからといって変わらないからです。

しかし、私たちは両方とも何かが欠けていると思います。あなたが見つけようとしているのは、正確には何ですか?あなたの本当の質問が何であるかはわかりませんが、「CPU時間」が答えではないに違いありません。

于 2013-05-22T16:05:28.037 に答える
0

あなたの質問は COM+ としてタグ付けされているため、COM+ がコンポーネントのスレッドを管理する方法を検討する必要があります。

コアは「ロック」されるべきではありません。また、1 つのスレッドが複数の要求を処理できるため、COM+ のスレッドも (ロックの定義方法に応じて) すべきではありません。

つまり、STA COM+ コンポーネントが COM+ のアパートメント コールから長時間 (60 秒!) かかると、パフォーマンスの問題が発生します。

基本的に、COM+ STA スレッド プールは、各 STA スレッドに最大 5 つのアクティビティをバインドします。アパートメント外の呼び出しを行うと、COM+ は他の要求を STA スレッドの別のアクティビティとして処理できるようにします。これは、最大 5 つのアクティビティ (スレッドごと) で発生する可能性があります。また、別のアクティビティに制御が渡されると、元のアクティビティは、2 番目のアクティビティが完了するまで制御を取り戻すことはできません。負荷が高い場合、および/または呼び出しが「長時間実行」されている場合、最初のアクティビティが完了するまでの時間は、(スレッド上の) 他のすべてのアクティビティが完了するまでの時間の合計です。これにより、パフォーマンスが低下する可能性があります。

これに関する最良の記事は、Avoid Long Running Method Calls from a Single-Threaded Apartment (STA)です。Microsoft の元の記事が見つからないため、このサード パーティのアーカイブ バージョンにリンクしています。

于 2013-06-14T04:11:35.647 に答える