Skip to content

Sys_MemoryMonitor

SweerItTer edited this page Feb 1, 2026 · 3 revisions

MemoryMonitor API 文档

概述

MemoryMonitor 是 utilsCore Sys 模块的核心类,提供内存使用率监控功能,继承自 ResourceMonitor。

职责

  • 监控内存使用率
  • 自动暂停和恢复监控
  • 输出监控数据到文件
  • 线程安全访问

适用场景

  • 系统性能监控
  • 内存泄漏检测
  • 负载均衡
  • 资源调度

依赖关系

  • 依赖: Linux /proc 文件系统, ResourceMonitor
  • 被依赖: VisionPipeline, RecordPipeline 等模块

类分析

MemoryMonitor 类

职责与用途

MemoryMonitor 是内存监控的封装类,提供:

  • 内存使用率监控
  • 继承自 ResourceMonitor
  • 自动暂停和恢复机制
  • 数据输出到 /tmp/memory_usage

设计模式

  • 继承: 继承自 ResourceMonitor
  • 模板方法: 实现 sampleUsage() 纯虚函数

公共 API 方法

构造函数

MemoryMonitor(int sleeptime = 1000);

参数说明:

  • sleeptime (输入): 轮询间隔(毫秒),默认 1000

返回值: 无

所有权归属:

  • MemoryMonitor 拥有内部资源的所有权

注意事项:

  1. 默认输出到 /tmp/memory_usage
  2. 自动启动监控线程
  3. sleeptime 控制采样频率

使用例程:

// 创建监控器(默认每 1000ms 采样一次)
MemoryMonitor memory_monitor;

// 自定义轮询间隔(每 500ms 采样一次)
MemoryMonitor memory_monitor(500);

getUsage() - 获取内存使用率

float getUsage();

参数说明: 无

返回值: 内存使用率(0.0 - 100.0)

所有权归属:

  • 只读访问

注意事项:

  1. 继承自 ResourceMonitor
  2. 线程安全操作
  3. 使用率 = (total - free) / total * 100%
  4. 自动唤醒暂停的监控线程

使用例程:

MemoryMonitor memory_monitor;

// 获取使用率
float usage = memory_monitor.getUsage();
printf("Memory Usage: %.1f%%\n", usage);

保护方法

sampleUsage() - 采样内存使用率

bool sampleUsage(float& usage) override;

参数说明:

  • usage (输出): 采样到的内存使用率

返回值:

  • true: 采样成功
  • false: 采样失败

所有权归属:

  • 无所有权转移

注意事项:

  1. 实现 ResourceMonitor 的纯虚函数
  2. 读取 /proc/meminfo 文件
  3. 使用率 = (total - free) / total * 100%
  4. 包含 buffers 和 cached 内存

内部实现

读取 /proc/meminfo

std::ifstream file("/proc/meminfo");

unsigned long long total = 0, free = 0;
std::set<std::string> needed = {"MemTotal:", "MemFree:"};

while (std::getline(file, line) && !needed.empty()) {
    std::istringstream iss(line);
    std::string key;
    unsigned long long value;
    iss >> key >> value;
    if (key == "MemTotal:") {
        total = value;
        needed.erase(key);
    } else if (key == "MemFree:") {
        free = value;
        needed.erase(key);
    }
}

说明:

  • 读取 MemTotal 和 MemFree
  • 使用率 = (total - free) / total * 100%
  • 包含 buffers 和 cached 内存

线程安全说明

同步机制

  • 继承自 ResourceMonitor 的同步机制
  • getUsage() 是线程安全的
  • sampleUsage() 在监控线程中调用

线程安全建议

  • 可以并发调用 getUsage()
  • 自动暂停和恢复机制由 ResourceMonitor 管理

典型使用场景

场景 1: 基本监控

MemoryMonitor memory_monitor;

// 获取使用率
float usage = memory_monitor.getUsage();
printf("Memory Usage: %.1f%%\n", usage);

场景 2: 持续监控

MemoryMonitor memory_monitor;

while (running) {
    float usage = memory_monitor.getUsage();
    printf("Memory Usage: %.1f%%\n", usage);
    
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

场景 3: 自定义轮询间隔

// 每 500ms 采样一次
MemoryMonitor memory_monitor(500);

while (running) {
    float usage = memory_monitor.getUsage();
    printf("Memory Usage: %.1f%%\n", usage);
    
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
}

场景 4: 自动暂停和恢复

MemoryMonitor memory_monitor;

// 获取使用率
float usage1 = memory_monitor.getUsage();

// 等待 30 秒(监控线程会自动暂停)
std::this_thread::sleep_for(std::chrono::seconds(30));

// 再次获取使用率(线程会自动恢复)
float usage2 = memory_monitor.getUsage();

场景 5: 输出到文件

MemoryMonitor memory_monitor;

// 数据会自动写入到 /tmp/memory_usage
// 每行一个值,格式: 65.2

// 读取文件内容
std::ifstream file("/tmp/memory_usage");
std::string line;
while (std::getline(file, line)) {
    printf("Memory Usage: %s%%\n", line.c_str());
}

注意事项

  1. 输出文件: 数据自动写入到 /tmp/memory_usage
  2. 使用率计算: 使用率 = (total - free) / total * 100%
  3. 包含缓存: 包含 buffers 和 cached 内存
  4. 自动暂停: 30 秒无访问自动暂停监控线程
  5. 自动恢复: 调用 getUsage() 时自动恢复
  6. 线程安全: getUsage() 是线程安全的
  7. 轮询间隔: 构造时指定轮询间隔(默认 1000ms)
  8. /proc/meminfo: 依赖 /proc/meminfo 文件

相关文档


参考资料

主页

API 文档

DMA 模块

DRM 模块

NET 模块

V4L2 模块

V4L2Param 模块

RGA 模块

MPP 模块

Sys 模块

Mouse 模块

Utils 模块

Clone this wiki locally