我在 Python 中运行了一系列snakemake -j 1
占用大量内存的操作:将两个最大 15 GB 的数组相减,然后计算差值的标准差。令人惊讶的是,我的系统开始出现问题:
- Thunderbird 崩溃,
- 我的图形环境(带有 lightdm 的 XFCE)崩溃了(实际上在浴缸正在运行时终止了我的屏幕会话),
- 在图形环境重生后,它交换了我的显示器(双关语),并且不允许我使用显示设置重新交换它们 - 这
service lightdm restart
是必要的, - 我的 snakemake 管道(bash + Python + numpy + pandas)在处理最大的数组时容易因分段错误而失败,
- 昨天我发现 Firefox 丢失了音频,
- 最近,在管道和图形会话崩溃后,其中一个
bash
进程变得疯狂(CPU 使用率为 100%)。
我有足够的 (932 GB) 可用交换空间,因此我的系统不会突然用完内存。RAM 芯片似乎也能正常工作(Memtest86+ 的 17 次测试未发现任何错误)。
我询问崩溃/不当行为背后的原因其他程序(Thunderbird、屏幕会话、图形环境)。即使我的程序写得不好,我也希望它们的影响仅限于广泛的交换。XFCE 会话完全重启是绝对不应该发生的事情。我说的重启是指重启,而不是由于交换而导致的冻结或减速。
答案1
积极的内存页面不可交换...它们必须处于非活动状态,即当前未被任何进程主动使用/需要,才可以成为移动至交换的候选。
因此,交换不一定会用于所有内存页面,并且可用交换空间的可用性并不意味着系统的物理内存不会被填满。
“分段错误“很可能是由于可用内存不足导致应用程序无法分配内存地址。
底线是,交换仅由内核管理,而不是由用户空间应用程序管理,并且内核仅交换不活动的内存页面...当一个应用程序同时主动使用大量内存时,内核不会有选择地交换任何内存...因此,修复应用程序的内存使用情况是解决此问题的方法。
也许现在是时候停止考虑修复 Ubuntu 以使用您的应用程序并开始考虑修复您自己的应用程序的内存使用情况了,并且使用内存分析器进行深入查看是一个很好的起点......例如参见: