NodeMonitor 是一个轻量高效的节点性能监控系统,专注于收集、传输和存储服务器的关键性能指标(CPU、内存、磁盘、网络等),基于时序数据库优化存储与查询,适用于分布式节点监控场景。
- 多维度监控:覆盖 CPU 负载/软中断/状态、内存使用、磁盘 I/O、网络流量等核心指标
- 高效通信:基于 gRPC 实现客户端与服务端的低延迟数据传输
- 时序优化存储:使用 InfluxDB 存储监控数据,支持自动降采样、数据保留策略,优化时序查询性能
- eBPF 增强:通过 eBPF 程序高效采集网络监控数据
- 模块化设计:各功能模块解耦,易于扩展和维护
- 操作系统:Linux(内核版本 ≥ 5.6,需支持 eBPF 和内核模块编译)
- 依赖工具:
- CMake ≥ 3.21
- g++ ≥ 9(支持 C++17)
- Protobuf ≥ 3.0
- gRPC
- libbpf & bpftool(用于 eBPF 程序编译)
- Clang(编译 eBPF 程序)
- Docker & Docker Compose(启动 InfluxDB)
git clone <仓库地址>
cd NodeMonitor通过 Docker 快速部署 InfluxDB 时序数据库:
cd docker
docker-compose up -dInfluxDB 配置(来自 docker-compose.yaml):
- 地址:
http://127.0.0.1:8086 - 初始用户:
root,密码:a123456a - 组织:
star-cs,存储桶:node_monitor
# 创建构建目录
mkdir build && cd build
cmake ..
make -j$(nproc)编译产物将输出到 bin/(可执行文件)和 lib/(库文件)。
cd bin
./node_server服务端默认监听 0.0.0.0:50051,接收客户端发送的监控数据并写入 InfluxDB。
cd bin
./node_client客户端将采集本地节点的性能指标,每 3 秒通过 gRPC 发送到服务端。
NodeMonitor/
├── proto/ # Protobuf 协议定义(监控数据结构、RPC 接口)
├── rpc/ # gRPC 客户端/服务端实现
├── influxdb/ # InfluxDB 客户端及数据模型定义
├── node_server/ # 服务端代码(接收数据、写入数据库)
├── node_client/ # 客户端代码
│ ├── src/proc/ # 基于 /proc 采集内存、磁盘等指标
│ ├── src/ebpf/ # eBPF 网络监控程序
│ └── src/kmod/ # CPU 监控内核模块
├── docker/ # Docker 配置(InfluxDB 部署)
└── CMakeLists.txt # 项目编译配置
| 类别 | 主要指标 |
|---|---|
| CPU | 使用率、负载均值(1/3/15分钟)、软中断次数、用户态/内核态时间占比 |
| 内存 | 总内存、空闲/可用内存、缓存/缓冲区、活跃/非活跃内存、使用率 |
| 磁盘 | 读写次数、字节数、IOPS、平均延迟、使用率 |
| 网络 | 收发字节数/包数、速率、丢包数 |
- 开发语言:C++17
- 数据序列化:Protobuf 3
- RPC 框架:gRPC
- 时序数据库:InfluxDB 2.4
- 网络监控:eBPF
- 构建工具:CMake
- 容器化:Docker
- 内核模块编译需匹配当前系统内核版本,详见
node_client/src/kmod/目录说明 - eBPF 程序依赖
clang和bpftool,缺失时需先安装:sudo apt install clang bpftool - InfluxDB 数据保留策略默认配置:实时数据保留7天,降采样后数据保留30天/1年(可在
influxdb/schema.md调整)