演習 1.3: スレッド・ボトルネックの特定

この演習を開始する前に、『演習 1.2: スレッド・データの収集』を完了する必要があります。

スレッド・ビューを使用したスレッド・ボトルネックの検出

スレッド・ビューでは、アプリケーション内のすべてのスレッドの状況が表示され、スレッドのデッド ロックと競合が明示されます。

ボトルネックを検出するには、以下のようにします。

  1. プロファイル・モニターで、プロファイル・リソースを右クリックして、「アプリケーションか ら開く」>「スレッド・ビュー」をクリックする。スレッド・ビューが開きます。 スレッド・ビューは次のような画面構成になっています。

    このプロファイル実行の結果が表示されたスレッド・ビューのスクリーン・ショット。詳細は以下の本文で説明しています。

    スレッド間の垂直方向の矢印に注目してください。 片方向の矢印は、一方のスレッド (矢印の起点となっているスレッド) が、他方のスレッド (矢印が指してい るスレッド) によるロックの解除を待っていることを示しています。 両方向の矢印は、2 つのスレッドが両方ともお互いのロックが解除されるのを待つことにより、 デッドロック状態に陥っていることを示しています。

  2. これらの矢印は、相互に非常に近接しているため見分けにくくなっています。 矢印を見やすくするには、「圧縮時間目盛りに切り替える (Switch to Compressed Time Scale)」ボタンをクリックして、デフォルトの線形 時間目盛りから加重時間目盛りに切り替えます。 圧縮時間目盛りでは、重要なスレッド・アクションが実行されていない時間セグメントが圧縮されます。 表示は次のように変化します。

    圧縮時間目盛りに変更した後の矢印の分散を示すスクリーン・ショット。

  3. スレッド・ビューは以下のように解釈します。

    プログラムの開始後まもなくして、4 つの philo* スレッドが連続的に作成されます。 各スレッドは、しばらく実行されてからロックを要求します。 これらの要求は成功しません。 1 つ目から 3 つ目のロック要求が失敗したときに、これらのスレッドは Waiting for Lock 状態 に移行します。 4 つ目のスレッドのロック要求が失敗したときに、デッドロックが発生して、画面では 4 つすべてのスレッド が Deadlocked 状態になったことが示されます。

    それぞれの philo* スレッドは他の philo* スレッドからのロックを待っており、 これら他の philo* スレッドもロックを待っています。 このような場合はデッドロックが発生しています。つまり、プログラムは袋小路に入ったような状態 になり、処理を継続できません。
    : 特定のスレッド・セグメント上でカーソルを停止すると、ロック要求、デッドロック、 および他の状態に関する具体的な情報を表示できます。 これによりツールチップが表示されて、例えば、ロックの名前が明示され、そのロックを保持し ているスレッド (ロック元スレッド : Locking Thread) が特定できます。

  4. スレッド・セグメントに関する詳細情報をプロパティー・ビューで表示することもできます。 このビューを表示するには、「ウィンドウ」>「ビューの表示」>「プロパティー」 をクリックします。スレッド・セグメントを選択すると、そのプロパティーが表示されます。

このデッドロックが発生する理由を理解できたら、『演習 1.4: スレッド・ボ トルネックの解決』を開始する準備ができました。

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.