我正在执行的脚本的片段:
$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 )
注意:
感谢。
答案 0 :(得分:2)
由于最终目标是将所有性能数据卸载到另一个工具,因此SCOM API将无法提供足够的性能,因此建议使用直接SQL查询。
一些背景知识:
记住以上几点,下面的查询是针对“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。看起来你有一个比我们看到的片段更大的脚本。抛出这个只是为了让你意识到它的选择。