Windows性能计数器(Performance Counter)是Windows提供的一种系统功能,它能实时采集、分析系统内的应用程序、服务、驱动程序等的性能数据,以此来分析系统的瓶颈、监控组件的表现,最终帮助用户对系统进行合理调优。市面上采集Windows性能计数器指标的产品良莠不齐,尤为在处理某类应用程序有多个进程实例时,采集的数据更是差强人意。所幸微软为码农精心准备了得到性能计数器指标的接口,用于灵活得到相关性能计数器指标值,但进程级别Windows性能计数器指标的采集监控,并无想象的那么美好。所以本文结合笔者应用实践,探讨进程级别Windows性能计数器指标统一采集监控方案,以及在应用实践中遇到的坑,做为避坑指南,供感兴趣的同行参考。数据库
进程级别Windows性能计数器指标做为特来电监控平台的一部分,对深刻掌握系统进程级别运行状态,定位系统存在的问题,以便更快、更准的发现潜在的线上问题,起到了举足轻重的做用。app
针对Windows性能计数器的监控,统一的采集监控方案以下所示:工具
性能计数器指标统一采集监控方案性能
本文重点关注指标管理与指标采集,对指标存储及指标展示只作概要阐述。spa
1、 指标管理插件
Windows性能计数器指标类别比较多,所以咱们须要对关注的指标进行分类管理。针对进程级别监控,咱们主要关注CLR以及进程相关类别指标:.NET CLR Memory、.NET CLR Exception、.NET CLR Jit、.NET CLR Loading、Process等。3d
一个Windows性能计数器主要由3个属性来标识:指标类别(Category Name)、指标名称(Counter Name)、指标实例(Instance Name)。为了能对某类应用程序的多个进程实例进行统一采集,咱们不对指标实例进行管理,而对指标实例对应的进程名称进行管理,同时支持一个性能计数器指标关联多个进程名称,而且在运行时动态计算出每一个进程名称对应的多个进程实例,从而大幅下降指标管理的工做量。orm
2、 指标采集blog
指标采集主要解决采集插件运行时的空间(采集范围)与时间(采集频率)问题。并非全部机器都部署了咱们关注的应用程序,所以须要经过采集范围,肯定须要对哪些机器上的性能计数器指标进行采集,同时须要肯定采集频率,好比10秒、1分钟、5分钟等。接口
虽然微软提供了性能计数器接口用于采集对应的指标值,但当一个应用程序有多个进程实例时(好比一个机器上部署了多个IIS站点,进程名称都是w3wp,在性能计数器中的实例名称是w3wp、w3wp#一、…、w3wp#n),进行指标采集的坑会比较多,这里介绍几个比较典型的问题。
因为性能计数器默认不显示进程ID,因此没法直接创建进程实例和性能计数器指标实例的关联关系,相同的性能计数器指标实例名称,可能属于一个或多个不一样的进程实例。
进程实例与性能计数器实例关联关系
好比在.NET CLR Memory和Process中实例名称同为w3wp#1的性能计数器,可能对应同一个进程实例,也可能对应不一样的进程实例,这是最诡异的坑!市面上一些监控产品没法准确采集同一应用程序对应多个进程实例的性能计数器指标值,可能与此有关。
为了能创建进程实例与性能计数器实例的关联关系,须要在显示性能计数器实例时带上进程ID。
方案一:修改注册表。但潜在的坑也很明显:只适用于.NET CLR Memory以及Process类别的性能计数器,同时可能会致使第三方监控工具失效,而且修改生产环境的注册表风险不可控,不是首选方案。
方案二:动态设置环境变量。针对.NET CLR相关的性能计数器,在调用性能计数器接口以前,进行以下环境变量设置:
Environment.SetEnvironmentVariable("COMPlus_ProcessNameFormat", "1"); |
该方案是进程级别的,设置后获得的性能计数器实例会自动带上进程ID,而且不会影响到全局设置或者其它应用程序,是推荐方案。
采集进程级别指标时,有时须要根据IIS站点进程ID得到对应的应用程序池以及物理路径:
经过进程ID得到应用程序池以及物理路径
方案一:调用WMI(Windows Management Instrumentation)接口得到应用程序池。
Select * from Win32_Process WHERE processID=PID |
该方案存在的坑:频繁调用会致使机器CPU飙升,不是首选方案。
方案二:调用Appcmd.exe命令得到应用程序池。
appcmd.exe list wp |
该方案经过命令得到结果后,只须要进行字符串解析,便可得到进程ID与应用程序池的关联关系,是推荐方案。
3、 指标存储
指标存储在时序数据库中,每一个性能计数器类别(Category Name)+性能计数器名称(Counter Name)对应一个指标表,表中按进程名称进行分类,每一行表示一个进程实例对应性能计数器实例的指标值。
4、 指标展示
指标展示能够按进程名称、进程实例、机器等维度进行分类聚合展示,相比登陆到每一个机器设置性能计数器,指标集中展示大幅提高了工做效率。
5、 总结
本文探讨了Windows性能计数器监控实践,主要涉及指标管理、指标采集、指标存储、指标展示四个方面,同时介绍了同一应用程序对应多个进程实例时,指标采集中遇到的坑。