Django + Celery 系统 OOM(内存溢出)故障定位指南

113 阅读2分钟

OOM(Out Of Memory)是指系统或进程因内存耗尽被操作系统强制终止。对于 Django + Celery 这样的分布式任务系统,OOM 故障常见于任务处理、数据缓存、批量操作等场景。以下是定位和排查 OOM 故障的实用指南。


一、现象与初步判断

  • 进程被系统杀死,日志出现 KilledOOMKilled
  • 系统日志(如 /var/log/messagesdmesg)有 OOM 相关记录。
  • Celery worker 或 Django 进程频繁重启或无响应。

二、定位步骤

1. 查看系统 OOM 日志

dmesg | grep -i oom

cat /var/log/messages | grep -i oom

确认是哪个进程被杀死。

2. 监控内存使用

  • 使用 tophtopfree -m 实时监控内存。
  • 通过 ps aux --sort=-%mem | head 查看内存占用高的进程。

3. 分析 Celery Worker 内存

  • 启动 Celery worker 时加上 --max-memory-per-child 限制单任务内存:
    celery -A proj worker --max-memory-per-child=200000
    
  • 观察 worker 启动参数和并发数(-c)。

4. 使用 py-spy 或 memory_profiler 定位内存热点

  • 对 Celery worker 或 Django 进程采样分析:
    py-spy top --pid <worker_pid>
    py-spy record --pid <worker_pid> --output celery_flame.svg
    
  • 在代码中用 memory_profiler 标记可疑函数:
    from memory_profiler import profile
    
    @profile
    def my_task():
        ...
    

5. 检查任务代码

  • 排查是否有大对象、无限循环、未释放资源等问题。
  • 检查是否有批量处理、缓存、文件读写等高内存操作。

6. 配置优化

  • 限制 Celery worker 并发数(-c),避免过多进程抢占内存。
  • 使用数据库分页、流式处理等方式减少单次任务内存消耗。
  • 配置 Django 缓存和 ORM 查询,避免一次性加载大量数据。

三、常见 OOM 场景与解决建议

  • 大批量数据处理:分批处理,避免一次性加载全部数据。
  • 内存泄漏:检查第三方库和自定义代码,及时释放资源。
  • 缓存过大:合理配置 Django 缓存后端和 Celery 结果存储。
  • 任务无限重试:设置合理的重试次数和超时,避免任务堆积。

四、工具推荐

  • py-spy:采样分析内存热点。
  • memory_profiler:代码级内存监控。
  • psutil:进程和系统资源监控。
  • htop/top:系统级实时监控。

五、总结

OOM 故障定位需结合系统日志、内存监控、代码分析和配置优化。对于 Django + Celery 系统,建议合理限制 worker 并发和单任务内存,优化数据处理逻辑,及时释放资源,并借助分析工具定位问题根源。

如需具体代码分析或工具使用示例,请留言!