2

私が実行しているスクリプトのスニペット:

 $reader = $managementgroupobj.GetMonitoringPerformanceDataReader() 
 while ($reader.Read())    // << Error in this line.
 { 
      $perfData = $reader.GetMonitoringPerformanceData() 
      $valueReader = $perfData.GetValueReader($starttime,$endtime) 
      while ($valueReader.Read()) 
      { 
           $perfValue = $valueReader.GetMonitoringPerformanceDataValue()
      } 
 }

ここに、$managementgroupobjclass のインスタンスがありますManagementGroup

$starttime同じスクリプトの最後の実行に応じて、との差は$endtime15 分から 1 時間です。

スニペットは、パフォーマンス データを長期間にわたって正常に収集します。しかし、その後、どこからともなく次のエラーがスローされます。

「要求されたリーダーは有効ではありませんでした。リーダーが存在しないか、有効期限が切れています」

[ log_level=WARN pid=2716 ] Execute command 'get-scomallperfdata' failed. The requested reader was not valid. The reader either does not exist or has expired.
at GetSCOMPerformanceData, E:\perf\scom_command_loader.ps1: line 628
at run, E:\perf\scom_command_loader.ps1: line 591
at <ScriptBlock>, E:\perf\scom_command_loader.ps1: line 815
at <ScriptBlock>, <No file>: line 1
at <ScriptBlock>, <No file>: line 46
   at Microsoft.EnterpriseManagement.Common.Internal.ServiceProxy.HandleFault(String methodName, Message message)
   at Microsoft.EnterpriseManagement.Common.Internal.EntityObjectsServiceProxy.GetObjectsFromReader(Guid readerId, Int32 count)
   at Microsoft.EnterpriseManagement.Common.DataReader.Read()
   at CallSite.Target(Closure , CallSite , Object )
  • 上記のエラーの原因は何ですか?
  • PerformanceDataReader の仕組みを理解できれば幸いです。

ノート:

  • エラーが発生する前に取得したデータの量は 100k+ でした。そのデータを取得するのにほぼ 1 時間かかりました。
  • 可能性のある問題は、フェッチする必要があるデータの量にあったと思います.TimoutExceptionの一種である可能性があります.
  • 上記の質問された両方の言及について、少なくともある程度の知識が得られれば幸いです。

ありがとう。

4

2 に答える 2

2

最終目標はすべてのパフォーマンス データを別のツールにオフロードすることであるため、SCOM API では十分なパフォーマンスが得られないため、直接 SQL クエリを使用することをお勧めします。

背景のビット:

  1. SCOM には 2 つの DB があります。Operational は、ほぼ「リアルタイム」のパフォーマンス データを含む、すべての現在のステータスを保持します。データ ウェアハウス DB には、集計された (時間単位および日単位の) パフォーマンス データを含む履歴データが保持されます。以下のすべてのクエリは、運用 DB 用です。
  2. プラットフォームとしての SCOM は、あらゆるものを完全に監視できます。管理パックに実装されているため、各 MP は監視対象エンティティの新しいクラス (タイプ) や既存のクラスの新しいパフォーマンス カウンターを導入できます。たとえば、MP for SAN アプライアンスを作成して、そのパフォーマンス データの収集を開始できます。または、「ファイル数」カウンターを「Windows 論理ディスク」クラスに追加する別の MP を作成することもできます。

上記の点を念頭に置いて、以下のクエリは「Windows Computer」クラス (Unix サーバーを監視する場合は機能しないため、クラスを変更する必要があります) および関連するすべてのオブジェクトを対象としています。

手順 1: Windows コンピューターで使用可能なすべてのカウンターを名前で検索します。

注意: OS のバージョンと SCOM にインストールされている MP によって結果が異なる場合があります。

declare @ServerName as nvarchar(200) = 'server1.domain.local'

select pc.*
  from PerformanceCounterView pc
  join TypedManagedEntity tme on tme.TypedManagedEntityId = pc.ManagedEntityId
  join BaseManagedEntity bme on tme.BaseManagedEntityId = bme.BaseManagedEntityId
  where (bme.TopLevelHostEntityId = (select BaseManagedEntityId from BaseManagedEntity where FullName = 'Microsoft.Windows.Computer:'+@ServerName))
order by ObjectName, CounterName, InstanceName

手順 2:手順 1 で見つかった各カウンターの実際のパフォーマンス データを再試行します。

@SrcIdパラメータはPerformanceSourceInternalId、前のクエリの列です。

注意: SCOM のすべてのタイムスタンプは UTC です。以下のクエリは、現地時間で入力を受け入れ、現地時間でも出力を生成します。

declare @SrcID as int = XXXX
declare @End as datetime =  GETDATE()
declare @Start as datetime = DATEADD(HOUR, -4, @End)

declare @TZOffset as int = DATEDIFF(MINUTE,GETUTCDATE(),GETDATE())

SELECT SampleValue, DATEADD(MINUTE, @TZOffset, TimeSampled) as TS
  FROM PerformanceDataAllView
  where (PerformanceSourceInternalId = @SrcID)
        and (TimeSampled > DATEADD(MINUTE, -@TZOffset, @Start))
        and (TimeSampled < DATEADD(MINUTE, -@TZOffset, @End))

デフォルトでは、SCOM は過去 7 日間の「リアルタイム」パフォーマンスのみを保持し、その後、集計されてデータ ウェアハウスにオフロードされます。

これらのクエリを頻繁に呼び出したり、"NO LOCK" ステートメントを使用して、SCOM 自体のブロックを回避したりしないでください。

それが役立つことを願っています。

乾杯マックス

于 2018-05-08T23:37:19.957 に答える
0

trueリーダーが次の結果に移動した場合はリーダー呼び出しが返され、そうでfalseない場合は返されます。メソッドのドキュメントによると。例外が発生した場合、それらのいずれも実行できませんでした。あなたと SCCM インスタンスの間の接続が何かで切断されたと思います。

タイムアウトの問題である場合、SCCM タイムアウトかどうかはわかりません。エラーは、タイムアウトについては何も言いません。私の知る限り、これは内部の RPC 呼び出しであり、RPC にはタイムアウトがありません

クライアントがハングする原因は 2 つあります。ネットワーク接続が原因でサーバー リクエストが失われるか、サーバー自体がクラッシュする可能性があります。デフォルトのオプションでは、RPC が呼び出しをタイムアウトすることはなく、クライアント スレッドは永遠に応答を待ちます。

ファイアウォールが一定時間後に接続を閉じている可能性がありますか?

パフォーマンスをダイヤルインしたい場合は、キャッシュを検討してください。ご覧のスニペットよりもはるかに大きなスクリプトをお持ちのようです。これがオプションであることを認識させるためだけにこれを捨てます。

于 2018-05-07T14:29:42.377 に答える