约 600 字
2 分钟
一次 OOM 排查记录
-
-
无标签
摘要
半夜告警一个 Python 进程把 8GB 内存吃光了。用 tracemalloc 定位到 pd.concat 在 8 亿行数据上的内存翻倍问题。
上周三凌晨 3 点,Prometheus 告警炸了:一个 Python worker 进程占了 8GB 内存,整个服务被 OOM Killer 干掉,重启后 4 小时又挂了。
看数据
打开 dmesg | grep -i oom:
纯文本
挂 tracemalloc
给进程加个 tracemalloc,重启,等 4 小时再炸。
看 top 20 分配点:
纯文本
问题在 etl.py:87,我自己的代码。
代码是这样的
Python
old_df 是从数据库全量加载的,8 亿行。每次调用,pd.concat 都会复制一份,然后 drop_duplicates 又复制一份。
怎么修
Python
复盘
没有 "内存使用趋势" 看板,没看到缓慢上涨
没给 DataFrame 内存使用加 metric
写代码时没想数据增长,这是个常见错误
留个备忘
Python 处理数据,三件套要警觉:
pd.concat:永远 O(n+m),大表不要 concatdf.drop_duplicates():会复制内存,能 SQL 做就 SQL 做列表推导 + 字符串拼接:用
str.join,不要用+
相关文章
暂无相关文章
