linux性能优化应用监控的一般思路
Posted sysu_lluozh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux性能优化应用监控的一般思路相关的知识,希望对你有一定的参考价值。
除了系统资源需要监控之外,应用程序的性能监控当然也是必不可少的。接下来看看如何监控应用程序的性能
一、指标监控
跟系统监控一样,在构建应用程序的监控系统之前,首先也需要确定到底需要监控哪些指标。特别是要清楚,有哪些指标可以用来快速确认应用程序的性能问题
对系统资源的监控USE法简单有效,却不代表其适合应用程序的监控。举个例子,即使在CPU使用率很低的时候,也不能说明应用程序就没有性能瓶颈。因为应用程序可能会因为锁或者RPC调用等导致响应缓慢
1.1 核心指标
应用程序的核心指标不再是资源的使用情况,而是请求数、错误率和响应时间
这些指标不仅直接关系到用户的使用体验,还反映应用整体的可用性和可靠性
有了请求数、错误率和响应时间这三个黄金指标之后,可以快速知道应用是否发生了性能问题
1.2 必不可少指标
但是,只有这些指标显然还是不够的,因为发生性能问题后还希望能够快速定位性能瓶颈区。所以,下面几种指标也是监控应用程序时必不可少
- 应用进程的资源使用情况
第一个,是应用进程的资源使用情况,比如进程占用的 CPU、内存、磁盘 I/O、网络等
使用过多的系统资源,导致应用程序响应缓慢或者错误数升高,是一个最常见的性能问题
- 应用程序之间调用情况
第二个,是应用程序之间调用情况,比如调用频率、错误数、延时等
由于应用程序并不是孤立的,如果其依赖的其他应用出现了性能问题,应用自身性能也会受到影响
- 应用程序内部核心逻辑的运行情况
第三个,是应用程序内部核心逻辑的运行情况,比如关键环节的耗时以及执行过程中的错误等
由于这是应用程序内部的状态,从外部通常无法直接获取到详细的性能数据。所以,应用程序在设计和开发时,就应该把这些指标提供出来,以便监控系统可以了解其内部运行状态
1.3 必不可少指标作用
- 应用进程的资源使用指标
有了应用进程的资源使用指标,可以把系统资源的瓶颈跟应用程序关联起来,从而迅速定位因系统资源不足而导致的性能问题
- 应用程序之间的调用指标
有了应用程序之间的调用指标,可以迅速分析出一个请求处理的调用链中,到底哪个组件才是导致性能问题的罪魁祸首
- 应用程序内部核心逻辑的运行性能
有了应用程序内部核心逻辑的运行性能,可以更进一步直接进入应用程序的内部,定位到底是哪个处理环节的函数导致了性能问题
基于这些思路,可以构建出描述应用程序运行状态的性能指标
1.4 指标和监控结合
将这些指标纳入监控系统(比如 Prometheus + Grafana)中,就可以跟系统监控一样,一方面通过告警系统把问题及时汇报给相关团队处理,另一方面,通过直观的图形界面动态展示应用程序的整体性能
除此之外,由于业务系统通常会涉及到一连串的多个服务,形成一个复杂的分布式调用链。为了迅速定位这类跨应用的性能瓶颈,可以使用Zipkin、Jaeger、Pinpoint等各类开源工具来构建全链路跟踪系统
1.5 Jaeger调用链跟踪
下图是一个Jaeger调用链跟踪的示例
全链路跟踪可以迅速定位出在一个请求处理过程中,哪个环节才是问题根源
比如,从上图中可以很容易看到这是Redis超时导致的问题
全链路跟踪除了可以协助快速定位跨应用的性能问题外,还可以生成线上系统的调用拓扑图
这些直观的拓扑图,在分析复杂系统(比如微服务)时尤其有效
二、日志监控
性能指标的监控,可以迅速定位发生瓶颈的位置,不过只有指标的话往往还不够
比如,同样的一个接口,当请求传入的参数不同时就可能会导致完全不同的性能问题。所以除了指标外,还需要对这些指标的上下文信息进行监控,而日志正是这些上下文的最佳来源
对比来看,指标是特定时间段的数值型测量数据,通常以时间序列的方式处理适合于实时监控
而日志则完全不同,日志都是某个时间点的字符串消息,通常需要对搜索引擎进行索引后才能进行查询和汇总分析
对日志监控来说,最经典的方法就是使用ELK技术栈,即使用Elasticsearch、Logstash和Kibana这三个组件的组合
一个经典的ELK架构图如下图所示:
这其中:
- Logstash
Logstash负责对从各个日志源采集日志,然后进行预处理,最后再把初步处理过的日志发送给Elasticsearch进行索引
- Elasticsearch
Elasticsearch负责对日志进行索引,并提供了一个完整的全文搜索引擎,这样可以方便的从日志中检索需要的数据
- Kibana
Kibana则负责对日志进行可视化分析,包括日志搜索、处理以及绚丽的仪表板展示等
下面这张图,一个Kibana仪表板的示例,直观展示了Apache的访问概况:
值得注意的是,ELK技术栈中的Logstash资源消耗比较大
所以,在资源紧张的环境中往往使用资源消耗更低的Fluentd,来替代Logstash(所谓的EFK技术栈)
三、小结
梳理了应用程序监控的基本思路
应用程序的监控,可以分为指标监控和日志监控两大部分:
- 指标监控
主要是对一定时间段内性能指标进行测量,然后再通过时间序列的方式进行处理、存储和告警
- 日志监控
可以提供更详细的上下文信息,通常通过ELK技术栈来进行收集、索引和图形化展示
在跨多个不同应用的复杂业务场景中,可以构建全链路跟踪系统
这样可以动态跟踪调用链中各个组件的性能,生成整个流程的调用拓扑图,从而加快定位复杂应用的性能问题
以上是关于linux性能优化应用监控的一般思路的主要内容,如果未能解决你的问题,请参考以下文章