一般的系统级别指标监控,更多关注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.进程埋点上报

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

三、总结

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

四、特来电云计算与大数据微信公众号

1.微信公众号名称:特来电云计算与大数据

2.二维码:

转载于:https://www.cnblogs.com/liugh/p/9733637.html

Windows应用程序进程级别统一监控实践相关推荐

  1. Windows下程序向Linux下移植实践

    一.问题的提出 在程序员中有这样一个说法,若一个程序不能移植到Linux下,那这个程序将看不到未来. 由于Linux操作系统源码公开是的,开发库等辅助工具都是源码公开的,这样就减少了程序的不可预知性, ...

  2. Windows 安装程序进程错误代码和错误信息列表

    错误代码 值 说明 --------------------------------------------------------------------------- ERROR_INSTALL_ ...

  3. windows 关闭程序进程命令

    查看程序进程情况 tasklist 关闭程序命令 taskll /im 程序id /f

  4. Linux 环境下针对进程维度的监控实现

    一.背景介绍 运维工作中可能会遇到这么一个痛点,因线上机器基本都是单机多实例,有时候会出现因为某个实例而影响了整个机器的性能.因缺少进程级别的监控,事后想分析是哪个实例跑满了系统资源往往比较困难.为了 ...

  5. Linux 环境-TiDB组件进程维度的监控实现

    作者: sustyle 原文来源: https://tidb.net/blog/ab175b65 [toc] 一.背景介绍 TiDB运维工作中可能会遇到这么一个痛点,组件太多,机器永远不够.线上机器基 ...

  6. 技术分享 | Linux 环境下针对进程维度的监控实现

    作者:莫善 某互联网公司高级 DBA. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.背景介绍 运维工作中可能会遇到这么一个痛点,因线上机器基 ...

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

    在Windows下tomcat进程监控批处理程序脚本如下: @echo off ::tomcat安装目录 set _tomcatDir=E:\myFiles\apache-tomcat-8.5.31 ...

  8. Windows性能计数器监控实践

    Windows性能计数器(Performance Counter)是Windows提供的一种系统功能,它能实时采集.分析系统内的应用程序.服务.驱动程序等的性能数据,以此来分析系统的瓶颈.监控组件的表 ...

  9. 诚之和:在 Linux 和 Windows 中快速找到 Java 应用程序进程 ID

    在这篇文章中,我们将讨论如何快速找到您的 Java 应用程序进程 ID.对于某些监控工具(如​yCrash ​),您需要将应用程序进程 ID 作为输入传递.如果您想查找包含多个不同选项的更详细的帖子来 ...

最新文章

  1. [JOISC2014]ストラップ
  2. 雷军旗下金山云冲刺IPO:3年营收74亿,小米系贡献23%,CEO王育林仅持股2.1%
  3. python词汇-基本 Python 词汇
  4. RTMPdump(libRTMP) 源代码分析 6: 建立一个流媒体连接 (NetStream部分 1)
  5. 有趣的python代码实例_Python之路:200个Python有趣的小例子一网打尽
  6. 【转】oracle in和exists、not in和not exists原理和性能探究
  7. Dalamud:FFXIV插件框架和API-源码
  8. 怎么制作自己的压缩软件
  9. springboot:运行(部署)时出现WebServerException: Unable to create tempDir.
  10. python 使用QPixmap显示图片扭曲、错位问题的解决
  11. linux设备如何获取经纬度,openlayers鼠标移动获取地图经纬度格式化的两种方式
  12. 安装doctrine
  13. 项目是如何死掉的?太过真实!哈哈哈~嗝~~
  14. 职业讨债人要失业了?人工智能就是这样让人乖乖还钱的…
  15. Vue——如何获取动态图片地址
  16. 畜牧业中资金问题的解决——活体贷技术和实现原理
  17. NmapToExcel 批量nmap写入xlsx
  18. C++ 实现太阳系行星系统
  19. python+OpenCV笔记(三十七):检测运动物体——使用MOG/KNN背景差分器
  20. JSON java 正则_9、正则表达式与JSON

热门文章

  1. awk 抓取文件子集
  2. 进击webpack 4 (基础篇一)
  3. 取余运算 C和python的区别
  4. mangodb collection level operations
  5. 《你的灯亮着吗》读书笔记1
  6. 智领先机 惠普推出家庭信息中心HIC
  7. 杨兴平离职完全是意料之中
  8. C++中 gets()函数
  9. potplayer设置前进后退时间
  10. python music21将音符转为mid格式音乐