先抛一个问题,大家可以思考一下:当我们的业务系统上线之后,我们怎么知道系统是否稳定?
生活中的监控
我们先从生活中一个简单的例子说起。在我们的日常生活中,大家出行会选择不同的交通工具,比如:自行车,电动摩托车,小汽车,高铁,再到飞机。
- 自行车-无仪表盘
自行车,构造简单,两个轮子,一根链条,一个齿轮,一个自行车架,加上刹车座椅就构成了自行车的核心结构。我们很少看到自行车上有能够显示当前自行车速度的仪表盘,是吧? - 电动摩托车-简单仪表盘
我们再来看电动摩托车,是不是有了一个简单的仪表盘,从仪表盘上我们至少可以看到电量,档位,骑行速度,骑行总里程数。 - 小汽车-复杂仪表盘
再来看小汽车,仪表盘上显示的信息又多了一些,比如说燃油、速度,温度,发动机状态,车门状态,安全带状态等等。 - 高铁驾驶舱
我们再来看看高铁的驾驶舱,又更加复杂了,好几块显示屏,每块屏上又有各种指标。 - 飞机驾驶舱
飞机驾驶舱就更不用说了,网上搜到一张图,虽然看不懂,但知道一点,那就是复杂,显示了各种各样的指标数据。 - 我们可以将自行车比作一个功能简单的小应用,即使没有仪表盘,也看不到当前自行车的骑行速度,完全靠骑行的人也可以确保安全。一般来讲,普通人骑自行车,时速也不过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采集目标服务器上的系统监控指标数据。