在前面的内容中,我为你介绍了不少性能分析的原理、思路以及相关的工具。不过,在实际的性能分析中,一个很常见的现象是,明明发生了性能瓶颈,但当你登陆到服务器中想要排查的时
候,却发现瓶颈已经消失了。或者说,性能问题老是时不时地发生,但却很难找出发生规律,也很难重现。ios
当面对这样的场景时,你可能会发现,咱们前面介绍的各类工具、方法都“失效“了。为何呢?由于它们都须要在性能问题发生的时刻才有效,而在这些过后分析的场景中,咱们就很难发
挥它们的威力了。web
那该怎么办呢?置之不理吗?其实以往,不少应用都是等到用户抱怨响应慢了,或者系统崩溃了后,才发现系统或者应用程序的性能出现了问题。虽然最终也能发现问题,但显然,这种方法是
不可取的,由于严重影响了用户的体验。数据库
而要解决这个问题,就要搭建监控系统,把系统和应用程序的运行情况监控起来,并定义一系列的策略,在发生问题时第一时间告警通知。一个好的监控系统,不只能够实时暴露系统的各类问
题,更能够根据这些监控到的状态,自动分析和定位大体的瓶颈来源,从而更精确地把问题汇报给相关团队处理。缓存
要作好监控,最核心的就是全面的、可量化的指标,这包括系统和应用两个方面。服务器
从系统来讲,监控系统要涵盖系统的总体资源使用状况,好比咱们前面讲过的 CPU、内存、磁盘和文件系统、网络等各类系统资源。网络
而从应用程序来讲,监控系统要涵盖应用程序内部的运行状态,这既包括进程的 CPU、磁盘 I/O等总体运行情况,更须要包括诸如接口调用耗时、执行过程当中的错误、内部对象的内存使用等应
用程序内部的运行情况。架构
今天,我就带你一块儿来看看,如何对 Linux 系统进行监控。而在下一节,我将继续为你讲解应用程序监控的思路。工具
在开始监控系统以前,你确定最想知道,怎么才能用简洁的方法,来描述系统资源的使用状况。你固然可使用专栏中学到的各类性能工具,来分别收集各类资源的使用状况。不过不要忘记,
每种资源的性能指标可都有不少,使用过多指标自己耗时耗力不说,也不容易为你创建起系统总体的运行情况。性能
在这里,我为你介绍一种专门用于性能监控的 USE(Utilization Saturation and Errors)法。USE 法把系统资源的性能指标,简化成了三个类别,即便用率、饱和度以及错误数。设计
这三个类别的指标,涵盖了系统资源的常见性能瓶颈,因此常被用来快速定位系统资源的性能瓶颈。这样,不管是对 CPU、内存、磁盘和文件系统、网络等硬件资源,仍是对文件描述符数、连
接数、链接跟踪数等软件资源,USE 方法均可以帮你快速定位出,是哪种系统资源出现了性能瓶颈。
那么,对于每一种系统资源,又有哪些常见的性能指标呢?回忆一下咱们讲过的各类系统资源原理,并不难想到相关的性能指标。这里,我把常见的性能指标画了一张表格,
方便你在须要时查看。
不过,须要注意的是,USE 方法只关注能体现系统资源性能瓶颈的核心指标,但这并非说其余指标不重要。诸如系统日志、进程资源使用量、缓存使用量等其余各种指标,也都须要咱们监控
起来。只不过,它们一般用做辅助性能分析,而 USE 方法的指标,则直接代表了系统的资源瓶颈。
掌握 USE 方法以及须要监控的性能指标后,接下来要作的,就是创建监控系统,把这些指标保存下来;而后,根据这些监控到的状态,自动分析和定位大体的瓶颈来源;最后,再经过告警系
统,把问题及时汇报给相关团队处理。
能够看出,一个完整的监控系统一般由数据采集、数据存储、数据查询和处理、告警以及可视化展现等多个模块组成。因此,要从头搭建一个监控系统,其实也是一个很大的系统工程
不过,幸运的是,如今已经有不少开源的监控工具能够直接使用,好比最多见的 Zabbix、Nagios、Prometheus 等等。
下面,我就以 Prometheus 为例,为你介绍这几个组件的基本原理。以下图所示,就是Prometheus 的基本架构:
先看数据采集模块。最左边的 Prometheus targets 就是数据采集的对象,而 Retrieval 则负责采集这些数据。从图中你也能够看到,Prometheus 同时支持 Push 和 Pull 两种数据采集模式。
因为须要监控的对象一般都是动态变化的,Prometheus 还提供了服务发现的机制,能够自动根据预配置的规则,动态发现须要监控的对象。这在 Kubernetes 等容器平台中很是有效。
第二个是数据存储模块。为了保持监控数据的持久化,图中的 TSDB(Time series database)模块,负责将采集到的数据持久化到 SSD 等磁盘设备中。TSDB 是专门为时间序列数据设计的一
种数据库,特色是以时间为索引、数据量大而且以追加的方式写入。
第三个是数据查询和处理模块。刚才提到的 TSDB,在存储数据的同时,其实还提供了数据查询和基本的数据处理功能,而这也就是 PromQL 语言。PromQL 提供了简洁的查询、过滤功能,
而且支持基本的数据处理方法,是告警系统和可视化展现的基础。
第四个是告警模块。右上角的 AlertManager 提供了告警的功能,包括基于 PromQL 语言的触发条件、告警规则的配置管理以及告警的发送等。不过,虽然告警是必要的,但过于频繁的告警
显然也不可取。因此,AlertManager 还支持经过分组、抑制或者静默等多种方式来聚合同类告警,并减小告警数量。
最后一个是可视化展现模块。Prometheus 的 web UI 提供了简单的可视化界面,用于执行PromQL 查询语句,但结果的展现比较单调。不过,一旦配合 Grafana,就能够构建很是强大的
图形界面了。
介绍完了这些组件,想必你对每一个模块都有了比较清晰的认识。接下来,咱们再来继续深刻了解这些组件结合起来的总体功能。
好比,以刚才提到的 USE 方法为例,我使用 Prometheus,能够收集 Linux 服务器的 CPU、内存、磁盘、网络等各种资源的使用率、饱和度和错误数指标。而后,经过 Grafana 以及
PromQL 查询语句,就能够把它们以图形界面的方式直观展现出来。
今天,我带你一块儿梳理了系统监控的基本思路。
系统监控的核心是资源的使用状况,包括 CPU、内存、磁盘和文件系统、网络等硬件资源,以及文件描述符数、链接数、链接跟踪数等软件资源。而这些资源,均可以经过 USE 法来创建核心性
能指标。
USE 法把系统资源的性能指标,简化成了三个类别,即便用率、饱和度以及错误数。 这三者任一类别太高时,都表明相对应的系统资源有可能存在性能瓶颈。
基于 USE 法创建性能指标后,还须要经过一套完整的监控系统,把这些指标从采集、存储、查询、处理,再到告警和可视化展现等串联起来。你能够基于 Zabbix、Prometheus 等各类开源
的监控产品,构建这套监控系统。这样,不只能够将系统资源的瓶颈快速暴露出来,还能够借助监控的历史,过后追查定位问题。
固然,除了系统监控以外,应用程序的监控也是必不可少的,我将在下一节课继续为你拆解。