Windows服务器运维中,perfmon(性能监视器)定制数据收集器集是一套非常实用的系统化监控方案。它不是简单地打开任务管理器看一眼CPU占用,而是通过创建自定义的数据收集器集(Data Collector Set),把你关心的性能计数器、采样频率、日志存储路径、触发条件全部配置好,让系统自动、持续、精准地采集性能数据。这套东西特别适合做长期趋势分析、故障回溯、容量规划和SLA报告输出。很多运维人员只会用perfmon手动看实时图表,却不知道它背后有一整套"数据收集器集"的定制机制,这篇文章就把这套机制从头到尾讲透。
什么是perfmon数据收集器集,为什么要定制
perfmon是Windows自带的性能监控工具,核心组件叫"可靠性和性能监视器"。它有两种工作模式:一种是实时查看,打开就看,关掉就没数据了;另一种就是数据收集器集,它会按照你设定的规则,在后台持续把性能数据写入日志文件或者数据库。定制的意思就是,你不用系统默认的那几个模板,而是自己选计数器、自己定间隔、自己设存储位置、自己配触发条件。
为什么要这么做?因为默认模板太粗糙。比如默认的"System Performance"采集集只采了一部分基础计数器,间隔还是15秒,对于排查间歇性卡顿、磁盘IO尖峰、内存泄漏这类问题远远不够。你需要的是针对自己业务场景的精准采集方案,比如SQL Server跑在这台机器上,你就要重点盯SQL相关计数器;如果是IIS Web服务器,你就要盯ASP.NET和HTTP请求相关的指标。定制才有价值。
数据收集器集的三种类型
Windows perfmon支持三种数据收集器集类型,搞清楚它们的区别是第一步:
第一种是"性能计数器"类型(Performance Counter),这是最常用的,采集的是系统和应用的各类性能计数器数据,比如CPU使用率、内存可用字节、磁盘读写队列长度等。数据默认存为.blg二进制日志文件,也可以导出为CSV。
第二种是"事件跟踪数据"类型(Event Trace Data),这个采集的是ETW(Event Tracing for Windows)事件,适合做深度诊断,比如跟踪进程启动、线程切换、磁盘IO的详细调用栈。数据量大,分析门槛高,但信息非常丰富。
第三种是"配置"类型(Configuration),这个不采集数据,而是用来记录和恢复系统配置信息,比如注册表设置、服务状态等,适合做变更审计。
绝大多数运维场景用第一种就够了,下面重点讲怎么定制它。
手动创建定制数据收集器集的完整步骤
打开方式很简单,运行perfmon.msc,左侧导航栏找到"数据收集器集",右键点击"用户定义",选择"新建"→"数据收集器集"。给它起个有意义的名字,比如"SQLServer-IO-Monitor"或者"WebServer-Full-Trace"。
创建之后,右键这个新建的集合,选"属性"。这里面有几个关键选项卡要配置:
1. 常规选项卡
这里设置采样间隔。默认是15秒,但如果你要抓尖峰,建议设成1秒到5秒。注意,间隔越短数据量越大,对磁盘和CPU也有轻微影响,生产环境一般5秒是个平衡点。如果是排查间歇性问题,可以临时设成1秒,问题解决后改回来。
2. 数据收集器集成员选项卡
这里是核心,点"添加"按钮来选你要采集的计数器。Windows把计数器分成很多类别:Processor、Memory、PhysicalDisk、Network Interface、ASP.NET、SQLServer等等。你需要根据业务场景勾选。
举个具体例子,如果你的服务器跑SQL Server,建议添加这些计数器:
Processor(_Total)\% Processor Time Memory\Available MBytes PhysicalDisk(_Total)\Avg. Disk Queue Length PhysicalDisk(_Total)\Avg. Disk sec/Read PhysicalDisk(_Total)\Avg. Disk sec/Write SQLServer:Buffer Manager\Buffer cache hit ratio SQLServer:Buffer Manager\Page life expectancy SQLServer:Databases(*)\Transactions/sec SQLServer:Locks(*)\Lock Waits/sec SQLServer:General Statistics\User Connections
如果是IIS Web服务器,重点加这些:
Processor(_Total)\% Processor Time Memory\Available MBytes Network Interface(*)\Bytes Total/sec Web Service(*)\Current Connections Web Service(*)\ISAPI Extension Requests/sec ASP.NET Applications(*)\Requests/Sec ASP.NET Applications(*)\Request Execution Time ASP.NET\Requests Queued
选好之后,每个计数器下面还可以设"实例",比如PhysicalDisk你可以选具体的磁盘C:、D:,也可以选_Total看总量。根据需求来。
3. 目录选项卡
这里设置日志文件存放路径。默认在C:\PerfLogs,生产环境建议改到非系统盘,比如D:\PerfLogs。还要注意设置日志文件大小上限和覆盖策略,一般设成单文件最大100MB,超过自动生成新文件,保留最近30天的数据就够了。
4. 计划选项卡
这里可以设定数据收集器的启动和停止方式。可以设成手动启动、按计划定时启动、或者设成"启动时开始,停止时结束"。对于长期监控,建议设成开机自动启动,配合Windows任务计划或者服务来管理。
用命令行和XML批量部署数据收集器集
手动创建适合单台机器,但如果你要管理几十台、上百台服务器,手动点鼠标就不现实了。好在perfmon支持命令行工具logman.exe,可以通过命令行创建、启动、停止、删除数据收集器集。
创建一个数据收集器集的命令格式如下:
logman create collection "MyCustomCollector" -o "D:\PerfLogs\MyCustom" -cf "D:\Templates\counters.txt" -si 5 -f bin -max 100 -c "Processor(_Total)\% Processor Time" "Memory\Available MBytes"
解释一下参数:-o指定输出路径,-cf指定计数器配置文件(可以把常用计数器写在txt文件里批量导入),-si是采样间隔秒数,-f是日志格式(bin或csv),-max是单文件最大MB数,-c后面跟具体计数器。
更高级的玩法是先导出一个现有数据收集器集的XML模板,然后用XML来批量部署。导出命令:
logman export "MyCustomCollector" -xml "D:\Templates\MyCustomCollector.xml"
导入到另一台机器:
logman import "D:\Templates\MyCustomCollector.xml" -xml
这套方法特别适合用PowerShell脚本批量下发。写一个PS脚本,遍历服务器列表,把定制好的XML模板导入到每台机器上,再启动对应的收集器,整个过程可以自动化。
数据分析和可视化:采了数据怎么用
数据采下来只是第一步,关键是怎么看。perfmon自带的查看器可以打开.blg文件,但功能有限。更好的做法是把数据导出成CSV格式,然后用Excel、Power BI或者专门的监控平台来做分析。
导出CSV的方法:在perfmon里右键数据收集器集→"属性"→把日志格式从bin改成csv,或者用relog命令转换:
relog -f csv "D:\PerfLogs\MyCustomCollector\000001.blg" -o "D:\PerfLogs\MyCustomCollector.csv"
拿到CSV之后,你可以做这些事情:画CPU和内存的趋势图,看高峰期和低谷期;把磁盘IO和业务请求量做叠加对比,找瓶颈;计算Page Life Expectancy的平均值,判断SQL Server内存是否够用;看Lock Waits趋势,判断是否有锁竞争加剧的情况。
如果你有更大的需求,比如集中管理几十台服务器的性能数据,可以考虑把CSV定期导入到InfluxDB、Prometheus(通过telegraf的perfcounter插件)或者Zabbix、Grafana这类监控平台,做统一的仪表盘展示和告警。
定制数据收集器集的最佳实践和避坑指南
第一,不要贪多。很多人一上来就把所有计数器都加上,结果日志文件一天就几个GB,系统性能也受影响。原则是:先明确你要解决什么问题,再选对应的计数器。排查CPU问题就盯Processor和Process相关,排查IO就盯PhysicalDisk和LogicalDisk,排查网络就盯Network Interface。
第二,采样间隔要合理。实时排障用1-3秒,长期趋势监控用30-60秒甚至更长。不要所有场景都用1秒,那是浪费资源。
第三,注意日志轮转。一定要设单文件大小上限和保留策略,否则日志文件会把磁盘撑满。生产环境建议单文件不超过200MB,保留15-30天。
第四,定期验证。创建完数据收集器集之后,手动启动一次,确认数据确实在写入,计数器没有报错。有些计数器在某些系统版本上不存在或者名称有变化,要提前测试。
第五,配合任务计划做自动化。可以用Windows任务计划程序设定服务器重启后自动启动数据收集器,或者用组策略(GPO)统一下发到域内所有服务器,实现标准化运维。
第六,文档化。把每个数据收集器集的用途、包含的计数器、采样频率、存储路径都记录下来,形成运维文档。人员交接的时候不会两眼一抹黑。
总结
perfmon定制数据收集器集是Windows服务器运维中被严重低估的工具。它免费、原生、轻量,但功能强大。从手动创建到命令行批量部署,从实时采样到长期趋势分析,这套体系能帮你建立起一套完整的性能数据基础设施。关键在于根据业务场景精准定制,而不是盲目采集。把这套方法用好,你的服务器运维会从"出了问题再查"变成"提前发现、主动优化",这才是真正的专业运维。
