# linux_sysmonitor_lib **Repository Path**: diabio/linux_sysmonitor_lib ## Basic Information - **Project Name**: linux_sysmonitor_lib - **Description**: 这是一个用c++17编写的linux 性能监控工具库 - **Primary Language**: C/C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-14 - **Last Updated**: 2025-08-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: Cpp, Linux ## README # Linux C++ 系统性能监控库 (sysmonitor\_lib) `sysmonitor_lib` 是一个轻量级、零外部依赖的C++系统性能监控库,专为Linux平台设计。它通过直接解析 `/proc` 虚拟文件系统来获取实时的系统指标,不依赖任何第三方库(如`procps`),使得集成和部署变得极其简单。 本项目采用现代C++17标准编写,通过异步回调机制提供非阻塞的性能数据更新,非常适合用于开发定制化的监控工具、后端服务健康检查、性能分析以及嵌入式设备的状态监控。 ## ✨ 核心功能 - **CPU 监控**: - 获取总CPU和每个核心的实时使用率。 - 读取CPU型号、物理核心数、逻辑核心数(线程数)等硬件信息。 - **内存监控**: - 实时监控物理内存(RAM)和交换空间(Swap)的总量、使用量、可用量和使用率。 - **磁盘监控**: - 枚举所有物理磁盘分区。 - 获取每个分区的总空间、已用空间、可用空间和使用率。 - **网络监控**: - 获取每个网络接口的IP地址、MAC地址和运行状态。 - 计算每个接口的实时接收/发送速率(KB/s, MB/s等)。 - **零外部依赖**: - 仅使用C++标准库和Linux系统调用,无需安装任何额外的开发包。 - **异步非阻塞**: - 在独立的后台线程中进行监控,通过回调函数将数据推送给主程序,不影响主业务逻辑。 - **现代C++设计**: - 使用C++17标准,代码清晰、健壮,并利用了`std::thread`, `std::atomic`, `std::chrono`等现代特性。 ## 🎯 项目目的 #### 为什么需要性能监控? 在软件开发过程中,性能监控是保障系统高效稳定运行的关键手段。无论是服务器开发、后台服务,还是自动驾驶等实时性要求高的领域,性能监控都能帮助我们: 1. **实时问题定位** - 快速发现CPU过载、内存泄漏、I/O瓶颈等性能问题,避免影响用户体验或系统稳定性。 - *示例*:自动驾驶系统中,通过监控传感器数据处理延迟,确保实时性要求得到满足。 2. **数据驱动的优化** - 基于性能指标(如函数耗时、线程竞争)精准优化代码,避免盲目调整。 - *示例*:服务器后台通过分析API响应时间分布,针对性优化慢查询。 3. **历史回溯与分析** - 将性能数据持久化存储(如时间序列数据库),便于: - 对比不同版本的系统表现 - 复现和诊断偶发故障 - 预测资源扩容需求 - *示例*:通过存储的CPU利用率历史数据,发现某次更新后资源消耗上升了20%。 4. **全生命周期质量保障** - 从开发调试到线上运维,完整的监控体系能: - 在测试阶段暴露性能缺陷 - 在生产环境提前预警异常 - 为架构演进提供数据支撑 ## 🚀 如何编译 本项目使用 CMake 进行构建。请确保您的系统已安装 `g++` (需支持C++17) 和 `CMake` (版本 \>= 3.10)。 ```bash # 1. 克隆项目 (如果您使用git) # git clone https://gitee.com/diabio/linux_sysmonitor_lib.git # cd sysmonitor_lib # 2. 创建并进入 build 目录 mkdir build cd build # 3. 运行 CMake 来配置项目 cmake .. # 4. 编译库和示例程序 cmake --build . # 5. 运行示例程序 # 编译后的可执行文件位于 build/ 目录下 ./monitor_example ``` ## 💡 如何使用 集成 `sysmonitor_lib` 非常简单,主要分为三步: #### 1\. 引入头文件 根据需要的功能引入对应的头文件。最核心的是 `resources_monitor.hpp`。 ```cpp #include "sysmonitor/resources_monitor.hpp" #include "sysmonitor/utils.hpp" // 用于单位转换等工具 #include ``` #### 2\. 创建数据处理的回调函数 这是一个普通的函数,当监控器获取到新数据时会自动调用它。 ```cpp void onResourcesUpdate(const sysmonitor::SystemResources& data) { // 在这里处理最新的系统数据 data std::cout << "Total CPU Usage: " << data.cpuUsage.totalUsage << "%\n"; std::cout << "Memory Usage: " << data.memoryInfo.memory.usagePercent << "%\n"; // ... 打印其他信息 } ``` #### 3\. 配置并启动监控 创建 `MonitorConfig` 和 `ResourcesMonitor` 对象,然后启动监控。 ```cpp #include "sysmonitor/resources_monitor.hpp" #include #include #include // 全局监控器指针,用于信号处理 std::unique_ptr monitor_ptr; // 信号处理函数,用于优雅地停止监控 void signalHandler(int signum) { if (monitor_ptr) { monitor_ptr->stopMonitoring(); } } int main() { // 注册 Ctrl+C 信号 signal(SIGINT, signalHandler); // 1. 创建配置,设置更新间隔为2秒 sysmonitor::MonitorConfig config; config.updateInterval = std::chrono::seconds(2); // 2. 创建监控器实例,并传入配置和回调函数 monitor_ptr = std::make_unique(config, onResourcesUpdate); // 3. 启动后台监控 std::cout << "Starting monitoring... Press Ctrl+C to exit.\n"; monitor_ptr->startMonitoring(); // 4. 主线程等待,直到监控被停止 while (monitor_ptr && monitor_ptr->isRunning()) { std::this_thread::sleep_for(std::chrono::seconds(1)); } std::cout << "Monitoring stopped.\n"; return 0; } ``` ## 📁 文件结构 ``` sysmonitor_lib/ ├── CMakeLists.txt # CMake 构建脚本 ├── README.md # 项目说明文档 ├── include/ # 存放所有公共头文件 │ └── sysmonitor/ │ ├── cpu_tools.hpp │ ├── file_system.hpp │ ├── memory_tools.hpp │ ├── network_tools.hpp │ ├── resources_monitor.hpp │ └── utils.hpp ├── src/ # 存放所有源文件的实现 │ ├── cpu_tools.cpp │ ├── file_system.cpp │ ├── memory_tools.cpp │ ├── network_tools.cpp │ ├── resources_monitor.cpp │ ├── utils.cpp │ └── worker.cpp └── example/ # 存放使用示例 └── example.cpp ```