如何监控多个进程的存活和CPU、内存占用

快猫运营 2025-08-08 13:39:36

对于很多偏传统的企业,尚未大规模应用 Kubernetes 技术,也没有为应用埋点,此时进程监控就很关键了。最典型的需求就是监控进程的存活性和进程的资源(CPU、内存等)占用。

本文分享使用夜莺监控开源项目和 Categraf 来构建这个监控能力。

夜莺监控简介

夜莺产品架构图

夜莺监控(Nightingale)是一款侧重告警的监控类开源项目。类似 Grafana 的数据源集成方式,夜莺也是对接多种既有的数据源,不过 Grafana 侧重在可视化,夜莺是侧重在告警引擎、告警事件的处理和分发。

夜莺监控项目,最初由滴滴开发和开源,并于 2022 年 5 月 11 日,捐赠予中国计算机学会开源发展委员会(CCF ODC),为 CCF ODC 成立后接受捐赠的第一个开源项目。

其开源仓库地址:

虽然夜莺的侧重点是告警,但是也支持基本的看图能力,基本够用,为了省事就不引入 Grafana 等其他看图工具了,告警、看图都用夜莺来搞。

但是注意,夜莺没有内置时序数据存储能力,即监控数据的存储需要单独找一个时序库,目前业内情况来看,最推荐的是 VictoriaMetrics,和 Prometheus 接口兼容、性能好、支持集群版本。待会演示的时候我们就用 VictoriaMetrics 来作为时序库(TSDB)。

Categraf 简介

Categraf 也是一个开源项目,专门做数据采集的,集成了数十种采集插件,涵盖了机器的 CPU、内存、磁盘、网络、IO、进程 等常规采集能力,也集成了 MySQL、Redis、Postgres、Oracle、Tomcat 等各类常见数据库、中间件的采集能力。

Categraf 的代码仓库地址是:https://github.com/flashcatcloud/categraf

Categraf 采集了监控数据之后,要推送给服务端,使用 Prometheus Remote Write 协议。很多后端存储都支持这个协议。所以,Categraf 可以直接推送监控到 Prometheus、VictoriaMetrics,也支持把数据写到夜莺监控(Nightingale),再由夜莺把数据转存到后端时序库。

今天我们介绍进程监控,就使用 Categraf 来做。待会做具体演示。

下面进入安装环节,先安装时序库。

部署 VictoriaMetrics 时序库

如果你已经部署过 VictoriaMetrics 或者 Prometheus 了,可以跳过这一步。

VictoriaMetrics 也是开源的,开源项目的发布包通常在 releases 页面,所以,VictoriaMetrics 的发布包下载地址就是:

https://github.com/VictoriaMetrics/VictoriaMetrics/releases

当前社区最新版是 v1.123.0,后缀带有 enterprise 的发布包是企业版,咱们就用社区版就够了,我是 arm64 的环境,所以下载 arm64 的发布包:

  • victoria-metrics-linux-arm64-v1.123.0.tar.gz

解压缩会发现,里边只有一个 victoria-metrics-prod 二进制,真省事。

通过如下命令可以直接启动 VictoriaMetrics:

./victoria-metrics-prod

默认会监听在 8428 端口。VictoriaMetrics 各类参数都是通过命令行参数来控制的,可以通过查看其 help 信息了解具体有哪些参数:

./victoria-metrics-prod --help

我这里是做演示,所以直接前台启动进程了。如果你要在生产环境使用,建议使用 systemd 或者 supervisor 等来托管。

部署夜莺监控

夜莺监控的发布包和 VictoriaMetrics 一样,都是在 github releases 页面:

https://github.com/ccfos/nightingale/releases

当前最新版本是 v8.2.2,我是 arm64 的环境,所以下载:n9e-v8.2.2-linux-arm64.tar.gz

实际上,夜莺也可以跑在 Windows 或者 Mac 上面,只是官方没有提供默认的发布包,需要自行编译了。

使用如下命令解压缩:

mkdir n9e
tar zxvf n9e-v8.2.2-linux-arm64.tar.gz -C n9e

然后进入 n9e 目录直接启动就可以了:

./n9e

默认监听在 17000 端口,可以使用浏览器访问 WEB UI,默认用户名是 root,默认密码是 root.2020

之所以可以一键启动时因为默认使用的存储是 sqlite,默认使用缓存是 miniredis(内置到进程内存里了),如果是生产环境,请使用单独的 MySQL 和 Redis。MySQL 和 Redis 相关的连接配置在 n9e 二进制同级目录下的 etc 目录的 config.toml 里。

配置文件里各项是什么含义,请参考:夜莺配置文件详解

Ctrl + C 先把刚才的夜莺进程停掉,咱们修改一下 etc/config.toml 中的时序库地址,改成刚才启动的 VictoriaMetrics 的地址:

[[Pushgw.Writers]]
Url = "http://127.0.0.1:8428/api/v1/write"

127.0.0.1:8428 是我刚部署的 VictoriaMetrics 的地址,请你根据自身环境调整具体的 IP 和端口。

这个配置的含义是:夜莺接收到 Categraf 上报的监控数据之后,转存到这个地址指向的时序库。

OK,重启启动夜莺进程:

./n9e

我这里是做演示,所以直接前台启动进程了。如果你要在生产环境使用,建议使用 systemd 或者 supervisor 等来托管。

服务端搞定了,接下来搞客户端。

部署 Categraf

Categraf 需要部署在所有要监控的目标机器上。其发布包的下载地址是:

https://github.com/flashcatcloud/categraf/releases

当前最新版是 v0.4.14,我就下载:categraf-v0.4.14-linux-arm64.tar.gz

解压缩,修改 Categraf 的主配置文件:conf/config.toml。这里核心是要修改 writers 部分:

[[writers]]
url = "http://127.0.0.1:17000/prometheus/v1/write"

我的测试环境里,Categraf 和夜莺是在一台机器上的,所以连接地址写的是 127.0.0.1,如果你不在一台机器上,请根据自身情况做调整。

接下来我们用如下命令做个测试,看看 Categraf 能否启动并采集系统基础指标:

./categraf --test --inputs system

我的环境里输出如下内容:

$ ./categraf --test --inputs system
2025/08/08 12:14:48 main.go:151: I! runner.binarydir: /home/ulric/demo/categraf-v0.4.14-linux-arm64
2025/08/08 12:14:48 main.go:152: I! runner.hostname: ubuntu
2025/08/08 12:14:48 main.go:153: I! runner.fd_limits: (soft=1048576, hard=1048576)
2025/08/08 12:14:48 main.go:154: I! runner.vm_limits: (soft=unlimited, hard=unlimited)
2025/08/08 12:14:48 provider_manager.go:60: I! use input provider: [local]
2025/08/08 12:14:48 prometheus_agent.go:19: I! prometheus scraping disabled!
2025/08/08 12:14:48 ibex_agent.go:19: I! ibex agent disabled!
2025/08/08 12:14:48 agent.go:38: I! agent starting
2025/08/08 12:14:48 metrics_agent.go:323: I! input: local.system started
2025/08/08 12:14:48 agent.go:46: I! [*agent.MetricsAgent] started
2025/08/08 12:14:48 agent.go:49: I! agent started
1754626488 12:14:48 system_load5 agent_hostname=ubuntu 0.11
1754626488 12:14:48 system_load15 agent_hostname=ubuntu 0.09
1754626488 12:14:48 system_n_cpus agent_hostname=ubuntu 8
1754626488 12:14:48 system_load_norm_1 agent_hostname=ubuntu 0.0075
1754626488 12:14:48 system_load_norm_5 agent_hostname=ubuntu 0.01375
1754626488 12:14:48 system_load_norm_15 agent_hostname=ubuntu 0.01125
1754626488 12:14:48 system_uptime agent_hostname=ubuntu 1134501
1754626488 12:14:48 system_load1 agent_hostname=ubuntu 0.06

表示一切正常。然后通过如下命令启动 Categraf:

./categraf

注意,测试的时候加了 --test 参数,测试模式下是不会把采集的数据上报服务端的,只是打印在本地控制台里。正式启动的时候,就要拿掉 --test 这个参数了。

另外,categraf 的 conf 目录下有很多 input. 打头的配置目录,是一个一个的采集插件的配置目录,通常来讲,如果各类系统指标都想采集的话,就可以维持这个配置目录里的内容不动,如果只想启用部分插件,那就把其他的插件配置目录都删除即可。

我上面的操作是直接启动了 Categraf,各类 CPU、内存之类的指标也就会被采集到。那我们去夜莺里查看一下相关数据看看。

配置数据源查看数据

首先,把刚才的 VictoriaMetrics 作为数据源配进来,这点跟 Grafana 很像:

VictoriaMetrics 数据源配置

把 VictoriaMetrics 的地址配置到 URL 里。

VictoriaMetrics URL

然后到 指标-即时查询,即可查询 Categraf 采集的监控数据。

夜莺-指标-即时查询

配置进程监控

Categraf 监控进程,使用 procstat 插件,配置文件在 conf/input.procstat/procstat.toml。假设我要监控 victoria-metrics-prod 进程和 n9e 进程,我的配置样例如下:

[[instances]]
search_exec_substring = "victoria"
gather_total = true
gather_per_pid = true
gather_more_metrics = [
    "threads",
    "fd",
    "io",
    "uptime",
    "cpu",
    "mem",
    "limit",
]

[[instances]]
search_exec_substring = "n9e"
gather_total = true
gather_per_pid = true
gather_more_metrics = [
    "threads",
    "fd",
    "io",
    "uptime",
    "cpu",
    "mem",
    "limit",
]

然后通过如下命令可以测试能否采集到数据:

./categraf --test --inputs procstat

采集到的一些关键指标为:

  • procstat_lookup_count 进程数量,如果为 0,表示对应的进程挂了
  • procstat_rlimit_num_fds_soft 进程的软限制句柄数,如果是 1024,通常表示系统参数没有调优好
  • procstat_cpu_usage_total 进程 CPU 使用率
  • procstat_mem_usage_total 进程内存使用率
  • procstat_num_fds_total 进程打开的文件句柄数
  • procstat_read_bytes_total 进程读取的总字节数
  • procstat_write_bytes_total 进程写入的总字节数

机器上的进程数量很多,还有很多内核进程,要采集哪些进程,你得告诉 Categraf 如何过滤,也就是那几个 search 相关的配置:

  • search_exec_substring 相当于拿 readlink -e /proc/<pid>/exe 与 search_exec_substring 的内容做字符串匹配,如果匹配上了,就采集这个进程的信息
  • search_cmdline_substring 相当于拿 cat /proc/<pid>/cmdline 与 search_cmdline_substring的内容做字符串匹配,如果匹配上了,就采集这个进程的信息
  • search_win_service 用于 windows 机器,表示要监控的 windows 服务名字, 当然 windows 机器上也可以用 search_exec_substring 或者 search_cmdline_substring 来做进程筛选

OK,我们去查看一下相关数据是否能够正常查到:

夜莺监控指标查询-绘图

一切正常。后面就可以对这些数据配置告警、配置仪表盘了。最重要的告警规则是:

procstat_lookup_count < 1

即,要采集的进程数量为 0,即进程挂了,需要告警。

后记

对于 SRE 或对稳定性比较在意的 DEV 人员,监控系统绝对是必备利器。希望本文对大家有所帮助。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat