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

故障处理

内存持续增长

现象: 警告日志频繁出现,内存持续增长

原因:

  • 数据量过大
  • 内存泄漏
  • 批处理大小不合理

解决方案:

  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
内存
磁盘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自动终止
# ✅ 详细日志记录
# ✅ 保护系统稳定

总结

本次更新实现了:

  1. 代码规范化: 统一使用logger,移除print
  2. 内存监控: 25GB警告,30GB强制终止
  3. 自动化运行: 集成监控到运行流程
  4. 日志记录: 详细的监控日志
  5. 测试工具: 提供测试脚本验证功能
  6. 完整文档: 使用指南和故障处理

核心价值

  • 🛡️ 保护系统: 防止内存溢出导致系统崩溃
  • 📊 实时监控: 每10秒检查一次内存使用
  • 🔔 及时告警: 25GB警告,30GB终止
  • 📝 日志完整: 所有监控事件都有记录
  • 🔧 易于调整: 阈值和频率可轻松修改

更新完成时间: 2025-10-17
状态: ✅ 已完成,可投入使用
建议: 先在测试环境验证后再用于生产