"请求的读者无效。读者要么不存在要么已经过期了#34;在SCOM中获取性能数据时出错

时间:2018-04-30 09:31:39

标签: powershell scom

我正在执行的脚本的片段:

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

此处,$managementgroupobj是类ManagementGroup的实例。

$starttime$endtime的差异从15分钟到1小时不等,具体取决于上一次执行相同的脚本。

该代码段长时间成功收集数据的性能。但是,不知从哪里抛出以下错误:

&#34;请求的读者无效。读者不存在或已过期&#34;

[ 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 +。并且花了差不多一个小时来获取这些数据。
  • 我认为可能的问题是它必须提取的数据量,这可能是一种TimoutException。
  • 如果我至少了解上面提到的两个问题,那将会很棒。

感谢。

2 个答案:

答案 0 :(得分:2)

由于最终目标是将所有性能数据卸载到另一个工具,因此SCOM API将无法提供足够的性能,因此建议使用直接SQL查询。

一些背景知识:

  1. SCOM有两个DB。 Operational保持所有当前状态,包括几乎“实时”的性能数据。数据仓库数据库保存历史数据,包括聚合(每小时和每日)性能数据。以下所有查询均适用于Operational DB。
  2. SCOM作为一个平台可以监控任何事情 - 它在管理包中实现,因此每个MP可以引入新类(类型)的被监控实体,和/或现有类的新性能计数器。比如,您可以为SAN设备创建MP并开始收集其perf数据。或者您可以创建另一个MP,它会将“Number of Files”计数器添加到“Windows Logical Disk”类。
  3. 记住以上几点,下面的查询是针对“Windows计算机”类的(如果监视Unix服务器,则需要更改类,这将无法工作)和所有相关对象。

    步骤1:按名称查找Windows计算机的所有可用计数器。

    注意!:根据您的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本身。

    希望有所帮助。

    干杯 最大

答案 1 :(得分:0)

如果读者移动到下一个结果,则读者调用将返回true,如果没有,则返回false;根据{{​​3}}。如果你得到一个例外,它不可能做到这两个。我假设某些事情破坏了你和SCCM实例之间的联系。

如果是超时问题,我不确定它是否是SCCM超时。该错误并未说明超时。据我所知,这是一个RPC调用,method's documentation

  

您的客户端可以通过两种方式挂起:网络连接可以   导致服务器请求丢失,或者服务器本身可能崩溃。   使用默认选项,RPC永远不会超时调用您的客户端   线程将永远等待响应。

也许防火墙在一段时间后关闭了你的连接?

如果您想拨入演出,请考虑RPC doesn't have a timeout。看起来你有一个比我们看到的片段更大的脚本。抛出这个只是为了让你意识到它的选择。