5

この奇妙な問題に遭遇したとき、特定のパフォーマンスカウンターが運用サーバーで更新されない理由を理解しようとしていました-RawValue読み取り専用ではない場合、カウンターは異なる値を返すようです. 読み取り専用の場合は常にゼロで、読み取り専用でない場合は異なる値を示します。

これを示す私のPowerShellセッションは次のとおりです。

PS C:\Users\doron> $counter = new-object Diagnostics.PerformanceCounter
PS C:\Users\doron> $counter.CategoryName = "My category"
PS C:\Users\doron> $counter.CounterName = "My counter name"
PS C:\Users\doron> $counter.ReadOnly = 1
PS C:\Users\doron> $counter


CategoryName     : My category
CounterHelp      : My counter name
CounterName      : My counter name
CounterType      : NumberOfItems64
InstanceLifetime : Global
InstanceName     :
ReadOnly         : True
MachineName      : .
RawValue         : 0
Site             :
Container        :



PS C:\Users\doron> $counter.ReadOnly = 0
PS C:\Users\doron> $counter


CategoryName     : My category
CounterHelp      : My counter name
CounterName      : My counter name
CounterType      : NumberOfItems64
InstanceLifetime : Global
InstanceName     :
ReadOnly         : False
MachineName      : .
RawValue         : 20
Site             :
Container        :



PS C:\Users\doron> $counter.ReadOnly = 1
PS C:\Users\doron> $counter


CategoryName     : My category
CounterHelp      : My counter name
CounterName      : My counter name
CounterType      : NumberOfItems64
InstanceLifetime : Global
InstanceName     :
ReadOnly         : True
MachineName      : .
RawValue         : 0
Site             :
Container        :

サーバーは Windows 2008 R2 で、.NET 4.5 を実行しています。

重要な注意点は、他のすべてのパフォーマンス カウンターがこのように動作しているわけではなく、最近追加された一部のパフォーマンス カウンターのみであるということです (これらは機能しないものです)。他のすべてのカウンターの場合、RawValue id は、ReadOnly であるかどうかにかかわらず、常に同一です。

何がこれを引き起こしているのでしょうか?

4

1 に答える 1

5

パフォーマンス カウンターの作成方法と、誰がどの時点でカウンターを更新するかについて多くの情報を提供していないため、情報に基づいて推測し、2 つの違いを説明することしかできません。

RawValueいつReadOnly=Truevsの違いReadonly=False

MSDNによると:

読み取っているカウンターが読み取り専用の場合、RawValue プロパティを取得すると、プロパティが呼び出された時点でカウンターがサンプリングされます。このアクションは、NextSample メソッドの最初の呼び出しを行うことと同じです。

ソース: http://msdn.microsoft.com/de-de/library/system.diagnostics.performancecounter.rawvalue.aspx

実際、RawValue プロパティの実際のフレームワーク ソースを見ると、これを確認できます。

public long RawValue
{
  get
  {
    if (this.ReadOnly)
      return this.NextSample().RawValue;
    this.Initialize();
    return this.sharedCounter.Value;
  }
  ...
}

ReadOnlyMSDN は が に設定されている場合に何が起こるかを述べていませんがFalse、上記のコード スニペットを見ると、 によって作成されInitializeた内部sharedCounterオブジェクトの値を呼び出して返すことがわかりますInitializeInitializeただし、さまざまな場所で呼び出され、最初の呼び出しのみが実際にオブジェクトを初期化します。

コードがかなり複雑なため全体の流れはわかりませんでしたが、パフォーマンスカウンターが読み取り専用でない場合は値がキャッシュされるようで、古い値が表示されます。

考えられる説明

実際にテストをどのように行ったかを述べていないため、ここで推測する必要がありますが、値を更新する前にパフォーマンス カウンターを初期化すると、カウンターが更新された場合でも、毎回 RawValue が 0 であると見なされます。その間。

ReadOnly を True に設定し、RawValue を再度クエリするとすぐに、現時点で PerformanceCounter が持っている実際の値が表示されます。

興味深い実験はNextSample()、を使用する代わりに呼び出すことですRawValue。私の意見では、どちらの場合でも同じ結果が得られるはずです。

お役に立てれば!

于 2013-02-03T00:37:44.867 に答える