操作系统:Ubuntu 22.04.4 LTS,64 位,64Gb RAM
蟒蛇:3.9.19
概括:
- 在 Python 中运行内存密集型分析会导致 Python 在大多数情况下崩溃,但并非总是如此。
- 当 RAM 耗尽并且 Python 开始使用虚拟内存时,就会特别发生崩溃。
- 其他程序(ImageJ)能够使用虚拟内存而不会崩溃,这使得问题看起来像是 python 特有的。
- 分析最初是在运行 python 3.9 的环境中在 Anaconda3 中运行,但在运行 python 3.11 的不同 anaconda 环境中以及在 Ubuntu 22.04 本机 python 3.10 中运行时崩溃行为仍然存在。
- 当 python 崩溃时,它不会生成任何
dmesg()
报告。 - 增加交换文件大小没有帮助。
- 在不同的驱动器上添加交换文件没有帮助。
- 增加或减少 vm.swappiness 没有帮助。
- 更改 vm.overcommit_memory 行为没有帮助。
journalctl -xe
实际上确实包含了一份崩溃报告,表明 system-oomd 由于高内存压力而终止了进程,尽管报告的内存使用统计信息与系统监视器记录的内存使用情况不匹配。
原问题:
我有一台本质上全新的 ubuntu 机器,我一直在尝试用它在 python 中执行一些内存密集型处理。
最初,我遇到了一个问题,每当我尝试执行任何内存密集型操作时,我的 python 内核都会被终止,并且我会在 python 中收到“内存不足”错误。
我发现,不知何故,当我最初安装 Ubuntu 时,我的交换文件大小为 2GB,这显然是问题所在。我设置了一个 120GB 的新文件,之后就再也没有遇到过这个问题。
相反,我遇到的情况是,80% 的情况下,当 python 耗尽 RAM 并开始使用交换时,python 就会完全崩溃并关闭。没有错误消息,dmesg 日志中也没有添加任何内容,它只是关闭。
特别令人恼火的是,这种情况只发生在 80% 的情况下。20% 的情况下,运行相同的代码且其他所有内容都完全相同,程序运行完全正常,没有任何问题。它耗尽了 RAM,并开始使用交换区,只要交换区没有用完,一切都会成功。
我尝试过更改 swappiness,但这似乎根本没有任何效果。我注意到交换文件的优先级设置为 -1,所以我先将其更改为 1,然后更改为 0,但这些都不起作用。
我什至尝试在 python 中运行一小段代码,它只会消耗内存,以查看问题是否专门与我正在运行的分析有关,但不是。RAM 被用完,交换文件使用了分配的 120GB 中的 7-12GB,然后 Python 崩溃了。
更新:除了 2tb 操作系统磁盘上的交换文件之外,我还尝试在 8tb 内部存储 HDD 上添加第二个交换文件,这工作了一段时间。python 脚本会达到 99% RAM 使用率,然后写入内容进行交换,RAM 使用率会暂时下降,等等。然而,运行脚本几次后,行为恢复到之前的状态,其中 RAM 使用率上升到 99%,交换使用率增加到约 10GB,但 RAM 使用率从未下降,交换使用率停止增加,然后 python 崩溃。