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. 手工下载php的composer软件包,如何让项目自动加载包里的类

    有的时候需要手工下载php的composer包 1.将下载好的包放到项目的vendor目录下,比如包名:pinguo/php-aop 2.然后查看软件包目录(vendor/pinguo/php-aop ...

  2. [LeetCode] 128. Longest Consecutive Sequence 求最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  3. openstack keystone 命令详细

    命令使用之前需要  运行命令行“. admin-openrc” 用户(User) 查看用户列表 openstack user list 创建用户 openstack user create [-h] ...

  4. Mac和window实现双向数据传输

    Mac和window实现双向数据传输 总体步骤:第一步,在window上设置开发访问权限,然后选择要共享的磁盘或者文件夹第二步,在Mac上使用 Finder里面的网络,command+K,选择一个IP ...

  5. Python: ImportRequestsError: No module named 'requests'解决方法

    运行Python程序时,出现下面错误: import requests  ModuleNotFoundError: No module named ‘requests’ 原因:没有导入requests ...

  6. QT虚拟小键盘设计--qt事件循环,事件发送的理解

    有人讲到QT5.7及其以后的版本才自带免费的小键盘插件. QT5.10中关于QKeyEvent类:点击打开链接 QT sendEvent和PostEvent, 点击打开链接 my god,我今天安装了 ...

  7. LeetCode 503. 下一个更大元素 II(Next Greater Element II)

    503. 下一个更大元素 II 503. Next Greater Element II 题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 ...

  8. LeetCode第152场周赛(Java)

    这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...

  9. 摘要 - Digest

    首先从md5说起,一般新进入开发行业最先接触的就是md5了,md5本质上是一个hash(谐音:哈希)算法,可以从一个大文件信息中提取出一小段信息,叫提取摘要,有的地方也有提取指纹这种说法,其实指纹这个 ...

  10. Go语言变量的初始化

    正如上一节<Go语言变量声明>中提到的 Go语言在声明变量时,自动对变量对应的内存区域进行初始化操作.每个变量会初始化其类型的默认值,例如: 整型和浮点型变量的默认值为 0. 字符串变量的 ...