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性能计数器监控实践的更多相关文章

  1. 使用windows性能计数器监控cpu使用率

    https://blog.csdn.net/yabingshi_tech/article/details/26672355 2. http://blog.51cto.com/qixue/1702557 ...

  2. 利用Windows性能计数器(PerformanceCounter)监控

    一.概述 性能监视,是Windows NT提供的一种系统功能.Windows NT一直以来总是集成了性能监视工具,它提供有关操作系统当前运行状况的信息,针对各种对象提供了数百个性能计数器.性能对象,就 ...

  3. paip.windows io监控总结

    paip.windows io监控总结 io的主要参数是个.disk queue length 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专 ...

  4. Windows 回调监控 <二>

    在之前的文章Windows 回调监控 <一> 总结了关于CreateProcessNotify,CreateProcessNotifyEx和LoadImageNotify一些用法,之后产生 ...

  5. Windows性能计数器2

    判断瓶颈 Ø 判断应用程序的问题 如果系统由于应用程序代码效率低下或者系统结构设计有缺陷而导致大量的上下文切换(context switches/sec显示的上下文切换次数太高)那么就会占用大量的系统 ...

  6. C# Windows IPSEC监控(仅此一家,别无分店)

    Windows IPSEC监控,使用C#编写,输出为一行字符串,可以按照既有IPSEC规则生成模板 using System; using System.Diagnostics; using Syst ...

  7. windows 进程监控 Procmon.exe

    windows 进程监控 Procmon.exe window下一个程序打开太慢,可以用此程序监控.在哪一步慢了,读取文件还是注册表. ProcessMonitor3.2 Process Monito ...

  8. Kubernetes监控实践

    一.Kubernetes介绍 Kubernetes(K8s)是一个开源平台,能够有效简化应用管理.应用部署和应用扩展环节的手动操作流程,让用户更加灵活地部署管理云端应用. 作为可扩展的容错平台,K8s ...

  9. 【译】Kubernetes监控实践(2):可行监控方案之Prometheus和Sensu

    本文介绍两个可行的K8s监控方案:Prometheus和Sensu.两个方案都能全面提供系统级的监控数据,帮助开发人员跟踪K8s关键组件的性能.定位故障.接收预警. 拓展阅读:Kubernetes监控 ...

随机推荐

  1. 元数据Meta

    元数据,指的是“除了字段外的所有内容”,例如排序方式.数据库表名.人类可读的单数或者复数名等等.所有的这些都是非必须的,甚至元数据本身对模型也是非必须的. 在模型中增加元数据,需要在模型类中添加一个子 ...

  2. Linux下 PostgrelSQL 基本操作

    一.在默认配置条件下,本机访问PostgreSQL 切换到Linux用户postgres,然后执行psql: $ su - postgres Last login: Wed Mar 1 13:16:4 ...

  3. JavaScript之 BOM 与 DOM

    1. JavaScript 组成 2. DOM.DOCUMENT.BOM.WINDOW 区别 DOM 是为了操作文档出现的 API , document 是其的一个对象:BOM 是为了操作浏览器出现的 ...

  4. MySQL之备份

    MySQL备份和备份 备份/还原 冷备:需要停止当前正在运行mysqld,然后直接拷贝或打包数据文件. 半热备:mysqldump+binlog --适合数据量比较小的应用 在线热备:AB复制 --实 ...

  5. harbor的安装和简单使用【h】

    安装docker的私有仓库, 利用vmware提供的harbor工具, 参考Docker 私有仓库方案比较与搭建, Harbor安装 -- 企业级Registry仓库 2.2harborProject ...

  6. Dynamic Property Wizard 添加类提示 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目 错误提示解决方式

    在重新打开OPM项目添加ATL动态属性向导Dynamic Property Wizard提示错误 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目. 有效的解决方式,右键 ...

  7. Django文档阅读之查询

    创建对象 为了在Python对象中表示数据库表数据,Django使用直观的系统:模型类表示数据库表,该类的实例表示数据库表中的特定记录. 要创建对象,请使用模型类的关键字参数对其进行实例化,然后调用s ...

  8. JIRA学习

    Jira是Atlassian公司出品的一款事务管理软件.无论是“需求”,还是“BUG”,或是“任务”,都是“事务”的一种,所以Jira可以胜任非常多的角色:需求管理.缺陷跟踪.任务管理等等……因为Ji ...

  9. Jetson TX2

    NVIDIA Jetson TX2作为一个嵌入式平台的深度学习端,具备不错的GPU性能,可以发现TX2的GPU的计算能力是6.2.这意味着TX2对半精度运算有着良好的支持,因此,完全可以在桌面端训练好 ...

  10. Windows MySql增量备份、完整备份采坑之路

    1.前言 这周公司交给我一个任务,负责项目Mysql数据库的备份,因为项目上线后数据是一个大问题,出了什么问题数据才是最大的问题,备份这时候就显得尤为重要, 公司项目的思路是:在项目系统设置内可以勾选 ...