Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 在SCOM中获取性能数据时出现“请求的读取器无效。读取器不存在或已过期”错误_Powershell_Scom - Fatal编程技术网

Powershell 在SCOM中获取性能数据时出现“请求的读取器无效。读取器不存在或已过期”错误

Powershell 在SCOM中获取性能数据时出现“请求的读取器无效。读取器不存在或已过期”错误,powershell,scom,Powershell,Scom,我正在执行的脚本片段: $reader = $managementgroupobj.GetMonitoringPerformanceDataReader() while ($reader.Read()) // << Error in this line. { $perfData = $reader.GetMonitoringPerformanceData() $valueReader = $perfData.GetValueReader($s

我正在执行的脚本片段:

 $reader = $managementgroupobj.GetMonitoringPerformanceDataReader() 
 while ($reader.Read())    // << Error in this line.
 { 
      $perfData = $reader.GetMonitoringPerformanceData() 
      $valueReader = $perfData.GetValueReader($starttime,$endtime) 
      while ($valueReader.Read()) 
      { 
           $perfValue = $valueReader.GetMonitoringPerformanceDataValue()
      } 
 }
上述错误的原因是什么。? 如果我能了解PerformanceDarReader的机制,那就太好了。 注:

它在获取错误之前获取的数据量为100k+。获取这些数据几乎花了一个小时。 我认为可能的问题是它必须获取的数据量,这可能是一种TIMOUTEException。 如果我至少对上面提到的两个问题都有所了解,那就太好了。
谢谢。

如果读卡器移动到下一个结果,则读卡器调用将返回true,否则返回false;据报道。如果您遇到异常,则无法执行这两个操作。我假设有什么东西破坏了您和SCCM实例之间的连接

如果是超时问题,我不确定是SCCM超时。该错误没有说明任何有关超时的信息。据我所知,这是一个隐藏的RPC调用,并且:

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

可能防火墙会在一段时间后关闭您的连接


如果你想拨打你的电话,考虑一下。看起来你有一个比我们看到的片段大得多的脚本。抛开它只是为了让您知道它是一个选项。

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

一点背景:

SCOM有两个DBs。Operational保存所有当前状态,包括几乎实时的性能数据。数据仓库数据库保存历史数据,包括聚合的小时和每日性能数据。下面的所有查询都是针对操作数据库的。 SCOM作为一个平台可以监控任何东西——它是在管理包中实现的,因此每个MP都可以引入新的类、受监控实体的类型和/或现有类的新性能计数器。比方说,您可以为SAN设备创建MP并开始收集其性能数据。或者您可以创建另一个MP,它将向Windows逻辑磁盘类添加文件数计数器。 记住以上几点,下面的查询是针对Windows计算机类的,因此如果您监视Unix服务器,则无法运行,您需要更改类和所有关联对象

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

注意!:结果可能会有所不同,具体取决于SCOM中安装的操作系统版本和MPs

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天的实时性能,然后将其聚合并卸载到数据仓库

不要太频繁地调用这些查询,也不要使用NOLOCK语句来避免阻塞SCOM本身

希望有帮助

干杯
Max

告诉我们:1抛出的是确切的异常,而不是描述。2抛出异常的是哪一行。3关于阅读问题,你说的是哪一个阅读调用?有两种。为什么要读取所有受监控对象的所有性能数据?我更愿意建议为特定对象(例如服务器、逻辑磁盘或网络端口)获取性能读取器。@Adam,我已经提到了您在问题中询问的更多细节。检查代码段和日志。同时,我理解了读者对象的意义。谢谢。@Max,我想出了一个可能解决这个问题的办法,但我不确定。它是这样的::我应该首先获取管理组中的对象列表。然后,对于每个对象,我应该创建一个读卡器,它将只获取该对象的数据。使用这种方法,可以解决仅从一个读取器获取大量数据的问题。这种方法看起来合适吗?@Jay,是的,如果您只读取与特定源类实例相关的性能数据,它将显著减少关联计数器和返回数据的数量。但请记住,它是递归的——也就是说,如果您请求计算机对象的读卡器,您将获得所有托管对象的数据,即磁盘。然而,我不得不先问:你想要实现什么?另外,您是否考虑过直接SQL查询?非常感谢@Max提供的详细答案。!!我真希望我能勾选这个作为答案。!!很抱歉,我不能回答这不是我在帖子中所问问题的确切答案,但这是一个很大的帮助,知识和整个代码的新方法。。!不用担心 s、 @Jay。谢谢你的反馈。
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))