大内存Jupyter Notebook执行命令后CPU占满100%的原因及解决办法
Jupyter Notebook高内存占用下CPU飙升问题的分析与解决
问题现象
- 大型Notebook内存占用持续150GB以上
- 执行任意命令(如
1+1)后,虽能返回结果,但随即出现100% CPU占用,内存先升至230GB以上,再回落至150GB左右 - 仅在得到结果后立即中断内核,才能执行下一条命令,但重复执行后仍会触发相同的CPU占满现象
版本信息
jupyter core : 4.6.1 jupyter-notebook : 6.0.2 qtconsole : 4.7.7 ipython : 7.9.0 ipykernel : 5.1.3 jupyter client : 5.3.4 jupyter lab : 1.1.4 nbconvert : 5.6.1 ipywidgets : 7.5.1 nbformat : 4.4.0 traitlets : 4.3.3 python : 3.6.9
原因分析
- 垃圾回收(GC)触发:内存占用处于高位时,Python自动GC会触发全量对象扫描,尤其是存在大量大对象时,GC的遍历和清理过程会消耗极高CPU资源,同时为整理内存会出现临时内存飙升。
- Notebook状态序列化:Jupyter内核默认定期保存Notebook的变量状态、输出缓存等信息(自动检查点),当内存中存在大量大对象时,序列化整个状态的过程会占用大量CPU和临时内存。
- 输出缓存累积:Notebook会保存所有单元格的输出内容,随着执行次数增加,缓存的输出对象越来越多,每次执行后内核需要更新和维护这些缓存,带来额外性能开销。
解决办法
- 禁用自动检查点:修改Jupyter配置文件(
jupyter_notebook_config.py),添加配置:
避免每次执行后自动保存状态快照,减少序列化开销。c.FileContentsManager.autosave_interval = 0 - 手动管理内存与GC:
- 对不再使用的变量,执行
del var后手动调用gc.collect(),主动清理内存,避免自动GC在高负载时触发。 - 调整GC阈值,减少触发频率(需权衡内存泄漏风险):
import gc gc.set_threshold(500, 10, 10)
- 对不再使用的变量,执行
- 清理输出与变量缓存:
- 执行
%reset -f快速清理所有全局变量(无需确认)。 - 执行
%xdel var删除指定变量并清理其对应的输出缓存。 - 在Notebook设置中关闭"Save widget state in notebook"选项,减少额外状态存储。
- 执行
- 拆分大型Notebook:将单一大Notebook拆分为多个小Notebook,按任务模块拆分执行,降低单个内核的内存占用,从根源缓解压力。
- 使用外部脚本执行:通过
%run script.py命令运行外部Python脚本,避免大量变量累积在Notebook内核环境中。 - 升级Jupyter版本:当前使用的版本较陈旧,新版本对内存管理、内核性能有针对性优化,升级至最新稳定版可有效缓解这类问题。
- 限制内核资源:在配置文件中设置内核的内存上限,避免内存过度飙升:
注意内存上限需高于当前常规占用值,避免触发OOM(内存不足)错误。c.Spawner.mem_limit = '160G'
内容的提问来源于stack exchange,提问作者user10
相关产品推荐
相关产品推荐

