先抛一个问题,大家可以思考一下:当我们的业务系统上线之后,我们怎么知道系统是否稳定?

生活中的监控

我们先从生活中一个简单的例子说起。在我们的日常生活中,大家出行会选择不同的交通工具,比如:自行车,电动摩托车,小汽车,高铁,再到飞机。

  • 自行车-无仪表盘
    自行车,构造简单,两个轮子,一根链条,一个齿轮,一个自行车架,加上刹车座椅就构成了自行车的核心结构。我们很少看到自行车上有能够显示当前自行车速度的仪表盘,是吧?
  • 电动摩托车-简单仪表盘
    我们再来看电动摩托车,是不是有了一个简单的仪表盘,从仪表盘上我们至少可以看到电量,档位,骑行速度,骑行总里程数。
  • 飞机硬件架构 飞机驾驶舱硬件构成_服务器

  • 小汽车-复杂仪表盘
    再来看小汽车,仪表盘上显示的信息又多了一些,比如说燃油、速度,温度,发动机状态,车门状态,安全带状态等等。
  • 飞机硬件架构 飞机驾驶舱硬件构成_飞机硬件架构_02

  • 高铁驾驶舱
    我们再来看看高铁的驾驶舱,又更加复杂了,好几块显示屏,每块屏上又有各种指标。
  • 飞机硬件架构 飞机驾驶舱硬件构成_运维_03

  • 飞机驾驶舱
    飞机驾驶舱就更不用说了,网上搜到一张图,虽然看不懂,但知道一点,那就是复杂,显示了各种各样的指标数据。
  • 飞机硬件架构 飞机驾驶舱硬件构成_数据_04

  • 我们可以将自行车比作一个功能简单的小应用,即使没有仪表盘,也看不到当前自行车的骑行速度,完全靠骑行的人也可以确保安全。一般来讲,普通人骑自行车,时速也不过20公里/小时,加上刹车基本能确保骑行安全。

当速度再提高一点,就需要仪表盘的辅助,让我们了解当前交通工具的运行速度,和一些其它的关键指标,确保我们安全驾驶。它们的基本原理无非就是通过各种传感器,收集了当前交通工具的各项指标,然后在仪表盘上进行了可视化的展示,然后通过一些规则,告诉我们是否存在危险。

IT系统的监控

而对于IT系统而言,为了确保系统的稳定运行,同样也离不开监控,监控是业务系统连续稳定运行的基石。

设计能够监控的系统,按顺序依次回答
“出问题了吗?”
“哪里出了问题?”
“是什么问题?”
是一种有效的自上而下的策略
--------《架构即未来》

同样的,IT系统的监控也分为

  • 监控数据的采集
  • 采集数据的展示
  • 监控的告警

实际上,想要回答“出问题了吗”,首先就是要能够采集到相关的数据,并进行分析后,才能知道到底有没有出问题。

Linux 监控数据采集

这里我们以Linux系统为例(主要是笔者经历的业务系统绝大部分都是部署在Linux系统下的),讲一讲Linux系统的监控数据都来自于哪里。

相信大家都熟悉Linux 系统的 top 命令,

top - 21:18:47 up 2 days,  3:25,  1 user,  load average: 0.03, 0.04, 0.05
Tasks: 189 total,   1 running, 138 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.2 us,  0.8 sy,  0.0 ni, 95.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8062988 total,  3229756 free,  2642320 used,  2199912 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  4957280 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                  
 1722 root      20   0 4823568 775372  45368 S   1.3  9.6   9:08.86 dockerd                                                                 
 1732 root      20   0 1130364 151184  40152 S   0.3  1.9   0:59.91 kubelet                                                                 
 1744 root      20   0 1252296 216064  49772 S   0.3  2.7   1:09.45 containerd
  • 第一行显示了当前时间、系统已经运行的时间、平均负载以及当前登录用户数。
  • 第二行显示了任务(进程)的统计信息,包括总任务数、正在运行的任务数、睡眠状态的任务数等。
  • 第三行显示了CPU的使用情况,包括用户态、系统态、空闲等。
  • 第四行和第五行显示了内存和交换空间的使用情况,包括总内存、已用内存、可用内存等。
  • 接下来的每一行都是一个进程的信息,包括进程ID(PID)、用户、进程状态、CPU使用率、内存使用率、运行时间、命令等。

而top命令以信息又来自于哪里?

Linux proc文件系统基本认识

Linux系统中有一种特殊的文件系统,proc 文件系统 (procfs) 是一个特殊的虚拟文件系统,它提供了一个窗口,可以查看内核对系统的视图。它在启动时动态创建,并不位于物理磁盘上,但我们可以看到有这么一个目录:/proc,实际上就是proc fs的挂载。

结构和内容:

  • 位置:挂载在 /proc 目录下。
    内容:
  • 目录:每个正在运行的进程都有一个以其进程 ID (PID) 命名 的子目录。这些目录包含有关该进程的信息文件(例如,内存使用情况、状态、打开的文件描述符)。
  • 通用文件:提供系统范围信息的文件,例如
  • CPU 使用情况 (/proc/cpuinfo)
  • 加载的内核模块 (/proc/modules)
  • 分区信息 (/proc/partitions) 等

用途和功能:

  • 进程信息:procfs 的主要作用是公开有关正在运行进程的详细信息。您可以使用进程目录(例如,/proc/1234)来查看:
  • 内存使用情况 (/proc/[PID]/statm)
  • 进程状态 (/proc/[PID]/status)
  • 打开的文件描述符 (/proc/[PID]/fd)
  • 环境变量 (/proc/[PID]/environ)
  • 系统信息:/proc 下的通用文件提供了有关各种系统方面的见解:
  • 硬件详细信息 (/proc/cpuinfo, /proc/meminfo)
  • 内核配置 (/proc/config)
  • 挂载的文件系统 (/proc/mounts)
  • 网络信息 (/proc/net)
  • 内核控制(有限):某些 procfs 文件允许对内核行为进行有限的控制。但是,请谨慎操作,因为不当的修改可能会导致系统不稳定。

访问信息:

命令行工具:许多命令行工具利用 procfs 来显示进程和系统信息。示例包括:

  • ps (进程状态)
  • top (进程监控)
  • free (内存使用情况)
  • df (磁盘使用情况)
  • lsof (列出打开的文件)
  • 脚本:您可以编写脚本来解析 procfs 文件,以用于自定义信息检索或自动化任务。

重要注意事项:

  • 虚拟本质:procfs 不在物理磁盘上存储数据。它是由内核动态生成的。
  • 安全性:虽然通常可以读取,但修改某些 procfs 文件可能需要 root 权限,并可能破坏系统稳定性。

通过了解 proc 文件系统,我们可以深入了解 Linux 系统的进程和整体健康状况。它是系统管理员用于监控、故障排除和性能优化的一款强大工具。

系统监控数据的采集

开源监控工具Zabbix, Prometheus本质上都是通过对proc 文件系统进行读取和解析以达成系统监控数据的采集。

Zabbix 需要在被采集的目标服务器上部署好 ZabbixAgent
Prometheus 通过 Node Exporter采集目标服务器上的系统监控指标数据。