OOM(Out Of Memory)是指系统或进程因内存耗尽被操作系统强制终止。对于 Django + Celery 这样的分布式任务系统,OOM 故障常见于任务处理、数据缓存、批量操作等场景。以下是定位和排查 OOM 故障的实用指南。
一、现象与初步判断
- 进程被系统杀死,日志出现
Killed或OOMKilled。 - 系统日志(如
/var/log/messages、dmesg)有 OOM 相关记录。 - Celery worker 或 Django 进程频繁重启或无响应。
二、定位步骤
1. 查看系统 OOM 日志
dmesg | grep -i oom
或
cat /var/log/messages | grep -i oom
确认是哪个进程被杀死。
2. 监控内存使用
- 使用
top、htop、free -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 并发和单任务内存,优化数据处理逻辑,及时释放资源,并借助分析工具定位问题根源。
如需具体代码分析或工具使用示例,请留言!