# 内存监控功能更新 ## 更新日期 2025-10-17 ## 更新内容 ### 1. ✅ 代码规范:移除 print,统一使用 logger #### 检查结果 - ✅ `i2i_content_similar.py` - 已全部使用 logger - ✅ `test_es_connection.py` - print用于测试工具输出(符合预期) - ✅ 所有核心代码已使用 logger ### 2. ✅ run.sh 添加内存监控功能 #### 核心功能 **内存监控函数**: ```bash check_memory() { local pid=$1 local threshold_warn=25 # 25GB警告阈值 local threshold_kill=30 # 30GB强制kill阈值 while kill -0 $pid 2>/dev/null; do 获取进程内存使用(MB) 转换为GB if 内存 >= 30GB: 打印错误日志到终端和文件 强制kill进程 break elif 内存 >= 25GB: 打印警告日志到终端和文件 sleep 10秒检查一次 done } ``` #### 监控特性 | 特性 | 说明 | |------|------| | **警告阈值** | 25GB - 打印警告但继续运行 | | **终止阈值** | 30GB - 强制kill进程 | | **检查频率** | 每10秒检查一次 | | **日志输出** | 终端 + `logs/memory_monitor.log` | | **自动清理** | 任务完成后自动终止监控 | #### 日志格式 **警告日志**: ``` [2025-10-17 14:30:25] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12345 ``` **强制终止日志**: ``` [2025-10-17 14:35:30] ❌ 内存超限!当前使用: 31.20GB (>= 30GB), 强制终止进程 PID=12345 ``` ### 3. ✅ 增强的运行流程 #### 更新后的执行流程 ```bash #!/bin/bash 1. 定义内存监控函数 2. 清理旧进程和输出 3. 创建logs目录 4. 显示开始信息(包含监控阈值) # 调试模式 5. 启动调试任务(后台) 6. 启动内存监控(后台) 7. 等待任务完成 8. 终止监控进程 9. 检查退出码 # 生产模式 10. 启动生产任务(后台) 11. 启动内存监控(后台) 12. 等待任务完成 13. 终止监控进程 14. 检查退出码 # 加载Redis 15. 加载索引到Redis 16. 检查退出码 17. 显示完成信息 ``` ### 4. ✅ 新增文件 | 文件 | 说明 | |------|------| | `run.sh` | 更新:添加内存监控 | | `RUN_SCRIPT_GUIDE.md` | 新增:运行脚本使用指南 | | `test_memory_monitor.sh` | 新增:内存监控测试脚本 | | `MEMORY_MONITORING_UPDATE.md` | 新增:本文档 | ## 使用指南 ### 基本使用 ```bash # 1. 运行脚本(自动监控内存) cd /home/tw/recommendation/offline_tasks ./run.sh # 2. 查看监控日志 tail -f logs/memory_monitor.log # 3. 查看系统内存 free -h ``` ### 测试监控功能 ```bash # 运行测试脚本 ./test_memory_monitor.sh ``` ### 自定义阈值 编辑 `run.sh` 第8-9行: ```bash local threshold_warn=25 # 修改警告阈值 local threshold_kill=30 # 修改强制kill阈值 ``` ## 技术细节 ### 内存获取 ```bash # 获取进程内存(RSS,单位KB) ps -p $pid -o rss= # 转换为MB mem_mb=$(ps -p $pid -o rss= | awk '{print int($1/1024)}') # 转换为GB mem_gb=$(echo "scale=2; $mem_mb/1024" | bc) ``` ### 进程检查 ```bash # 检查进程是否存在 kill -0 $pid 2>/dev/null # 返回值: # 0 - 进程存在 # 非0 - 进程不存在 ``` ### 强制终止 ```bash # 发送SIGKILL信号 kill -9 $pid # 特点: # - 立即终止,不可捕获 # - 不执行清理代码 # - 确保进程被终止 ``` ## 输出示例 ### 正常运行(内存未超限) ``` ====================================================================== 开始运行离线任务 - 2025-10-17 14:00:00 内存监控: 警告阈值=25GB, 强制终止阈值=30GB ====================================================================== >>> 步骤1: 调试模式运行(小数据量) 调试任务 PID: 12345 ✓ 调试模式完成 >>> 步骤2: 生产模式运行(大数据量) 生产任务 PID: 12346 ✓ 生产模式完成 >>> 步骤3: 加载到Redis ✓ Redis加载完成 ====================================================================== 所有任务完成 - 2025-10-17 16:30:00 ====================================================================== ``` ### 内存警告(25GB-30GB) ``` >>> 步骤2: 生产模式运行(大数据量) 生产任务 PID: 12346 [2025-10-17 15:20:15] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12346 [2025-10-17 15:22:30] ⚠️ 内存警告!当前使用: 27.80GB (>= 25GB), PID=12346 [2025-10-17 15:24:45] ⚠️ 内存警告!当前使用: 28.95GB (>= 25GB), PID=12346 ✓ 生产模式完成 ``` ### 内存超限(>=30GB) ``` >>> 步骤2: 生产模式运行(大数据量) 生产任务 PID: 12346 [2025-10-17 15:20:15] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12346 [2025-10-17 15:22:30] ⚠️ 内存警告!当前使用: 28.80GB (>= 25GB), PID=12346 [2025-10-17 15:24:45] ❌ 内存超限!当前使用: 31.20GB (>= 30GB), 强制终止进程 PID=12346 ✗ 生产模式失败,退出码: 137 ``` ## 监控日志示例 `logs/memory_monitor.log`: ``` [2025-10-17 15:20:15] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12346 [2025-10-17 15:22:30] ⚠️ 内存警告!当前使用: 28.80GB (>= 25GB), PID=12346 [2025-10-17 15:24:45] ❌ 内存超限!当前使用: 31.20GB (>= 30GB), 强制终止进程 PID=12346 ``` ## 故障处理 ### 内存持续增长 **现象**: 警告日志频繁出现,内存持续增长 **原因**: - 数据量过大 - 内存泄漏 - 批处理大小不合理 **解决方案**: 1. 减小批处理大小 2. 增加垃圾回收频率 3. 优化算法减少内存占用 4. 考虑分批运行 ### 进程被误杀 **现象**: 任务未完成就被终止 **原因**: - 阈值设置过低 - 系统其他进程占用内存 **解决方案**: 1. 提高阈值(修改 run.sh) 2. 优化代码减少内存使用 3. 关闭不必要的系统进程 ### 监控不生效 **检查清单**: - [ ] `bc` 命令是否安装:`which bc` - [ ] 脚本是否有执行权限:`ls -l run.sh` - [ ] logs目录是否存在:`ls -ld logs/` - [ ] 进程是否在后台运行:`ps aux | grep run_all` ## 性能影响 ### 监控开销 | 项目 | 影响 | |------|------| | CPU | < 0.1% (每10秒运行一次ps命令) | | 内存 | < 10MB (监控脚本本身) | | 磁盘I/O | 极小 (仅写日志) | ### 建议 - ✅ 检查频率10秒合理,不建议小于5秒 - ✅ 警告阈值25GB为系统总内存的合理比例 - ✅ 终止阈值30GB留有5GB缓冲空间 - ⚠️ 根据实际情况调整阈值 ## 最佳实践 ### 1. 定期查看日志 ```bash # 每天检查 cat logs/memory_monitor.log # 统计警告次数 grep "⚠️" logs/memory_monitor.log | wc -l # 统计终止次数 grep "❌" logs/memory_monitor.log | wc -l ``` ### 2. 设置定时任务 ```bash # 每周一凌晨2点运行 0 2 * * 1 /home/tw/recommendation/offline_tasks/run.sh >> /var/log/offline_tasks.log 2>&1 ``` ### 3. 配置告警 ```bash # 在 run.sh 末尾添加 if grep -q "❌" logs/memory_monitor.log; then echo "内存超限告警" | mail -s "[告警] 离线任务内存超限" admin@example.com fi ``` ### 4. 监控系统资源 ```bash # 安装监控工具 apt install htop sysstat # 实时监控 htop -p $(pgrep -f run_all.py) # 查看历史 sar -r 1 10 # 内存使用情况 ``` ## 对比 ### 更新前 ```bash # 无内存监控 python3 run_all.py --lookback_days 730 --top_n 50 # 问题: # - 内存可能无限增长 # - OOM导致系统崩溃 # - 无法及时发现问题 ``` ### 更新后 ```bash # 自动内存监控 ./run.sh # 优势: # ✅ 25GB警告提醒 # ✅ 30GB自动终止 # ✅ 详细日志记录 # ✅ 保护系统稳定 ``` ## 总结 本次更新实现了: 1. ✅ **代码规范化**: 统一使用logger,移除print 2. ✅ **内存监控**: 25GB警告,30GB强制终止 3. ✅ **自动化运行**: 集成监控到运行流程 4. ✅ **日志记录**: 详细的监控日志 5. ✅ **测试工具**: 提供测试脚本验证功能 6. ✅ **完整文档**: 使用指南和故障处理 ### 核心价值 - 🛡️ **保护系统**: 防止内存溢出导致系统崩溃 - 📊 **实时监控**: 每10秒检查一次内存使用 - 🔔 **及时告警**: 25GB警告,30GB终止 - 📝 **日志完整**: 所有监控事件都有记录 - 🔧 **易于调整**: 阈值和频率可轻松修改 --- **更新完成时间**: 2025-10-17 **状态**: ✅ 已完成,可投入使用 **建议**: 先在测试环境验证后再用于生产