应用上线后,为了长期稳定地服务客户,需要进行应用监控系统。监控系统可以对关键资源或者应用数据进行持续的监控,并且在监控对象发生异常的时候及时发送报警,方便开发人员或运维人员快速处理问题,保证应用稳定运行。本文介绍了应用监控的指标和应用进程监控。
1.应用监控指标
应用监控首先要对应用的一些主要性能指标进行监控,当这些指标有大的波动时,一 般都代表应用出现问题,这些指标主要包含吞吐量、响应时间和错误率。
吞吐量(Throughput)
每秒钟系统能够处理的请求数、任务数等。吞吐量的指标受到响应时间、服务器软硬 件配置、网络状态等多方面因素影响。服务器硬件配置越高,吞吐量越大。网络越差,吞 吐量越小。在低吞吐量下的响应时间的均值、分布比较稳定,不会产生太大的波动。在高 吞吐量下,响应时间会随着吞吐量的增长而增长,增长的趋势可能是线性的,也可能接近 指数。当吞吐量接近系统的峰值时,响应时间会出现激增。
响应时间(Responsiveness/Latency)
系统处理一个请求或者任务的耗时。响应时间的指标取决于具体的服务,如智能提示 一类的服务,返回的数据有效周期短(用户多输入一个字母就需要重新请求),对实时性要 求比较高。而导航一类的服务,由于返回结果的使用周期比较长(整个导航过程中),响应 时间也就比较长。对于响应时间的统计,应从均值、90 值、99 值、分布等多个角度统计, 而不仅仅是给出均值。
错误率(Error Rate)
一批请求处理结果中出错请求所占比例,比如 HTTP 请求中 4XX,5XX 请求所占的比 例。错误率和服务的具体实现及环境相关,比如在移动网络下,可能因为运营商或者网络 类型导致网络错误。
2.应用进程监控
应用进程监控的目标是确定我们的服务是否运行正常,最主要是要确定我们的应用进 程是一直运行的,如果应用进程因为异常终止了,也就谈不上提供服务了。在一些情况下, 应用进程虽然处于运行状态下,但无法正常对外提供服务,这也是我们监控的重点。
存活状态监控
应用进程可能会因为各种原因停止,比如机器资源不足(如 OOM)、内存非法访问等, 在这种情况下,监控系统需要及时发现进程的存活状态,以在进程退出时可以快速自动拉 起或者人工介入处理。
比如可以通过脚本定时检测的方式来检测目标进程是否存活,如果进程不存在,就自 动拉起,也可以通过系统或者一些第三方提供的工具来检测,如 Monit。
进程资源监控
每个进程都会消耗一定的系统资源,除了系统整体的资源监控,我们必须对单个应用 监控的 CPU、内存资源进行监控。如果操作系统整体资源使用率不高,但进程 CPU 或者内 存使用异常,那么一般都说明应用进程有问题。
运行状态监控
除了进程的系统资源监控,我们还必须了解进程的运行状态。进程的运行状态可能跟 具体的进程类型有关系,比如对 Java 进程,我们可能需要关心垃圾回收、内存使用、线程 状态等;对于缓存来说,可能需要监控缓存的命中情况;对于数据库来说,我们可能需要 监控慢查询的情况等。
Java 进程(JVM)监控
GC(Garbage Collection)监控
GC 会严重影响应用的吞吐量和延时,目前主流的 JVM 都提供了比较方便的工具来观 察 JVM 的性能。一般的 GC(Young GC,Full GC)数据都会包含 GC 的耗时、次数、GC 发生前的内存占用、GC 发生后的内存占用等数据,这些数据可以帮助你诊断 GC 是否已经 影响了应用的性能。
内存监控
内存配置不正确可能会影响 GC 性能,也可能因为内存不足导致 OOM,所以需要对 JVM 的内存(堆内存和非堆内存)使用进行监控,以便及时根据内存使用的趋势调整 JVM 配置。
线程监控
线程在运行过程中可能会因为锁等资源问题处理挂起或者死锁状态,如果没有线程相 关监控,就不能及时发现线程导致的问题。线程监控主要监控 JVM 中存活的线程数量,以 及各个线程的状态,及时对线程的状态进行评估,如果发现大量线程挂起或者线程死锁, 可以快速产生报警。
文章节选自《云文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著
https://sq.163yun.com/blog/article/221033523522015232