Python 程序突然被杀死

yov*_*hen 7 memory-leaks python ram out-of-memory

我正在运行一些非常繁重的 python 程序。我已经运行这个脚本好几个星期了,但在过去的几天里,程序被以下消息杀死:

Killed
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个8 GB的新交换文件,但它一直在发生。

我也尝试使用:

dmesg -T| grep -E -i -B100 'killed process'
Run Code Online (Sandbox Code Playgroud)

其中列出了错误:

[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/user@1000.service,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

Run Code Online (Sandbox Code Playgroud)

我有一台强大的机器,我尝试在运行时也没有运行其他任何东西(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
Run Code Online (Sandbox Code Playgroud)

ter*_*don 8

恐怕这里没什么可做的。该进程正在被 OOM 杀手(Out Of Memory Killer)杀死,它是操作系统的一个进程,它的工作是在机器崩溃之前杀死占用过多内存的作业。这是一件好事。没有它,您的机器只会变得无响应。

因此,您需要弄清楚为什么您的 python 脚本占用了如此多的内存,并尝试使其使用更少的内存。

唯一的另一种选择是尝试获得更多的交换,当然,或者更多的 RAM,但这感觉就像一个创可贴。如果这是您的 Python 脚本,您应该尽可能地专注于减少内存占用。


小智 5

由于您运行程序的时间更长,因此缓冲区内存可能会增加。您可以使用下面的垃圾收集功能来清理缓冲区内存。另外,您可以在需要的地方添加 gc.collect() 。

 import gc

 gc.collect()
Run Code Online (Sandbox Code Playgroud)