監視された値をプログラムで読み取る
最終更新日: 2011年3月3日
適用対象: SharePoint Foundation 2010
このトピックでは、Microsoft SharePoint Foundation パフォーマンス監視および要求調整システムによって監視されている Windows Server 2008 パフォーマンス カウンターの値をコードで読み取る方法について説明します。
重要 |
---|
このトピックの実行例では、コンソール アプリケーションが使用されます。プロジェクトの種類にかかわらず、正しいターゲットの .NET Framework と CPU を設定することが非常に重要です。このプロジェクトのターゲット .NET Framework は、Microsoft .NET Framework 3.5 である必要があります (Microsoft .NET Framework 4 ではない)。ターゲット CPU は [Any CPU] または [x64] である必要があります。この選択については、「[方法] 適切なターゲット フレームワークおよび CPU を設定する」を参照してください。通常、ターゲット CPU は既定で [x86] になります。これを変更するには、ソリューション エクスプローラーでプロジェクト名を右クリックし、[プロパティ] を選択します。[ビルド] タブで [プラットフォーム ターゲット] ボックスの一覧を使って CPU を変更できます。 |
パフォーマンス カウンターをプログラムによって読み取る
次の手順は、SharePoint Foundation パフォーマンス監視 API を使用して、パフォーマンス カウンターを読み取る方法を示しています。オペレーティング システム (OS) の基礎パフォーマンス カウンター システムには繊細な部分が多数あります。たとえば、一部のカウンターについては、コードを使用して読み取りを 2 回行うまで、正確な値を取得できません。以下のトピック、およびコードで読み取る特定のカウンターについて理解しておくことをお勧めします。これらの多くが直接は関係のないマネージ API またはアンマネージ API に関するものですが、基礎システムに対する理解を深めるうえで役に立ちます。
Windows Performance Counters (英語) (およびこのノードの下位にあるトピック)
Introduction to Monitoring Performance Thresholds (英語) (およびこのノードの下位にあるトピック)
PerformanceCounter
また、コードで読み取るデータが含まれる各カウンターについて、サポート技術情報、ブログ、およびフォーラムのエントリを検索することもお勧めします。
注意
.NET Framework には、Windows Server 2008 パフォーマンス カウンターの値を読み取る API が用意されていますが、このトピックでは、読者が Microsoft SharePoint Foundation パフォーマンス監視および調整システムでの監視用に登録されたカウンターを確実に操作する必要があることを前提としています。
パフォーマンス カウンターを読み取るには
Microsoft Visual Studio でコンソール アプリケーション プロジェクトを作成し、ターゲットの .NET Framework と CPU プラットフォームを設定します。
Microsoft.SharePoint.dll への参照をコンソール アプリケーション プロジェクトに追加します。これは %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI にあります。
program.cs ファイル を開き、適切な名前空間とクラス名を設定し、System.Threading、Microsoft.SharePoint、Microsoft.SharePoint.Administration、および Microsoft.SharePoint.Utilities の using ステートメントを追加します。コードは次のようになります。
using System; using System.Threading; using Microsoft.SharePoint; using Microsoft.SharePoint.Administration; using Microsoft.SharePoint.Utilities; namespace Contoso.SharePoint.Utilities { class PerformanceCounterReader { static void Main(string[] args) { } // end Main } }
Main メソッド内で、読み取り対象のパフォーマンス モニターが含まれる Web アプリケーションへの参照を取得します。以下のコードはその方法を示しています。
static void Main(string[] args) { Uri webApplicationUri = new Uri("Http://localhost/"); SPWebApplication webApplication = SPWebApplication.Lookup(webApplicationUri); }
このトピックの残りのコードすべてが Main メソッドに追加されます。
Web アプリケーションの調整設定および登録済みモニターのコレクションへの参照を取得します。
SPHttpThrottleSettings throttleSettings = SPHttpThrottleSettings.GetHttpThrottleSettings(webApplication); SPSystemPerformanceMonitorCollection monitors = throttleSettings.GenerateMonitors();
読み取り対象の値が含まれるモニターへの参照を取得します。場合によっては、設計時にコレクション内におけるモニターの位置がわかるので、インデクサーを使用してそのモニターを参照できます。それが前回のカウンターの場合は、たとえば、SPSystemPerformanceCounterMonitor counterMonitor = (SPSystemPerformanceCounterMonitor)monitors[monitors.Count - 1]; という行を使用できます (モニター オブジェクトを、そのオブジェクトが所属する特定の非抽象モニター型にキャストする必要があることに注意してください)。また、Category プロパティ、Counter プロパティ、および Instance プロパティの特定の値セットが含まれるモニターを検索するコレクションに、反復処理を行わなければならない場合もあります。以下の例では、コードによって、すべての登録済みモニターに対してループ処理が実行され、Value プロパティが読み取られてから、名前と値が報告されます。
foreach (SPSystemPerformanceMonitor monitor in monitors) { SPSystemPerformanceCounterMonitor counterMonitor = (SPSystemPerformanceCounterMonitor)monitor; Console.WriteLine(counterMonitor.Name); // Read and display the counter value. double currentValue = Convert.ToDouble(counterMonitor.Value); Console.WriteLine(currentValue.ToString()); } Console.WriteLine("Press return to end application."); Console.Readline();
多くの種類のパフォーマンス カウンターについて、そのカウンターに対する最初の読み取りで必ず既定値が報告されることに注意してください。これはカウンターの値が 2 つの未加工データ ポイントの関数だからです。有効な値を取得するには、待機してから、カウンターに対して 2 回目の読み取りを行う必要があります。たとえば、監視対象のカウンターが Processor\% Processor Time\_Total の場合、有効な値を生成するには、コード呼び出しによる最初の読み取りの後、Value の get アクセサーに少なくとも 1 秒が必要です。コードによって有効な値が確実に取得されるようにするには、Sleep(Int32) の呼び出しを使用して 1 秒以上待機し、再度 Value を読み取ります。以下のコードは、これを示しています。
foreach (SPSystemPerformanceMonitor monitor in monitors) { SPSystemPerformanceCounterMonitor counterMonitor = (SPSystemPerformanceCounterMonitor)monitor; Console.WriteLine(counterMonitor.Name); // Read the counter value, wait 1.5 seconds, and read again for a valid value. double currentValue = Convert.ToDouble(counterMonitor.Value); Thread.Sleep(1500); currentValue = Convert.ToDouble(counterMonitor.Value); // Write the valid value to the screen. Console.WriteLine(currentValue.ToString()); } Console.WriteLine("Press return to end application."); Console.Readline();
ヒント 有効な値を取得したとき、その値が再度必要なった場合は、LastValue プロパティを使用します。Value を再度読み取ることにより、通常は異なる値である基礎カウンターの値が再度取得されます。