MEMORY_MONITORING_UPDATE.md
8.28 KB
内存监控功能更新
更新日期
2025-10-17
更新内容
1. ✅ 代码规范:移除 print,统一使用 logger
检查结果
- ✅
i2i_content_similar.py- 已全部使用 logger - ✅
test_es_connection.py- print用于测试工具输出(符合预期) - ✅ 所有核心代码已使用 logger
2. ✅ run.sh 添加内存监控功能
核心功能
内存监控函数:
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. ✅ 增强的运行流程
更新后的执行流程
#!/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 |
新增:本文档 |
使用指南
基本使用
# 1. 运行脚本(自动监控内存)
cd /home/tw/recommendation/offline_tasks
./run.sh
# 2. 查看监控日志
tail -f logs/memory_monitor.log
# 3. 查看系统内存
free -h
测试监控功能
# 运行测试脚本
./test_memory_monitor.sh
自定义阈值
编辑 run.sh 第8-9行:
local threshold_warn=25 # 修改警告阈值
local threshold_kill=30 # 修改强制kill阈值
技术细节
内存获取
# 获取进程内存(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)
进程检查
# 检查进程是否存在
kill -0 $pid 2>/dev/null
# 返回值:
# 0 - 进程存在
# 非0 - 进程不存在
强制终止
# 发送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
故障处理
内存持续增长
现象: 警告日志频繁出现,内存持续增长
原因:
- 数据量过大
- 内存泄漏
- 批处理大小不合理
解决方案:
- 减小批处理大小
- 增加垃圾回收频率
- 优化算法减少内存占用
- 考虑分批运行
进程被误杀
现象: 任务未完成就被终止
原因:
- 阈值设置过低
- 系统其他进程占用内存
解决方案:
- 提高阈值(修改 run.sh)
- 优化代码减少内存使用
- 关闭不必要的系统进程
监控不生效
检查清单:
- [ ]
bc命令是否安装:which bc - [ ] 脚本是否有执行权限:
ls -l run.sh - [ ] logs目录是否存在:
ls -ld logs/ - [ ] 进程是否在后台运行:
ps aux | grep run_all
性能影响
监控开销
| 项目 | 影响 |
|---|---|
| CPU | |
| 内存 | |
| 磁盘I/O | 极小 (仅写日志) |
建议
- ✅ 检查频率10秒合理,不建议小于5秒
- ✅ 警告阈值25GB为系统总内存的合理比例
- ✅ 终止阈值30GB留有5GB缓冲空间
- ⚠️ 根据实际情况调整阈值
最佳实践
1. 定期查看日志
# 每天检查
cat logs/memory_monitor.log
# 统计警告次数
grep "⚠️" logs/memory_monitor.log | wc -l
# 统计终止次数
grep "❌" logs/memory_monitor.log | wc -l
2. 设置定时任务
# 每周一凌晨2点运行
0 2 * * 1 /home/tw/recommendation/offline_tasks/run.sh >> /var/log/offline_tasks.log 2>&1
3. 配置告警
# 在 run.sh 末尾添加
if grep -q "❌" logs/memory_monitor.log; then
echo "内存超限告警" | mail -s "[告警] 离线任务内存超限" admin@example.com
fi
4. 监控系统资源
# 安装监控工具
apt install htop sysstat
# 实时监控
htop -p $(pgrep -f run_all.py)
# 查看历史
sar -r 1 10 # 内存使用情况
对比
更新前
# 无内存监控
python3 run_all.py --lookback_days 730 --top_n 50
# 问题:
# - 内存可能无限增长
# - OOM导致系统崩溃
# - 无法及时发现问题
更新后
# 自动内存监控
./run.sh
# 优势:
# ✅ 25GB警告提醒
# ✅ 30GB自动终止
# ✅ 详细日志记录
# ✅ 保护系统稳定
总结
本次更新实现了:
- ✅ 代码规范化: 统一使用logger,移除print
- ✅ 内存监控: 25GB警告,30GB强制终止
- ✅ 自动化运行: 集成监控到运行流程
- ✅ 日志记录: 详细的监控日志
- ✅ 测试工具: 提供测试脚本验证功能
- ✅ 完整文档: 使用指南和故障处理
核心价值
- 🛡️ 保护系统: 防止内存溢出导致系统崩溃
- 📊 实时监控: 每10秒检查一次内存使用
- 🔔 及时告警: 25GB警告,30GB终止
- 📝 日志完整: 所有监控事件都有记录
- 🔧 易于调整: 阈值和频率可轻松修改
更新完成时间: 2025-10-17
状态: ✅ 已完成,可投入使用
建议: 先在测试环境验证后再用于生产