gpt4 book ai didi

powershell - "The requested reader was not valid. The reader either does not exist or has expired"在 SCOM 中获取性能数据时出错

转载 作者:行者123 更新时间:2023-12-02 23:38:06 26 4
gpt4 key购买 nike

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

 $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 小时不等,具体取决于同一脚本的最后一次执行。

该代码段成功地收集了长时间的性能数据。但是,它突然抛出以下错误:

“请求的阅读器无效。阅读器不存在或已过期”
[ 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。
  • 如果我至少对上面提到的两个问题有所了解,那就太好了。

  • 谢谢。

    最佳答案

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

    一点背景:

  • SCOM 有两个 DB。 Operational 保存所有当前状态,包括几乎“实时”的性能数据。数据仓库数据库保存历史数据,包括汇总的(每小时和每天)性能数据。以下所有查询均针对操作数据库。
  • SCOM 作为一个平台可以监控任何东西——它在管理包中实现,所以每个 MP 可以引入被监控实体的新类(类型),和/或现有类的新性能计数器。假设您可以为 SAN 设备创建 MP 并开始收集其性能数据。或者您可以创建另一个 MP,这会将“文件数”计数器添加到“Windows 逻辑磁盘”类。

  • 记住以上几点,下面的查询是针对“Windows 计算机”类(因此如果您监视 Unix 服务器将不起作用,您需要更改类)和所有相关对象。

    第一步:按名称查找 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 本身。

    希望有帮助。

    干杯
    最大限度

    关于powershell - "The requested reader was not valid. The reader either does not exist or has expired"在 SCOM 中获取性能数据时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50097671/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com