Windows性能计数器监控实践
Windows性能计数器(Performance Counter)是Windows提供的一种系统功能,它能实时采集、分析系统内的应用程序、服务、驱动程序等的性能数据,以此来分析系统的瓶颈、监控组件的表现,最终帮助用户对系统进行合理调优。市面上采集Windows性能计数器指标的产品参差不齐,尤其在处理某类应用程序有多个进程实例时,采集的数据更是差强人意。所幸微软为码农精心准备了获得性能计数器指标的接口,用于灵活获得相关性能计数器指标值,但进程级别Windows性能计数器指标的采集监控,并没有想象的那么美好。因此本文结合笔者应用实践,探讨进程级别Windows性能计数器指标统一采集监控方案,以及在应用实践中遇到的坑,作为避坑指南,供感兴趣的同行参考。
进程级别Windows性能计数器指标作为特来电监控平台的一部分,对深入掌握系统进程级别运行状态,定位系统存在的问题,以便更快、更准的发现潜在的线上问题,起到了举足轻重的作用。
针对Windows性能计数器的监控,统一的采集监控方案如下所示:

性能计数器指标统一采集监控方案
本文重点关注指标管理与指标采集,对指标存储及指标展现只做概要阐述。
一、 指标管理
Windows性能计数器指标类别比较多,因此我们需要对关注的指标进行分类管理。针对进程级别监控,我们主要关注CLR以及进程相关类别指标:.NET CLR Memory、.NET CLR Exception、.NET CLR Jit、.NET CLR Loading、Process等。
一个Windows性能计数器主要由3个属性来标识:指标类别(Category Name)、指标名称(Counter Name)、指标实例(Instance Name)。为了能对某类应用程序的多个进程实例进行统一采集,我们不对指标实例进行管理,而对指标实例对应的进程名称进行管理,同时支持一个性能计数器指标关联多个进程名称,并且在运行时动态计算出每个进程名称对应的多个进程实例,从而大幅降低指标管理的工作量。
二、 指标采集
指标采集主要解决采集插件运行时的空间(采集范围)与时间(采集频率)问题。并不是所有机器都部署了我们关注的应用程序,因此需要通过采集范围,确定需要对哪些机器上的性能计数器指标进行采集,同时需要确定采集频率,比如10秒、1分钟、5分钟等。
虽然微软提供了性能计数器接口用于采集对应的指标值,但当一个应用程序有多个进程实例时(比如一个机器上部署了多个IIS站点,进程名称都是w3wp,在性能计数器中的实例名称是w3wp、w3wp#1、…、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与应用程序池的关联关系,是推荐方案。
三、 指标存储
指标存储在时序数据库中,每个性能计数器类别(Category Name)+性能计数器名称(Counter Name)对应一个指标表,表中按进程名称进行分类,每一行表示一个进程实例对应性能计数器实例的指标值。
四、 指标展现
指标展现可以按进程名称、进程实例、机器等维度进行分类聚合展现,相比登录到每个机器设置性能计数器,指标集中展现大幅提升了工作效率。
五、 总结
本文探讨了Windows性能计数器监控实践,主要涉及指标管理、指标采集、指标存储、指标展现四个方面,同时介绍了同一应用程序对应多个进程实例时,指标采集中遇到的坑。
Windows性能计数器监控实践的更多相关文章
- 使用windows性能计数器监控cpu使用率
https://blog.csdn.net/yabingshi_tech/article/details/26672355 2. http://blog.51cto.com/qixue/1702557 ...
- 利用Windows性能计数器(PerformanceCounter)监控
一.概述 性能监视,是Windows NT提供的一种系统功能.Windows NT一直以来总是集成了性能监视工具,它提供有关操作系统当前运行状况的信息,针对各种对象提供了数百个性能计数器.性能对象,就 ...
- paip.windows io监控总结
paip.windows io监控总结 io的主要参数是个.disk queue length 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...
- Windows 回调监控 <二>
在之前的文章Windows 回调监控 <一> 总结了关于CreateProcessNotify,CreateProcessNotifyEx和LoadImageNotify一些用法,之后产生 ...
- Windows性能计数器2
判断瓶颈 Ø 判断应用程序的问题 如果系统由于应用程序代码效率低下或者系统结构设计有缺陷而导致大量的上下文切换(context switches/sec显示的上下文切换次数太高)那么就会占用大量的系统 ...
- C# Windows IPSEC监控(仅此一家,别无分店)
Windows IPSEC监控,使用C#编写,输出为一行字符串,可以按照既有IPSEC规则生成模板 using System; using System.Diagnostics; using Syst ...
- windows 进程监控 Procmon.exe
windows 进程监控 Procmon.exe window下一个程序打开太慢,可以用此程序监控.在哪一步慢了,读取文件还是注册表. ProcessMonitor3.2 Process Monito ...
- Kubernetes监控实践
一.Kubernetes介绍 Kubernetes(K8s)是一个开源平台,能够有效简化应用管理.应用部署和应用扩展环节的手动操作流程,让用户更加灵活地部署管理云端应用. 作为可扩展的容错平台,K8s ...
- 【译】Kubernetes监控实践(2):可行监控方案之Prometheus和Sensu
本文介绍两个可行的K8s监控方案:Prometheus和Sensu.两个方案都能全面提供系统级的监控数据,帮助开发人员跟踪K8s关键组件的性能.定位故障.接收预警. 拓展阅读:Kubernetes监控 ...
随机推荐
- django-rest-framework 使用例子
Start Your API 创建项目 startproject rest_api 创建APP startapp task 配置 rest_api/settings.py INSTALLED_APPS ...
- datatables:initComplete和drawCallback比较
drawCallback: 对表的每个绘制事件执行操作非常有用 - 例如,您可能希望使用新显示的数据更新外部控件,或者启用服务器端处理,您可能希望将事件分配给新创建的元素.此回调旨在实现此目的,并将在 ...
- html中使用mathjax数学公式
测试用例: test.html: <!DOCTYPE html> <html> <head> <link rel="stylesheet" ...
- Photoshop如何自定义形状
Photoshop如何自定义形状,自定义形状定义一次,可以随便使用,而且形状无大小,填充后不会有像素问题,普通人可把常用的自定义成形状,很方便.PS中有一些自定义的形状,自己可以随便使用,但是不是很全 ...
- [LeetCode] 204. Count Primes 计数质数
Description: Count the number of prime numbers less than a non-negative number, n click to show more ...
- NOI2019 Fe
NFLS XY NOI2019 Fe Orz zsy,zhf,wqy,zjc,bly! Goodbye OI!
- SQL查询优化思维即SQL子查询
一. 什么叫子查询 定义及分类 子查询又称内部查询,而包含子查询的语句称之外部查询(又称主查询).所有的子查询可以分为两类,即相关子查询和非相关子查询. 非相关子查询是独立于外部查询的子查询,子查询总 ...
- 关于su下bash:xxx :command not found
今天在新建组的时候出了问题: $ su Password: # groupadd prj bash: groupadd :command not found 我就纳闷,明明是在su权限下,怎么还不能使 ...
- mysqlbinlog二三事儿
binlog的sql命令: SHOW VARIABLES LIKE 'log_%'; 查询各种log是否开启 SHOW MASTER STATUS; 查询当前binlog文件position状态 S ...
- PMBOK(第六版) PMP备考知识总汇!
记录本人学习PMBOK第六版的学习笔记. 备考知识总汇! PMBOK序章 PMP备考指南之相关事项介绍 PMP备考指南之第一章:引论 PMP备考指南之第二章:项目运作环境 PMP备考指南之第三章:项目 ...