我正在运行一些相当繁重的Python程序。我已经运行这个脚本几个星期了,但在过去的几天里,该程序被终止并显示以下消息:
Killed
我试过创建一个新的交换文件8 GB,但这种情况一直在发生。
我也尝试使用:
dmesg -T| grep -E -i -B100 'killed process'
其中列出了错误:
[Sat Oct 17 02:08:41 2020] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/[email protected],task=python,pid=56849,uid=1000
[Sat Oct 17 02:08:41 2020] Out of memory: Killed process 56849 (python) total-vm:21719376kB, anon-rss:14311012kB, file-rss:0kB, shmem-rss:4kB, UID:1000 pgtables:40572kB oom_score_adj:0
我有一台强大的机器,我也尝试在运行时不运行任何其他东西(Pycharm 或终端),但它不断发生。
眼镜:
- Ubuntu 20.04 LTS(64 位)
- 15.4 GiB 内存
- 英特尔酷睿 i7-105100 CPU @ 1.80 GHz x 8
跑步时free -h t
total used free shared buff/cache available
Mem: 15Gi 2.4Gi 10Gi 313Mi 2.0Gi 12Gi
Swap: 8.0Gi 1.0Gi 7.0Gi
答案1
恐怕这里没什么可做的。该进程正在被 OOM 杀手(内存不足杀手)杀死,这是操作系统的一个进程,其任务是在占用过多内存的作业导致机器崩溃之前杀死它们。这是一件好事。没有它,您的机器就会变得无响应。
因此,您需要弄清楚为什么您的 python 脚本占用了这么多内存,并尝试使其使用更少。
唯一的其他选择是尝试获得更多的交换空间,或者当然是更多的 RAM,但这感觉就像创可贴。如果这是你的 python 脚本,你应该尽可能减少它对内存的消耗。
答案2
由于您运行程序的时间更长,因此缓冲区内存可能会增加。您可以使用下面的垃圾收集功能来清理缓冲区内存。另外,您可以在需要的地方添加 gc.collect() 。
import gc
gc.collect()
答案3
我有一个类似的问题。我有一个 python 脚本,它运行几分钟来创建 matplotlib 绘图文件。如果我直接通过 python script.py 从命令行运行脚本,那么一切正常。一旦我从 bash 脚本运行它,内存使用量就会随着时间的推移而增加,最终停止并显示与上面相同的终止消息。我还没有找到解决方案,但我希望这对将来的人有帮助。
答案4
我读到了 Instagram 开发者如何完全禁用垃圾收集。
原因是当进程创建子进程时,它们共享内存,但随着内存页的更改,新的被复制,从而增加 RAM 使用量。
因此,在删除内存之前禁用垃圾收集以不存储代将有助于减少 RAM 使用量。因为当引用计数达到零时,gc 实际上并未被禁用,但它只是没有阈值来等待达到该值。
这可以通过将阈值设置为 来完成0
。
import gc
gc.set_threshold(0)