Python程序突然被杀死

Python程序突然被杀死

我正在运行一些相当繁重的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)

相关内容