资讯详情

资讯详情

windows_exporter pagefile collector 详解:基于性能计数器与 GetPerformanceInfo 的 Windows 页面文件监控

可观测性指标监控【免费下载链接】windows_exporterPrometheus exporter for Windows machines项目地址https://gitcode.com/gh_mirrors/wi/windows_exporter点击查看免费下载本文以 docs/collector.pagefile.md 为核心结合 internal/collector/pagefile/pagefile.go 的实现源码完整讲解 windows_exporter 中 pagefile collector 的启用方式、指标清单与示例输出并深入剖析windows_pagefile_free_bytes与windows_pagefile_limit_bytes两项指标如何由 PDH 性能计数器Paging File和 Win32 APIGetPerformanceInfo联合计算而来帮助读者掌握 Windows 页面文件pagefile用量监控的采集原理与落地方法。pagefile collector 概览pagefile collector 用于暴露操作系统页面文件paging file即pagefile.sys的使用情况。在 Windows 中物理内存不足时虚拟内存会落到页面文件上当页面文件接近写满时系统可能出现内存分配失败、commit 超限等问题因此对它的容量与剩余空间进行持续监控是 Windows 主机监控中的常见需求。根据 collector 文档 的元信息该 collector 的关键属性如下属性值Metric name prefixpagefileData sourcePerformance counterPaging File、GetPerformanceInfoEnabled by default?No值得注意的是该 collector默认不启用README.md 的 collector 列表中 pagefile 一栏没有勾选标记。这一点也可以从源码得到印证pkg/collector/types.go 中定义的默认 collector 集合为const DefaultCollectors cpu,memory,logical_disk,physical_disk,net,os,service,systempagefile不在其中因此需要通过命令行或配置显式打开。文档中 Flags 一节明确写着 None即该 collector 不注册任何专属命令行参数。从源码看也一致pagefile.go 中NewWithFlags只是返回一个空的Collector{}而Config结构体为空结构体// internal/collector/pagefile/pagefile.go const Name pagefile type Config struct{} var ConfigDefaults Config{} func NewWithFlags(_ *kingpin.Application) *Collector { return Collector{} }这也意味着 pagefile collector 没有可调参数行为是确定的采集所有页面文件实例。启用方式命令行与配置文件通过--collectors.enabled启用在 cmd/windows_exporter/main.go 中exporter 通过 kingpin 注册了如下 flag--collectors.enabled逗号分隔的 collector 列表可使用[defaults]占位符代表所有默认启用的 collector--collectors.disabled要排除的 collector 列表用于从默认集合中移除某项。因此单独启用 pagefile collector只采集它.\windows_exporter.exe --collectors.enabledpagefile在保留默认 collector 的基础上追加启用.\windows_exporter.exe --collectors.enabled[defaults],pagefile--collectors.enabled的解析逻辑见 main.go 中的 expandEnabledCollectors它先把字符串中的[defaults]替换为DefaultCollectors常量再按逗号切分并去重。解析后的列表会经过 Collection.Enable 校验出现未知 collector 名会直接报unknown collector错误。通过库接口启用YAML 配置pagefile collector 也可以作为库被外部程序集成。在 pkg/collector/config.go 中其配置段以paging为 YAML 键名Paging pagefile.Config yaml:paging对应注册在 pkg/collector/collection.gocollectors[pagefile.Name] pagefile.New(config.Paging)这里有一个容易混淆的细节collector 的注册名是pagefile用于--collectors.enabled而库配置结构中的字段名/YAML 键是paging。由于pagefile.Config是空结构体配置文件中并不需要为它写任何字段了解这一命名差异即可避免查阅配置时产生困惑。指标清单与示例输出pagefile collector 暴露两个 gauge 指标均以页面文件路径作为file标签区分多个页面文件实例指标名说明类型标签windows_pagefile_free_bytesNumber of bytes that can be mapped into the operating system paging files without causing any other pages to be swapped out可映射进页面文件而无需换出其他页的字节数即剩余可用空间gaugefilewindows_pagefile_limit_bytesNumber of bytes that can be stored in the operating system paging files. 0 (zero) indicates that there are no paging files页面文件可存储的总字节数0 表示没有页面文件gaugefile这两个指标描述文本同时硬编码在 pagefile.go 的 Build 方法 中c.pagingLimitBytes prometheus.NewDesc( prometheus.BuildFQName(types.Namespace, Name, limit_bytes), Number of bytes that can be stored in the operating system paging files. 0 (zero) indicates that there are no paging files, []string{file}, nil, ) c.pagingFreeBytes prometheus.NewDesc( prometheus.BuildFQName(types.Namespace, Name, free_bytes), Number of bytes that can be mapped into the operating system paging files without causing any other pages to be swapped out, []string{file}, nil, )prometheus.BuildFQName以 internal/types/const.go 中的Namespace windows加上 collector 名pagefile和指标后缀拼接出最终的windows_pagefile_*名称。Example metric文档中给出的示例输出如下# HELP windows_pagefile_free_bytes OperatingSystem.FreeSpaceInPagingFiles # TYPE windows_pagefile_free_bytes gauge windows_pagefile_free_bytes{fileC:\\pagefile.sys} 6.025797632e09 # HELP windows_pagefile_limit_bytes OperatingSystem.SizeStoredInPagingFiles # TYPE windows_pagefile_limit_bytes gauge windows_pagefile_limit_bytes{fileC:\\pagefile.sys} 6.442450944e09从示例可以看出一台在C:\下配置了约 6 GB 页面文件的机器limit_bytes约为 6.44e9 字节free_bytes约为 6.03e9 字节二者之差即当前已被使用的页面文件空间。底层原理两个指标是如何计算出来的文档给出的数据源是 Performance counterPaging File,GetPerformanceInfo。结合源码完整的数据流如下1. PDH 采集Paging File对象的% Usage计数器collector 通过通用的 PDH 框架 internal/pdh/collector.go 采集性能计数器。在 Build 中c.perfDataCollector, err pdh.NewCollectorperfDataCounterValues), pdh.CounterTypeRaw, Paging File, pdh.InstancesAll, )参数含义pdh.CounterTypeRaw读取原始计数值而非格式化后的显示值Paging FileWindows 性能对象名pdh.InstancesAll即[*]采集所有实例——每个页面文件就是一个实例。采集哪些计数器由泛型结构体的perfdatatag 声明见 internal/collector/pagefile/types.gotype perfDataCounterValues struct { Name string Usage float64 perfdata:% Usage }pdh.NewCollector会扫描结构体字段按 tag 把计数器路径组装为\Paging File(*)\% Usage见 formatCounterPath并注册所有实例。采集结果按行填回perfDataCounterValuesName为实例名即页面文件路径Usage为% Usage计数器的原始值——在 Windows 中该计数器的 raw 值代表已使用的页面数这也是 collector 能把它当作页数使用的原因。2. 通过GetPerformanceInfo获取系统页大小把页数换算成字节需要系统的页大小。collector 调用 psapi.dll 的GetPerformanceInfoWin32 API其绑定见 internal/headers/psapi/psapi.go// PerformanceInformation is a wrapper of the PERFORMANCE_INFORMATION struct. type PerformanceInformation struct { cb uint32 CommitTotal uint CommitLimit uint CommitPeak uint PhysicalTotal uint PhysicalAvailable uint SystemCache uint KernelTotal uint KernelPaged uint KernelNonpaged uint PageSize uint HandleCount uint32 ProcessCount uint32 ThreadCount uint32 }GetPerformanceInfo()通过windows.NewLazySystemDLL(psapi.dll)延迟加载并调用该 API返回包含PageSize通常为 4096 字节在内的PERFORMANCE_INFORMATION结构。3. 计算 free 与 limitCollect 方法 的完整逻辑func (c *Collector) Collect(ch chan- prometheus.Metric, _ time.Duration) error { err : c.perfDataCollector.Collect(c.perfDataObject) if err ! nil { return fmt.Errorf(failed to collect Paging File metrics: %w, err) } gpi, err : psapi.GetPerformanceInfo() if err ! nil { return err } for _, data : range c.perfDataObject { fileString : strings.ReplaceAll(data.Name, \??\, ) file, err : os.Stat(fileString) var fileSize float64 // For unknown reasons, Windows doesnt always create a page file. Continue collection rather than aborting. if err nil { fileSize float64(file.Size()) } ch - prometheus.MustNewConstMetric( c.pagingFreeBytes, prometheus.GaugeValue, fileSize-(data.Usage*float64(gpi.PageSize)), fileString, ) ch - prometheus.MustNewConstMetric( c.pagingLimitBytes, prometheus.GaugeValue, fileSize, fileString, ) } return nil }三个实现细节值得注意limit_bytes取的是磁盘上页面文件的大小即os.Stat(pagefile).Size()而不是 PDH 计数器提供的最大可用值。页大小由GetPerformanceInfo提供因此文档把两者都列为数据源。实例名会剥离\??\前缀。PDH 报告的页面文件实例名是 NT 内核风格路径如\??\C:\pagefile.syscollector 用strings.ReplaceAll去掉前缀得到可供 Prometheus 查询的常规路径C:\pagefile.sys这也解释了示例指标中fileC:\\pagefile.sys的形态。页面文件不存在时不中断采集。代码注释说明 For unknown reasons, Windows doesnt always create a page file。若os.Stat失败fileSize保持 0limit_bytes输出 0与指标说明中0 表示没有页面文件的语义一致采集继续进行而非整体报错。从源码结构看这种降级继续的策略意味着个别实例异常不会影响其他实例的指标输出。综合起来指标的计算关系为windows_pagefile_limit_bytes{file} stat(pagefile).Size windows_pagefile_free_bytes{file} stat(pagefile).Size − 已用页数(% Usage raw) × PageSize注册、生命周期与测试注册到 collector 映射pagefile collector 在 pkg/collector/map.go 中被挂入 builders 映射pagefile.Name: NewBuilderWithFlags(pagefile.NewWithFlags),运行时所有启用的 collector 并发采集见 pkg/collector/collect.go 的collectAll每个 collector 的成败与耗时分别体现在 exporter 自带指标windows_exporter_collector_success{collectorpagefile}、windows_exporter_collector_duration_seconds{collectorpagefile}上可用于确认该 collector 是否在工作。单元测试与基准测试collector 的测试位于 internal/collector/pagefile/pagefile_test.gofunc BenchmarkCollector(b *testing.B) { testutils.FuncBenchmarkCollector(b, pagefile.Name, pagefile.NewWithFlags) } func TestCollector(t *testing.T) { testutils.TestCollector(t, pagefile.New, nil) }internal/utils/testutils/testutils.go 中的TestCollector会在真实 Windows 环境上执行Build与两次Collect把结果注册进prometheus.NewPedanticRegistry校验指标合法性并通过WINDOWS_EXPORTER_TEST_COLLECTORS环境变量区分 CI 预置环境与本地开发机后者遇到不支持的子系统会 skip。FuncBenchmarkCollector则循环执行Collect以测量单轮采集开销。实用查询与告警社区待补充需要如实说明按照 collector 文档 的当前状态Useful queries 与 Alerting examples 两个小节均标注为占位内容——This collector does not yet have useful queries, we would appreciate your help adding them!。也就是说仓库当前并未为该 collector 提供官方示例查询或告警规则这部分正是社区可以贡献的方向。如果要按 docs/collector-template.md 的结构贡献内容基于本文给出的两个指标合理的起点可以围绕页面文件剩余比例这类派生量展开例如以windows_pagefile_free_bytes / windows_pagefile_limit_bytes作为基础表达式。此外仓库中已有关于 commit 内存超限的 runbook docs/runbooks/windowsmemorycommithighusage.md 在排查步骤中明确提到了检查页面文件配置与容量Get-CimInstance Win32_PageFileUsage Get-CimInstance Win32_PageFileSetting Get-Volume这说明 pagefile 指标与内存 commit 告警场景是天然相关的commit limit 受物理内存与页面文件容量共同约束当windows_pagefile_free_bytes持续走低时往往是触发 commit 类告警的前兆之一。小结pagefile collector 通过 PDHPaging File(*)\% Usage计数器与 Win32GetPerformanceInfo的PageSize结合磁盘上pagefile.sys文件的实际大小计算出每个页面文件的limit_bytes总容量与free_bytes剩余空间两个 gauge 指标并以file标签支持多页面文件场景它默认不启用、无任何专属 flag启用方式为--collectors.enabledpagefile或[defaults],pagefile库集成的 YAML 键为paging页大小换算、\??\前缀剥离、页文件缺失时的降级策略等实现细节均可在 internal/collector/pagefile/pagefile.go 中直接核对官方查询与告警示例目前仍是社区待补充状态结合内存 commit 监控的 runbook 场景剩余空间比例是构建派生指标和告警的自然切入点。赞分享可观测性指标监控【免费下载链接】windows_exporterPrometheus exporter for Windows machines项目地址https://gitcode.com/gh_mirrors/wi/windows_exporter点击查看免费下载相关推荐windows_exporter msmq Collector基于性能计数器监控 MSMQ 消息队列windows_exporter msmq Collector基于性能计数器监控 MSMQ 消息队列 msmq collector 用于在 Windows 机可观测性指标监控windows_exporter 的 cpu 采集器详解基于 Windows 性能计数器的 CPU 监控指标、PromQL 查询与告警实践windows_exporter 的 cpu 采集器详解基于 Windows 性能计数器的 CPU 监控指标、PromQL 查询与告警实践 本文围绕 wind可观测性指标监控windows_exporter fsrmquota Collector 详解用 Prometheus 监控 FSRM 磁盘配额windows_exporter fsrmquota Collector 详解用 Prometheus 监控 FSRM 磁盘配额 本文以 fsrmquota可观测性指标监控创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →