Linux性能优化实战学习笔记:第五十四讲

1、上节回顾

上一节,我带你学习了,如何使用 USE 法来监控系统的性能,先简单回顾一下。网络

系统监控的核心是资源的使用状况,这既包括 CPU、内存、磁盘、文件系统、网络等硬件资源,也包括文件描述符数、链接数、链接跟踪数等软件资源。而要描述这些资源瓶颈,最简单有效的
方法就是 USE 法。架构

USE 法把系统资源的性能指标,简化为了三个类别:使用率、饱和度以及错误数。 当这三者之中任一类别的指标太高时,都表明相对应的系统资源可能存在性能瓶颈。分布式

基于 USE 法创建性能指标后,咱们还须要经过一套完整的监控系统,把这些指标从采集、存储、查询、处理,再到告警和可视化展现等贯穿起来。这样,不只能够将系统资源的瓶颈快速暴露出
来,还能够借助监控的历史数据,来追踪定位性能问题的根源。函数

除了上一节讲到的系统资源须要监控以外,应用程序的性能监控,固然也是必不可少的。今天,我就带你一块儿来看看,如何监控应用程序的性能。微服务

2、指标监控

跟系统监控同样,在构建应用程序的监控系统以前,首先也须要肯定,到底须要监控哪些指标。特别是要清楚,有哪些指标能够用来快速确认应用程序的性能问题。工具

对系统资源的监控,USE 法简单有效,却不表明其适合应用程序的监控。举个例子,即便在 CPU使用率很低的时候,也不能说明应用程序就没有性能瓶颈。由于应用程序可能会由于锁或者 RPC
调用等,致使响应缓慢。性能

因此,应用程序的核心指标,再也不是资源的使用状况,而是请求数、错误率和响应时间。这些指标不只直接关系到用户的使用体验,还反映应用总体的可用性和可靠性。学习

有了请求数、错误率和响应时间这三个黄金指标以后,咱们就能够快速知道,应用是否发生了性能问题。可是,只有这些指标显然仍是不够的,由于发生性能问题后,咱们还但愿可以快速定
位“性能瓶颈区”。因此,在我看来,下面几种指标,也是监控应用程序时必不可少的。搜索引擎

第一个,是应用进程的资源使用状况,好比进程占用的 CPU、内存、磁盘 I/O、网络等。使用过多的系统资源,致使应用程序响应缓慢或者错误数升高,是一个最多见的性能问题。spa

第二个,是应用程序之间调用状况,好比调用频率、错误数、延时等。因为应用程序并非孤立的,若是其依赖的其余应用出现了性能问题,应用自身性能也会受到影响。

第三个,是应用程序内部核心逻辑的运行状况,好比关键环节的耗时以及执行过程当中的错误等。因为这是应用程序内部的状态,从外部一般没法直接获取到详细的性能数据。因此,应用程序在
设计和开发时,就应该把这些指标提供出来,以便监控系统能够了解其内部运行状态。

有了应用进程的资源使用指标,你就能够把系统资源的瓶颈跟应用程序关联起来,从而迅速定位因系统资源不足而致使的性能问题;

  1. 有了应用程序之间的调用指标,你能够迅速分析出一个请求处理的调用链中,到底哪一个组件才是致使性能问题的罪魁祸首;
  2. 而有了应用程序内部核心逻辑的运行性能,你就能够更进一步,直接进入应用程序的内部,定位究竟是哪一个处理环节的函数致使了性能问题。

基于这些思路,我相信你就能够构建出,描述应用程序运行状态的性能指标。再将这些指标归入咱们上一期提到的监控系统(好比 Prometheus + Grafana)中,就能够跟系统监控同样,一方
面经过告警系统,把问题及时汇报给相关团队处理;另外一方面,经过直观的图形界面,动态展现应用程序的总体性能。

除此以外,因为业务系统一般会涉及到一连串的多个服务,造成一个复杂的分布式调用链。为了迅速定位这类跨应用的性能瓶颈,你还可使用 Zipkin、Jaeger、Pinpoint 等各种开源工具,
来构建全链路跟踪系统。

好比,下图就是一个 Jaeger 调用链跟踪的示例。

全链路跟踪能够帮你迅速定位出,在一个请求处理过程当中,哪一个环节才是问题根源。好比,从上图中,你就能够很容易看到,这是 Redis 超时致使的问题。

全链路跟踪除了能够帮你快速定位跨应用的性能问题外,还能够帮你生成线上系统的调用拓扑图。这些直观的拓扑图,在分析复杂系统(好比微服务)时尤为有效

3、日志监控

性能指标的监控,可让你迅速定位发生瓶颈的位置,不过只有指标的话每每还不够。好比,一样的一个接口,当请求传入的参数不一样时,就可能会致使彻底不一样的性能问题。因此,除了指标
外,咱们还须要对这些指标的上下文信息进行监控,而日志正是这些上下文的最佳来源。对比来看,

  1. 指标是特定时间段的数值型测量数据,一般以时间序列的方式处理,适合于实时监控。
  2. 而日志则彻底不一样,日志都是某个时间点的字符串消息,一般须要对搜索引擎进行索引后,才能进行查询和汇总分析。

对日志监控来讲,最经典的方法,就是使用 ELK 技术栈,即便用 Elasticsearch、Logstash 和Kibana 这三个组件的组合。

以下图所示,就是一个经典的 ELK 架构图:

 

 

这其中,

  1. Logstash 负责对从各个日志源采集日志,而后进行预处理,最后再把初步处理过的日志,发送给 Elasticsearch 进行索引。
  2. Elasticsearch 负责对日志进行索引,并提供了一个完整的全文搜索引擎,这样就能够方便你从日志中检索须要的数据。
  3. Kibana 则负责对日志进行可视化分析,包括日志搜索、处理以及绚丽的仪表板展现等。

下面这张图,就是一个 Kibana 仪表板的示例,它直观展现了 Apache 的访问概况。

值得注意的是,ELK 技术栈中的 Logstash 资源消耗比较大。因此,在资源紧张的环境中,咱们每每使用资源消耗更低的 Fluentd,来替代 Logstash(也就是所谓的 EFK 技术栈)。

4、小结

今天,我为你梳理了应用程序监控的基本思路。应用程序的监控,能够分为指标监控和日志监控两大部分:

  1. 指标监控主要是对必定时间段内性能指标进行测量,而后再经过时间序列的方式,进行处理、存储和告警。
  2. 日志监控则能够提供更详细的上下文信息,一般经过 ELK 技术栈来进行收集、索引和图形化展现。

在跨多个不一样应用的复杂业务场景中,你还能够构建全链路跟踪系统。这样能够动态跟踪调用链中各个组件的性能,生成整个流程的调用拓扑图,从而加快定位复杂应用的性能问题。

相关文章
相关标签/搜索