上一节,我带你学习了,如何使用 USE 法来监控系统的性能,先简单回顾一下。网络
系统监控的核心是资源的使用状况,这既包括 CPU、内存、磁盘、文件系统、网络等硬件资源,也包括文件描述符数、链接数、链接跟踪数等软件资源。而要描述这些资源瓶颈,最简单有效的
方法就是 USE 法。架构
USE 法把系统资源的性能指标,简化为了三个类别:使用率、饱和度以及错误数。 当这三者之中任一类别的指标太高时,都表明相对应的系统资源可能存在性能瓶颈。分布式
基于 USE 法创建性能指标后,咱们还须要经过一套完整的监控系统,把这些指标从采集、存储、查询、处理,再到告警和可视化展现等贯穿起来。这样,不只能够将系统资源的瓶颈快速暴露出
来,还能够借助监控的历史数据,来追踪定位性能问题的根源。函数
除了上一节讲到的系统资源须要监控以外,应用程序的性能监控,固然也是必不可少的。今天,我就带你一块儿来看看,如何监控应用程序的性能。微服务
跟系统监控同样,在构建应用程序的监控系统以前,首先也须要肯定,到底须要监控哪些指标。特别是要清楚,有哪些指标能够用来快速确认应用程序的性能问题。工具
对系统资源的监控,USE 法简单有效,却不表明其适合应用程序的监控。举个例子,即便在 CPU使用率很低的时候,也不能说明应用程序就没有性能瓶颈。由于应用程序可能会由于锁或者 RPC
调用等,致使响应缓慢。性能
因此,应用程序的核心指标,再也不是资源的使用状况,而是请求数、错误率和响应时间。这些指标不只直接关系到用户的使用体验,还反映应用总体的可用性和可靠性。学习
有了请求数、错误率和响应时间这三个黄金指标以后,咱们就能够快速知道,应用是否发生了性能问题。可是,只有这些指标显然仍是不够的,由于发生性能问题后,咱们还但愿可以快速定
位“性能瓶颈区”。因此,在我看来,下面几种指标,也是监控应用程序时必不可少的。搜索引擎
第一个,是应用进程的资源使用状况,好比进程占用的 CPU、内存、磁盘 I/O、网络等。使用过多的系统资源,致使应用程序响应缓慢或者错误数升高,是一个最多见的性能问题。spa
第二个,是应用程序之间调用状况,好比调用频率、错误数、延时等。因为应用程序并非孤立的,若是其依赖的其余应用出现了性能问题,应用自身性能也会受到影响。
第三个,是应用程序内部核心逻辑的运行状况,好比关键环节的耗时以及执行过程当中的错误等。因为这是应用程序内部的状态,从外部一般没法直接获取到详细的性能数据。因此,应用程序在
设计和开发时,就应该把这些指标提供出来,以便监控系统能够了解其内部运行状态。
有了应用进程的资源使用指标,你就能够把系统资源的瓶颈跟应用程序关联起来,从而迅速定位因系统资源不足而致使的性能问题;
基于这些思路,我相信你就能够构建出,描述应用程序运行状态的性能指标。再将这些指标归入咱们上一期提到的监控系统(好比 Prometheus + Grafana)中,就能够跟系统监控同样,一方
面经过告警系统,把问题及时汇报给相关团队处理;另外一方面,经过直观的图形界面,动态展现应用程序的总体性能。
除此以外,因为业务系统一般会涉及到一连串的多个服务,造成一个复杂的分布式调用链。为了迅速定位这类跨应用的性能瓶颈,你还可使用 Zipkin、Jaeger、Pinpoint 等各种开源工具,
来构建全链路跟踪系统。
好比,下图就是一个 Jaeger 调用链跟踪的示例。
全链路跟踪能够帮你迅速定位出,在一个请求处理过程当中,哪一个环节才是问题根源。好比,从上图中,你就能够很容易看到,这是 Redis 超时致使的问题。
全链路跟踪除了能够帮你快速定位跨应用的性能问题外,还能够帮你生成线上系统的调用拓扑图。这些直观的拓扑图,在分析复杂系统(好比微服务)时尤为有效
性能指标的监控,可让你迅速定位发生瓶颈的位置,不过只有指标的话每每还不够。好比,一样的一个接口,当请求传入的参数不一样时,就可能会致使彻底不一样的性能问题。因此,除了指标
外,咱们还须要对这些指标的上下文信息进行监控,而日志正是这些上下文的最佳来源。对比来看,
对日志监控来讲,最经典的方法,就是使用 ELK 技术栈,即便用 Elasticsearch、Logstash 和Kibana 这三个组件的组合。
以下图所示,就是一个经典的 ELK 架构图:
这其中,
下面这张图,就是一个 Kibana 仪表板的示例,它直观展现了 Apache 的访问概况。
值得注意的是,ELK 技术栈中的 Logstash 资源消耗比较大。因此,在资源紧张的环境中,咱们每每使用资源消耗更低的 Fluentd,来替代 Logstash(也就是所谓的 EFK 技术栈)。
今天,我为你梳理了应用程序监控的基本思路。应用程序的监控,能够分为指标监控和日志监控两大部分:
在跨多个不一样应用的复杂业务场景中,你还能够构建全链路跟踪系统。这样能够动态跟踪调用链中各个组件的性能,生成整个流程的调用拓扑图,从而加快定位复杂应用的性能问题。