# mem_hot **Repository Path**: heppen/mem_hot ## Basic Information - **Project Name**: mem_hot - **Description**: arm64下内存热度识别 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-08 - **Last Updated**: 2026-01-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 内存热度分析工具 (Memory Heat Analysis Tool) ## 项目简介 内存热度分析工具是一个基于ARM SPE(Statistical Profiling Extension)的内存页面热度识别和分析工具。该工具采用模块化架构设计,能够实时监控内存访问模式,识别热点页面,为内存层级管理和性能优化提供数据支持。 ### 主要特性 - 🔥 **热度分析**: 基于EMA算法的页面热度计算 - 📊 **实时监控**: 支持连续模式和单次分析 - 🎯 **智能过滤**: 可选择内核/用户空间分析范围 - 📈 **数据导出**: 支持CSV/JSON格式结果导出 - 🧠 **内存管理**: 预留内存页面提升/降级接口 - 🔧 **模块化设计**: 清晰的代码架构,易于维护和扩展 ## 系统要求 ### 硬件要求 - ARM架构处理器(aarch64/arm64) - 支持ARM SPE的CPU(如ARM Cortex-A76及以上) - 最少2GB可用内存 ### 软件要求 - Linux操作系统(建议内核版本4.15+) - root权限(访问SPE硬件需要) - C++17兼容编译器(GCC 7+或Clang 6+) - CMake 3.16或更高版本 ### 依赖库 - 标准C++库 - pthread线程库 - 系统调用接口(perf_event_open等) ## 快速开始 ### 1. 获取代码 ```bash git clone [repository-url] cd mem_hot ``` ### 2. 编译项目 ```bash # 使用编译脚本(推荐) ./build.sh # 或手动编译 mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j$(nproc) ``` ### 3. 运行测试 ```bash # 使用运行脚本(推荐) ./run.sh quick # 或直接运行 sudo ./build/src/mem_hot -t 3 -v ``` ## 详细使用说明 ### 编译选项 #### 使用编译脚本 ```bash ./build.sh # Release模式编译 ./build.sh debug # Debug模式编译 ./build.sh clean # 清理构建文件 ./build.sh help # 显示帮助 ``` #### 手动编译 ```bash # Release模式 cmake -DCMAKE_BUILD_TYPE=Release -S . -B build cd build && make -j$(nproc) # Debug模式 cmake -DCMAKE_BUILD_TYPE=Debug -S . -B build cd build && make -j$(nproc) ``` ### 运行模式 #### 预设模式 ```bash ./run.sh quick # 快速测试(3秒采样) ./run.sh detailed # 详细分析(10秒采样) ./run.sh monitor # 连续监控模式 ./run.sh export # 导出CSV结果 ./run.sh memory # 内存管理分析 ``` #### 直接参数 ```bash sudo ./build/src/mem_hot [选项] ``` ### 命令行参数 #### 基本选项 ``` -h, --help 显示帮助信息 -t, --time <秒> 采样时长 (默认: 3秒) -o, --output <文件> 输出文件 (默认: mem_heat_analysis.csv) -p, --pid <进程ID> 目标进程ID (默认: 所有进程) -T, --total-time <秒> 总运行时间 (0=单次运行) ``` #### 分析范围 ``` -k, --kernel-only 仅分析内核空间访问 -u, --user-only 仅分析用户空间访问 -n, --top <数量> 显示TOP页面数量 (默认: 10) ``` #### 运行模式 ``` -v, --verbose 详细输出模式 -c, --continuous 连续监控模式 -C, --compact 紧凑输出格式 -i, --interval <秒> 显示间隔 (默认: 5秒) ``` #### 算法参数 ``` -a, --alpha <值> EMA平滑因子 (0.0-1.0, 默认: 0.3) ``` #### 内存管理 (实验性) ``` -m, --memory 启用内存管理分析 -P, --promote-threshold 提升阈值 (默认: 0.7) -D, --demote-threshold 降级阈值 (默认: 0.3) ``` ### 使用示例 #### 基础使用 ```bash # 采样5秒并导出结果 sudo ./build/src/mem_hot -t 5 -o results.csv # 详细模式分析,显示TOP20页面 sudo ./build/src/mem_hot -v -t 10 -n 20 # 仅分析内核空间 sudo ./build/src/mem_hot -k -t 5 -v # 分析特定进程 (PID 1234) sudo ./build/src/mem_hot -p 1234 -t 10 -v ``` #### 连续监控 ```bash # 连续监控60秒,每5秒显示一次 sudo ./build/src/mem_hot -c -T 60 -i 5 -v # 紧凑模式连续监控 sudo ./build/src/mem_hot -c -C -i 3 ``` #### 内存管理分析 ```bash # 启用内存管理分析 sudo ./build/src/mem_hot -m -v -t 10 # 自定义提升/降级阈值 sudo ./build/src/mem_hot -m -P 0.8 -D 0.2 -t 15 ``` ## 技术架构 ### 模块设计 项目采用清晰的模块化架构,主要包含以下模块: ``` mem_hot/ ├── include/ # 头文件目录 │ ├── app_controller.h # 应用控制器 │ ├── cli.h # 命令行接口 │ ├── spe_mgr.h # SPE硬件管理 │ ├── processor.h # 数据处理器 │ ├── displayer.h # 结果显示器 │ ├── mem_mgr.h # 内存管理器 │ └── mem_heat.h # 核心热度分析 ├── src/ # 源文件目录 │ ├── main.cpp # 主程序入口 │ ├── app_controller.cpp # 应用控制器实现 │ ├── cli.cpp # 命令行解析实现 │ ├── spe_mgr.cpp # SPE管理实现 │ ├── processor.cpp # 数据处理实现 │ ├── displayer.cpp # 结果显示实现 │ ├── mem_mgr.cpp # 内存管理实现 │ └── mem_heat.cpp # 热度分析实现 ├── build.sh # 编译脚本 ├── run.sh # 运行脚本 ├── CMakeLists.txt # CMake构建配置 └── README.md # 项目文档 ``` #### 1. AppController (应用控制器) - **职责**: 协调各模块工作,控制程序执行流程 - **功能**: 初始化管理、阶段控制、错误处理、资源清理 #### 2. CLI (命令行接口) - **职责**: 解析命令行参数,配置验证 - **功能**: 参数解析、配置验证、帮助显示 #### 3. SpeManager (SPE管理器) - **职责**: ARM SPE硬件抽象和数据采集 - **功能**: 硬件初始化、采样控制、数据缓冲、权限检查 #### 4. Processor (数据处理器) - **职责**: SPE原始数据解析和热度计算 - **功能**: 数据解析、地址转换、热度计算、EMA平滑 #### 5. Displayer (结果显示器) - **职责**: 结果格式化和数据导出 - **功能**: 实时显示、表格格式化、CSV/JSON导出 #### 6. MemManager (内存管理器) - **职责**: 内存层级管理和页面迁移决策(预留) - **功能**: 层级管理、迁移建议、容量监控 ### 工作流程 ```mermaid graph TD A[程序启动] --> B[CLI参数解析] B --> C[AppController初始化] C --> D[各模块初始化] D --> E{运行模式?} E -->|单次| F[SPE采样] E -->|连续| G[连续采样循环] F --> H[数据处理] G --> H H --> I[热度分析] I --> J[结果显示] J --> K{内存管理?} K -->|是| L[迁移分析] K -->|否| M[结果导出] L --> M M --> N[清理资源] N --> O[程序结束] ``` ### 核心算法 #### EMA热度计算 ```cpp // 指数移动平均算法 ema_score = alpha * current_score + (1 - alpha) * previous_ema_score // 热度等级判定 if (ema_score >= 0.7) level = BURNING; else if (ema_score >= 0.5) level = HOT; else if (ema_score >= 0.3) level = WARM; else level = COLD; ``` #### 页面地址转换 ```cpp // 4KB页面对齐 page_addr = virtual_addr & ~(4096UL - 1); ``` ## 实现原理 ### ARM SPE技术 ARM SPE(Statistical Profiling Extension)是ARM架构提供的硬件性能分析扩展,能够以低开销的方式采样处理器的执行信息。 #### SPE采样原理 1. **硬件采样**: CPU按设定周期自动采样 2. **样本记录**: 记录内存访问、分支预测等信息 3. **缓冲机制**: 样本存储在环形缓冲区中 4. **软件读取**: 通过perf_event_open接口读取数据 #### 数据结构 SPE样本包含以下信息: - 虚拟地址和物理地址 - 访问类型(读/写) - 时间戳信息 - 指令信息 - 延迟信息 ### 热度分析算法 #### EMA平滑算法 使用指数移动平均(EMA)算法计算页面热度: ``` 特点: - 对最近访问给予更高权重 - 平滑处理历史数据 - 参数alpha控制敏感度(0.1-0.5推荐) ``` #### 热度评分机制 ``` 计算因子: 1. 访问频率:单位时间内访问次数 2. 时间衰减:考虑访问时间分布 3. 访问模式:读写比例,突发性访问 4. 空间局部性:相邻页面访问相关性 ``` ### 内存层级管理 #### 五级内存层级 ``` TIER_CACHE_HOT (0) - 缓存热点层 (64MB) TIER_MEMORY_LOCKED (1) - 内存锁定层 (2GB) TIER_NORMAL (2) - 普通内存层 (8GB) TIER_COLD (3) - 冷内存层 (4GB) TIER_STORAGE (4) - 存储层 (1TB) ``` #### 迁移决策 ```cpp // 提升条件 if (heat_score >= promotion_threshold && current_tier > TIER_CACHE_HOT) { suggest_action = PROMOTE; } // 降级条件 if (heat_score <= demotion_threshold && current_tier < TIER_STORAGE) { suggest_action = DEMOTE; } ``` ## 性能与优化 ### 性能特点 - **低开销采样**: SPE硬件采样,CPU开销<1% - **高效处理**: 批量数据处理,支持并行化 - **内存友好**: 使用环形缓冲区,控制内存使用 - **可扩展性**: 模块化设计,支持功能扩展 ### 优化建议 ```bash # 1. 调整采样周期(减少开销) -p 4096 # 较大周期,降低采样频率 # 2. 限制分析范围 -k # 仅分析内核,减少数据量 # 3. 使用紧凑输出 -C # 减少显示开销 # 4. 合理设置EMA因子 -a 0.2 # 较小alpha,更稳定的热度计算 ``` ## 故障排除 ### 常见问题 #### 1. 权限问题 ```bash 错误: 需要root权限运行SPE采样 解决: sudo ./run.sh [模式] ``` #### 2. 硬件不支持 ```bash 错误: 硬件不支持ARM SPE 解决: 工具将自动切换到模拟模式 ``` #### 3. perf_event_paranoid设置 ```bash 错误: perf_event_paranoid设置过严格 解决: echo 1 | sudo tee /proc/sys/kernel/perf_event_paranoid ``` #### 4. 编译错误 ```bash 错误: cmake版本过低 解决: 升级cmake到3.16+或使用build.sh脚本 ``` ### 调试模式 #### 启用详细日志 ```bash # 编译Debug版本 ./build.sh debug # 运行详细模式 sudo ./build/src/mem_hot -v -t 5 ``` #### 检查运行环境 ```bash # 检查SPE设备 ls -la /sys/bus/event_source/devices/arm_spe_* # 检查内核版本 uname -r # 检查CPU特性 cat /proc/cpuinfo | grep -i spe ``` ## 开发指南 ### 代码规范 - 遵循Clean Code原则 - 函数不超过20行 - 单一职责原则 - 使用有意义的命名 - 注释使用中文 ### 扩展开发 #### 添加新的热度算法 ```cpp // 在processor.h中添加新方法 double calculateCustomHeatScore(const PageInfo& info) const; // 在processor.cpp中实现 double Processor::calculateCustomHeatScore(const PageInfo& info) const { // 自定义算法实现 return score; } ``` #### 添加新的导出格式 ```cpp // 在displayer.h中添加新方法 bool exportXml(const string& filename, const vector>& hotPages, const ProcessStats& stats) const; ``` #### 扩展内存管理策略 ```cpp // 在mem_mgr.h中添加新策略 enum MigrationStrategy { STRATEGY_CONSERVATIVE, STRATEGY_AGGRESSIVE, STRATEGY_ADAPTIVE }; ``` ### 测试建议 #### 单元测试 ```bash # 建议使用Google Test框架 # 测试各模块接口 # 模拟SPE数据进行测试 ``` #### 集成测试 ```bash # 端到端测试 ./run.sh quick ./run.sh detailed ./run.sh memory ``` #### 性能测试 ```bash # 长时间运行测试 sudo ./build/src/mem_hot -c -T 3600 -i 60 # 大数据量测试 sudo ./build/src/mem_hot -t 60 -p 512 ``` ## 版本历史 ### v2.0.0 (当前版本) - ✅ 完全重构,模块化架构 - ✅ 简化文件命名和结构 - ✅ 统一编译和运行脚本 - ✅ 完善的中文文档 - ✅ 预留内存管理接口 ### v1.x (原版本) - 基础SPE采样功能 - 单文件实现 - 基本热度分析 ## 许可证 Copyright (c) 2024. All rights reserved. ## 贡献指南 欢迎提交Issue和Pull Request来改进项目。 ### 提交规范 - 使用中文描述问题和改进 - 遵循现有代码风格 - 添加必要的测试 - 更新相关文档 ## 联系方式 如有问题或建议,请通过以下方式联系: - 提交GitHub Issue - 发送邮件至项目维护者 - 参与项目讨论 --- **注意**: 本工具主要用于性能分析和研究目的,在生产环境使用时请充分测试并评估对系统性能的影响。