Windows应用程序进程级别统一监控实践

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

一、         监控内容

众所周知,应用软件最终表现为应用程序,程序是指令、数据及其组织形式的描述,其本身没有任何运行的含义,是一个静态的概念;进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是程序的实体,是一个动态的概念。

进程的主要属性有:进程ID、进程名称、进程用户名称、进程状态、进程优先级、进程启动时间、包含的线程、使用的CPU时间、使用的内存、句柄等。进程的属性虽多,但根据笔者的应用实践,只要重点监控几个关键指标即可抓住进程的运行状态,进而对应用程序的健康状况做出正确的判断,并在发生故障前快速采取止损措施。

  1. 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),则可以对服务调用进行统一监控,从而可以统一计算服务可用性。

二、         监控方式

对进程级别的监控由于比较底层,一般采用两种手段:监控主动收集、进程埋点上报。

  1. 监控主动收集

主动收集又分为两种方式:通过系统接口获得机器上所有进程信息、通过性能计数器获得进程级别监控指标,两种方式都是非侵入式的,不会影响进程的正常运行,是首要考虑的监控方式。

2.进程埋点上报

埋点是一种常见的数据采集方式,在要精准获得进程级别监控数据时,代码埋点可能是最好的选择。比如前面提到的获得进程包含的活跃线程数,以及可用性指标,都需要进程埋点上报才能获得比较精确的监控指标。当然进程埋点并不需要对每个进程都做埋点开发,可以在框架层面进行统一埋点,从而降低埋点开发及实施成本。

三、         总结

只有深刻认识到进程级别监控涉及的监控内容及监控方式,才能更深入的掌握系统运行状态,并在系统开始恶化前针对不同进程指标快速做出点杀动作(比如通过自动运维进行有顺序的进程重启),从而做到及时止损。

原文地址:https://www.cnblogs.com/liugh/p/9733637.html

时间: 2024-07-30 13:46:16

Windows应用程序进程级别统一监控实践的相关文章

Windows下tomcat进程监控批处理程序

在Windows下tomcat进程监控批处理程序脚本如下: @echo off ::tomcat安装目录 set _tomcatDir=E:\myFiles\apache-tomcat-8.5.31 set _curlDir=E:\myFiles\apache-tomcat-8.5.31\curl set "httpcode=" ::访问tomcat cd /d %_curlDir% for /f "delims=" %%r in ('CURL.EXE -m 60

zabbix监控windows服务器上进程的内存使用情况

zabbix监控windows服务器上进程的内存使用情况 由于在windows服务器上不能像linux上一样使用top,或者类似于/pro目录下的数据信息,所以在在windows服务器上获得一个进程的内存或者CPU的使用情况不是很容易. 这里通过在windows服务器上使用python脚本获得进程的内存使用值,通过key传递给zabbix客户端,也就是本机上安装的zabbix客户端. windows上安装zabbix客户端网上的文章很多,这里不再记录. 1,首先安装python环境: 点击这里下

Linux 进程管理与监控(supervise and monit)

一.Supervisor 1.安装 宿主机环境:( Centos 6.5 ) pip2.7 install supervisor 2.创建配置文件 通过 echo_supervisord_conf 命令来创建配置文件: echo_supervisord_conf >/etc/supervisord.conf 3.主配置文件基本参数 [unix_http_server] file=/var/run/supervisor/supervisor.sock chmod=0700 chown=www:ww

关键两步+6个要点,让Windows应用程序享有K8S的绝佳优势

本文来自Rancher Labs 前? 言 实际上,没有一个迁移路径能够适用于将所有传统应用程序迁移到云.这些应用程序通常在物理机.虚拟机或本地.虽然一般情况下是重新设计应用程序架构以适用云原生服务,但这并非是唯一的答案.将一个现有的应用程序的架构重新构建为微服务架构或云原生架构会面临诸多挑战,如重构成本.复杂性以及应用程序的依赖性. 虽然将应用程序的架构现代化有诸多好处,但许多组织仍在Windows 2003 Servers上运行现有服务.而微软不再支持Windows 2003为此带来了一些挑

程序员级别鉴定书(.NET面试问答集锦)

作为一个.NET程序员,应该知道的不仅仅是拖拽一个控件到设计时窗口中.就像一个赛车手,一定要了解他的爱车 – 能做什么不能做什么. 本文参考Scott Hanselman给出的.NET问题列表,整理如下.包括WinForms,ASP.NET,XML以及C#和.NET基础相关的问题,有兴趣的自我检测一下吧- 参考答案另附在文章末尾,由于水平有限,难免有谬误,欢迎指正. 所有号称会写代码的人 进程和线程之间的区别? 什么是Windows服务,它的生命周期与标准的EXE程序有什么不同? Windows

程序员级别鉴定书 ----中级.NET开发者

面向接口.面向对象和面向方面编程区别 面向接口编程 是面向对象编程体系中的思想精髓之一 (博客园文章链接面向接口编程详解(一)——思想基础) 面向接口编程 接口是一组规则集合 面向对象编程 对具有相同行为和属性事物的封装 重用性.灵活性.扩展性 面向方面编程 (AOP面向方面编程) 接口和类的区别 关键字 class,interface 接口不能被实例化 接口支持多重继承 接口不去实现方法和属性 继承接口的类需要实现接口的所有方法 类可以被实例化 继承类的类不需要实现非abstract修饰的所有

数据平台运营实战之如何打造应用级别的监控系统

传统IT公司可能最核心的应用就是Web服务器和各种Web应用.得益于开源系统以及大数据理念的盛行,大大小小的公司逐渐形成了数据采集.存储.计算一体化的相似而又不同的架构.而在这些架构之上,我们可以丰富自己主营业务或者产品线的各种应用,或者说,技术团队有了这样的平台,我们可以更加方便的搭建各种应用程序.以前我们仅仅比较关注基础设置层面的监控(比如:服务器的load.内存使用.磁盘使用.CPU使用,像ganglia,zenoss就有这样的监控功能),在这些趋势的影响下,除了基础设施之外,我们不得不着

《程序员级别鉴定书》 ----中级.NET开发者

面向接口.面向对象和面向方面编程区别 面向接口编程 是面向对象编程体系中的思想精髓之一 (博客园文章链接面向接口编程详解(一)——思想基础) 面向接口编程 接口是一组规则集合 面向对象编程 对具有相同行为和属性事物的封装 重用性.灵活性.扩展性 面向方面编程 (AOP面向方面编程) 接口和类的区别 关键字 class,interface 接口不能被实例化 接口支持多重继承 接口不去实现方法和属性 继承接口的类需要实现接口的所有方法 类可以被实例化 继承类的类不需要实现非abstract修饰的所有

程序员级别鉴定书 ----会写代码级别

线程跟进程 一个程序至少有一个进程,一个进程至少有一个线程.线程的划分尺度小于进程,使得多线程程序的并发性高. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率. 线程在执行过程中跟进程有区别 线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制 进程具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.