对于很多偏传统的企业,尚未大规模应用 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 的地址配置到 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 人员,监控系统绝对是必备利器。希望本文对大家有所帮助。

如何监控多个进程的存活和CPU、内存占用的更多相关文章

  1. 使用psutil库监控linux的系统资源和自定义进程的cpu 内存占用。

    #coding=utf8 import time import psutil from pprint import pprint from logger_until import LoggerUnti ...

  2. ps查看CPU和内存占用前10的进程

    内存增序 ps aux --sort rss 内存减序 ps aux --sort -rss cpu增序 ps auxw --sort=%cpu cpu减序 ps auxw --sort=-%cpu ...

  3. Linux 下监控用户最大进程数参数(nproc)是否到达上限

    Linux 下监控用户最大进程数参数(nproc)是否到达上限的步骤: 1.查看各系统用户的进程(LWP)数: 注意:默认情况下采用 ps 命令并不能显示出所有的进程.因为 Linux 环境下执行多线 ...

  4. 通过JDK常用工具监控Java进程的内存占用情况

    目录 1 JDK 工具的使用 2 查看 GC 日志信息 3 添加 JMS 远程监控 Tomcat是一款常用的Web容器, 它是运行在 JVM(Java Virtual Machine) 中的一个Jav ...

  5. 用monit监控系统关键进程

    原地址: https://feilong.me/2011/02/monitor-core-processes-with-monit monit是一款功能强大的系统状态.进程.文件.目录和设备的监控软件 ...

  6. erlang中判断进程是否存活

    一个参数的方法是已知Pid判断进程是否存活.两个参数的方法是已知节点和Pid或进程名判断进程是否存活. is_process_alive(Pid) when is_pid(Pid)->rpc:c ...

  7. 一个用pyton写的监控服务端进程的软件hcm

    使用udp实现,简单,方便,不用三次握手 1. 所有部署服务器进程的机器有一个代理进程hagent,用来监听hcm console中发送过来的命令 2.hcm需要提供以下命令 start :普通方式启 ...

  8. JVM探秘:VisualVM监控远程Java进程

    VisualVM在Java 8中是JDK自带的一个图形化工具,项目主页 VisualVM,在后续版本中可能会从JDK移除. VisualVM可以监控Java进程的CPU与内存占用情况,可以监控Java ...

  9. 监控Linux系统所选的服务所占进程内存占用

    [代码] #!/bin/bash #程序功能描述: # 监控系统所选的服务所占进程内存占用 #作者:孤舟点点 #版本:1.0 #创建时间:-- :: PATH=/bin:/sbin:/usr/bin: ...

  10. Linux下性能监控、守护进程与计划任务管理

    目录 一:监视系统进程(ps .top) 二:查看网络连接信息 (netstat) 三:文件进程.端口关联(lsof) 四:计划任务管理(at .crontab) at crontab 一:监视系统进 ...

随机推荐

  1. 深入理解Nginx-模块开发与架构解析(第2版)第一章

    为什么选择Nginx 更快 高扩展性 高可靠性 低内存消耗 单机支持10万以上的并发连接 热部署 最自由的BSD许可协议 Nginx先天的事件驱动型设计.全异步的网络I/O处理机制.极少的进程间切换以 ...

  2. Linux下安装并配置VSCode(Visual Studio Code)

    众所周知,微软官方推出的开源编辑器VSCode轻量.易用.美观(微软没有给我广告费哈_),在程序员界享有盛誉,今天就带着大家在Linux下快速下载并使用VCode编辑器. 1.下载VSCode包 下载 ...

  3. [Python] 开发一个lychee相册命令行客户端以及python库pychee6

    有一段时间收集了不少的写真集和漫画,但是一直苦于没有很好的组织和储存的方法,直到我找到了LycheeOrg/Lychee ,它的图片组织形式非常适合存放写真集或者漫画,于是我尝试把图片都放上去.体验很 ...

  4. 「Log」2023.8.29 小记

    序幕 早上下雨了,七点到校,还是先整理博客. 今天是生日,发条犇犇纪念一下,16 岁了! 学长进行杂题选讲,一些 KD-Tree.根号分治.生成树题,大部分是图相关,高低胡上两道. 补一些题 \(\c ...

  5. python基础—数字,字符串练习题

    1.如有以下变量 n1=5,请使用 int 的提供的方法,得到该变量最少可以用多少个二进制位表示? n1=5 r=n1.bit_lenght() #当前数字的二进制,至少用n位表示.bit_lengh ...

  6. [书籍精读] 《你不知道的JavaScript(上卷)》精读笔记分享

    写在前面 书籍介绍:JavaScript这门语言简单易用,很容易上手,但其语言机制复杂微妙,即使是经验丰富的JavaScript开发人员,如果没有认真学习的话也无法真正理解.本套书直面当前JavaSc ...

  7. C# Model对象转DataTable

    https://blog.csdn.net/a11112244444/article/details/78921200 https://www.cnblogs.com/chongde/articles ...

  8. vue_过渡&动画、过滤器、指令

    过度和动画 <html lang="en"> <head> <meta charset="UTF-8"> <title ...

  9. iis6导出Excel报错检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,8000401a错误解决办法

    1:在服务器上安装office的Excel软件. 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 3:依次双 ...

  10. Java开发笔记(一百五十五)生成随机数的几种途径

    随机数生成是一个常见的业务场景,比如摇号.抽奖等等都需要随机数.Java代码主要有三种随机数的生成方式,包括Math.random.Random.ThreadLocalRandom等,分别说明如下: ...