17

アプリケーション用のカスタム パフォーマンス カウンターをいくつか作成しています。カテゴリーとカウンターを作成するための単純な C# ツールを作成しました。たとえば、以下のコード スニペットは基本的に私が実行しているものです。次に、カウンターの生の値を際限なく更新する別のアプリを実行します。それが実行されている間、カウンターとダミー インスタンスは perfmon でローカルに表示されます。

私が抱えている問題は、私たちが使用している監視システムが、別のサーバーからリモートで表示するときに、作成したマルチインスタンス カウンターのインスタンスを表示できないことです。perfmon を使用してカウンタを参照すると、カテゴリとカウンタは表示されますが、インスタンス ボックスがグレー表示され、[すべてのインスタンス] を選択することも、[追加] をクリックすることもできません。他のアクセス方法を使用すると、[typeperf][1]同様の問題が発生します。

これがサーバーの問題なのかコードの問題なのかわかりません。これは、必要な本番環境でのみ再現可能です。私のデスクトップおよび開発サーバーでは、うまく機能します。私はすべてのサーバーのローカル管理者です。

CounterCreationDataCollection collection = new CounterCreationDataCollection();

var category_name = "My Application";
var counter_name = "My counter name";
CounterCreationData ccd = new CounterCreationData();
ccd.CounterType = PerformanceCounterType.RateOfCountsPerSecond64;
ccd.CounterName = counter_name;
ccd.CounterHelp = counter_name;
collection.Add(ccd);

PerformanceCounterCategory.Create(category_name, category_name, PerformanceCounterCategoryType.MultiInstance, collection);

次に、別のアプリでこれを実行して、ダミーのインスタンス データを生成します。

var pc = new PerformanceCounter(category_name, counter_name, instance_name, false);
while (true) {
   pc.RawValue = 0;
   Thread.Sleep(1000);
}
4

6 に答える 6

5

あなたのプログラムは、たまたま Windows 2008 R2 または別の 64 ビット Windows OS で実行されている 32 ビット プログラムですか? その場合は、「Performance Counter DLL Host」サービスが実行されていることを確認してください。このサービスにより、64 ビットおよびリモート プロセスは、32 ビット プロセスによって提供されるカウンターを照会できます。

于 2010-11-10T02:57:13.657 に答える
2

次のツールを使用して、WMI アクセス許可の調整を試みることができます: http://www.codeproject.com/KB/system/WmiSecurity.aspx

使用法:

WmiSecurity.exe /C="%computername%" /A /N=Root/CIMV2 /M=" DOMAIN\USER:REMOTEACCESS" /R
于 2010-12-09T19:11:24.300 に答える
1

これを見てからしばらく時間が経ちましたが、値を設定する前に NextValue を呼び出して、それが機能するかどうかを確認してみてください。一部のマシンでは機能するが、他のマシンでは機能しない理由は説明できません。

もう 1 つの興味深い点は、インスタンス名で実際に行われていることです。そこに予約文字が入っていないことを確認してください。そうしないと、あらゆる種類の悪いことが起こります。

実際にカウンターを読み取る別のアプリケーションをスピンアップすることで、名前の問題であるかどうかを判断できる場合があります。正常に読み取ることができ、perfmon が読み取れない場合は、PerfMon が正しく解釈できないようにフォーマットされた名前があることを意味します。

于 2010-11-23T23:48:19.967 に答える
1

(前のテキストを走り書き) リモート アクセスが問題だと思います (実際のコンピューターで試してください)。そうでない場合は、テストコンピューターで何か他のものを接続する方法を見つけてください(ディスプレイ付きのウィンドウの基本的な単純なパフォーマンスカウンター)。また、ダミーアプリの生の値を編集してテストします。

于 2010-10-19T21:18:15.453 に答える
0

リモート システムにカウンターを登録してみてください。

lodctr /M:manifest.man

それでもうまくいかない場合は、権限の問題である可能性があります。

于 2010-10-28T16:39:24.663 に答える
0

これもファイアウォールの問題である可能性があります。

リモート コンピューター (マルチインスタンス パフォーマンス カウンター アプリをホストしているコンピューター) で、ファイアウォール ソフトウェアが着信接続を許可していることを確認します。

  • Windows ファイアウォールでは、ワークステーション クラスのコンピューターで、"パフォーマンス ログと警告" 例外を有効にする必要があります。
  • セキュリティが強化された Windows ファイアウォールでは、サーバー クラスのコンピューターで、"パフォーマンス ログと警告 (DCOM-In)" および "パフォーマンス ログと警告 (TCP-In)" 受信規則を有効にする必要があります。

ファイアウォールが正しく構成されていることを確認するための C# コンソールの例を次に示します...

// Based on the MSDN-supplied C# example from:
// Adding and Removing Performance Counter Instances
// http://msdn.microsoft.com/en-us/library/8t39y5k1%28v=VS.71%29.aspx
using System;
using System.Diagnostics;
using System.Threading;

namespace CustomPerformanceCounters
{
    class Program
    {
        private const string categoryName = "Instance Category";
        private const string categoryHelp = "Instanced counter demonstration for StackOverflow.";
        private const string counterName = "Instance Counter";
        private const string counterHelp = "Instanced counter demonstration for StackOverflow.";

        static void RegisterCounter()
        {
            if (!PerformanceCounterCategory.CounterExists(counterName, categoryName))
            {
                PerformanceCounterCategory.Create(
                    categoryName
                    , categoryHelp
                    , PerformanceCounterCategoryType.MultiInstance
                    , counterName
                    , counterHelp
                    );
            }

        }

        static void RunCounter()
        {
            const string instance1 = "instance1";
            const string instance2 = "instance2";
            const string instance3 = "instance3";

            // Assumes category and counter have been created.
            PerformanceCounter myCounter = new PerformanceCounter(
                categoryName
                ,counterName
                , instance1
                , false
                );

            int currentValue = 0;
            int currentIncrement = 1;
            while (true)
            {
                currentValue += currentIncrement;
                if (currentValue > 99)
                {
                    currentIncrement = -1;
                }
                else if (currentValue < 1)
                {
                    currentIncrement = 1;
                }
                int instance1Value = currentValue;
                int instance2Value = 100 - currentValue;
                int instance3Value = Math.Abs(instance1Value - instance2Value);
                Console.WriteLine("Current values: {0}, {1}, {2}", instance1Value, instance2Value, instance3Value);

                myCounter.InstanceName = instance1;
                myCounter.RawValue = instance1Value;
                myCounter.InstanceName = instance2;
                myCounter.RawValue = instance2Value;
                myCounter.InstanceName = instance3;
                myCounter.RawValue = instance3Value;

                Thread.Sleep(1000);
            }
        }

        static void Main(string[] args)
        {
            RegisterCounter();
            RunCounter();
        }
    }
}
于 2010-11-26T02:02:09.213 に答える