Windows应用程序进程级别统一监控实践
一般的系统级别指标监控,更多关注CPU、内存、磁盘、网络等运行情况,对应用程序运行时的进程指标关注不够,导致不能深入了解系统运行状态。本文根据笔者应用实践,探讨一下进程级别监控涉及到的监控内容以及监控方式,供感兴趣的同行做参考。

一、监控内容
众所周知,应用软件最终表现为应用程序,程序是指令、数据及其组织形式的描述,其本身没有任何运行的含义,是一个静态的概念;进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是程序的实体,是一个动态的概念。
进程的主要属性有:进程ID、进程名称、进程用户名称、进程状态、进程优先级、进程启动时间、包含的线程、使用的CPU时间、使用的内存、句柄等。进程的属性虽多,但根据笔者的应用实践,只要重点监控几个关键指标即可抓住进程的运行状态,进而对应用程序的健康状况做出正确的判断,并在发生故障前快速采取止损措施。
- CPU
CPU描述了进程占用的计算资源,监控主要关注进程级别CPU的两种场景:High CPU、Low CPU。
当进程长时间处于High CPU状态时,除了正常负载高的情况,程序内部可能:
a.在不断产生大量异常
b.发生了死循环
c.在频繁做垃圾回收(Garbage Collection,GC)
当进程长时间处于Low CPU状态时,程序内部可能:
a.发生了死锁
b.发生了阻塞
2.内存
内存描述了进程占用的存储资源,由于Windows资源分为托管资源和非托管资源,因此监控进程级别的内存,应该关注同时包含这两种资源的提交内存(Commit Size)。
监控主要关注进程级别High Memory场景,当进程长时间处于High Memory状态时,程序内部可能:
a.发生了内存泄漏,对象一直被使用,无法及时释放
b.产生了内存碎片,导致内存溢出(Out Of Memory,OOM)
3.端口数
端口数描述了进程占用的网络资源,通过命令“netstat -ano”可以获得整个机器的网络端口数占用情况,但无法直接获得每个进程的网络端口数占用情况,因此需要对“netstat -ano”输出的进程ID做分组汇总,以便获得每个进程占用的端口数,从而对进程的监控深入一个层次。
当进程占用的端口数过高时,程序内部可能发生了端口泄漏。
4.活跃线程数
进程是线程的容器,一个进程可以包括多个线程,进程和线程都是CPU工作时间段的描述。线程具有生命周期,因此具有很多状态(新建、就绪、运行、阻塞、死亡),从Windows任务管理器看到的某个进程包含的线程数,是所有状态的线程数,监控粒度比较粗。
进程级别的线程监控,应该关注活跃线程数,也就是真正在运行的线程数,这可以通过如下方法得到:
|
private int GetActiveThreadCount() { int MaxWorkerThreads, miot, AvailableWorkerThreads, aiot; ThreadPool.GetMaxThreads(out MaxWorkerThreads, out miot); AvailableWorkerThreads = aiot = 0; ThreadPool.GetAvailableThreads(out AvailableWorkerThreads, out aiot); return MaxWorkerThreads - AvailableWorkerThreads; } |
当进程包含的活跃线程数过高时,程序内部可能发生了线程泄漏。
5.同一进程组流量分布
前面的几个指标关注的是单一进程,当不同机器上的进程组成一个集群时,需要同时关注这些进程组间的指标,比如流量分布。
当一个集群负载均衡的处理请求时,流量应该是均分到每一个处理进程的,如果监控到某一个进程处理的TPS远小于整个集群的平均TPS时,该进程很可能发生了阻塞或宕机
6.可用性指标
可用性指标是指可以作为度量系统死活点(Dead Live Point,DLP)的指标,一般关注两个方面:进程可用性、进程上运行的服务可用性。
进程可用性主要判断进程是否仍然存活,可以通过调用系统接口判断进程是否存在,也可以通过进程埋点上报心跳信息。
进程上运行的服务可用性主要关注服务运行的成功率或失败率,因此涉及到的业务因素比较多,限于篇幅不再展开。如果整个系统基于微服务框架,比如高速服务框架(High Speed Framework,HSF),则可以对服务调用进行统一监控,从而可以统一计算服务可用性。
二、监控方式
对进程级别的监控由于比较底层,一般采用两种手段:监控主动收集、进程埋点上报。
- 监控主动收集
主动收集又分为两种方式:通过系统接口获得机器上所有进程信息、通过性能计数器获得进程级别监控指标,两种方式都是非侵入式的,不会影响进程的正常运行,是首要考虑的监控方式。
2.进程埋点上报
埋点是一种常见的数据采集方式,在要精准获得进程级别监控数据时,代码埋点可能是最好的选择。比如前面提到的获得进程包含的活跃线程数,以及可用性指标,都需要进程埋点上报才能获得比较精确的监控指标。当然进程埋点并不需要对每个进程都做埋点开发,可以在框架层面进行统一埋点,从而降低埋点开发及实施成本。
三、总结
只有深刻认识到进程级别监控涉及的监控内容及监控方式,才能更深入的掌握系统运行状态,并在系统开始恶化前针对不同进程指标快速做出点杀动作(比如通过自动运维进行有顺序的进程重启),从而做到及时止损。
四、特来电云计算与大数据微信公众号
1.微信公众号名称:特来电云计算与大数据
2.二维码:

Windows应用程序进程级别统一监控实践的更多相关文章
- Windows下tomcat进程监控批处理程序
在Windows下tomcat进程监控批处理程序脚本如下: @echo off ::tomcat安装目录 set _tomcatDir=E:\myFiles\apache-tomcat-8.5.31 ...
- Windows性能计数器监控实践
Windows性能计数器(Performance Counter)是Windows提供的一种系统功能,它能实时采集.分析系统内的应用程序.服务.驱动程序等的性能数据,以此来分析系统的瓶颈.监控组件的表 ...
- Linux和windows 查看程序、进程的依赖库的方法
Linux: 1. 利用ldd查看可执行程序的依赖库 [root@~]# ldd /usr/local/php/bin/php linux-vdso.so.1 => (0x00007ff ...
- Kubernetes监控实践
一.Kubernetes介绍 Kubernetes(K8s)是一个开源平台,能够有效简化应用管理.应用部署和应用扩展环节的手动操作流程,让用户更加灵活地部署管理云端应用. 作为可扩展的容错平台,K8s ...
- 关键两步+6个要点,让Windows应用程序享有K8S的绝佳优势
本文来自Rancher Labs 前 言 实际上,没有一个迁移路径能够适用于将所有传统应用程序迁移到云.这些应用程序通常在物理机.虚拟机或本地.虽然一般情况下是重新设计应用程序架构以适用云原生服务, ...
- 【系统篇】从int 3探索Windows应用程序调试原理
探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...
- 程序员级别鉴定书(.NET面试问答集锦)
作为一个.NET程序员,应该知道的不仅仅是拖拽一个控件到设计时窗口中.就像一个赛车手,一定要了解他的爱车 – 能做什么不能做什么. 本文参考Scott Hanselman给出的.NET问题列表,整理如 ...
- Java程序优化的一些最佳实践(转)
衡量程序的标准 衡量一个程序是否优质,可以从多个角度进行分析.其中,最常见的衡量标准是程序的时间复杂度.空间复杂度,以及代码的可读性.可扩展性.针对程序的时间复杂度和空间复杂度,想要优化程序代码,需要 ...
- 第4章Zabbix监控实践
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...
随机推荐
- Oracle RAC 环境下的连接管理(转) --- 防止原文连接失效
崔华老师的文章!!! 这篇文章详细介绍了Oracle RAC环境下的连接管理,分别介绍了什么是 Connect Time Load Balancing.Runtime Connection Load ...
- 再谈C#委托与事件
之前写过一篇关于C#委托与事件的文章(见<C#委托和事件例析>),不过还是收到一些网友的提问.所以,今天再换另一个角度来详解一下这个问题. 一.在控制台下使用委托和事件 我们都知道,C#中 ...
- #ifdef、#ifndef、#else、#endif执行条件编译
我们开发的程序不只在pc端运行,也要在移动端运行.这时程序就要根据机器的环境来执行选择性的编译,如对PC端编译PC端的程序,对移动端编译移动端的程序,这里我们就可以用两组条件编译. ...
- Spring Security 与 OAuth2 介绍
个人 OAuth2 全部文章 Spring Security 与 OAuth2(介绍):https://www.jianshu.com/p/68f22f9a00ee Spring Security 与 ...
- piplinedb 安装配置
piplinedb不能使用root用户操作,提前建好用户 [root@yzh-jkb-privatization /]# useradd steven [root@yzh-jkb-privatizat ...
- linux比较文件夹的差异命令
可以使用 diff -ruNa s1 s2 或者使用 diff -uN c1 c2 结果如下: sandbox$ tree . |-- dir1 | |-- a.txt | `-- b.txt `-- ...
- 将本地代码提交到github
最近练习了freemarker 做了个代码生成工具,想提交到github上,在本地进行了提交,执行如下些命令 git init git add . * git commit -m "comm ...
- 「每日一码」(精品代码,质量保证)empty和undefined
将每天看到的优秀的代码或者特别的实现,记录下来 2019-2-26 empty和undefined 数组的filter,以下输出结果是什么 var arr = [1,2,3]; arr[10] = 9 ...
- Netbeans 8.0配置Python开发环境
1. 菜单栏:工具->插件->设置->添加 配置如下信息: http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/last ...
- C# WebApi 返回JSON
在默认情况下,当我们新建一个webapi项目,会自动返回XML格式的数据,如果我们想返回JSON的数据,可以设置下面的三种方法. 1. 不用改配置文件,在Controller的方法中,直接返回Http ...