【问题标题】:Debug out-of-memory crash, when OOM Killer kills the process?当OOM Killer杀死进程时,调试内存不足崩溃?
【发布时间】:2022-07-06 04:03:02
【问题描述】:

在找到解决方案后发布为问答。

在 Linux 上处理模拟代码库,分配内存成功,但后来的进程被外部信号杀死。添加信号处理程序并不能阻止这种情况,因此它可能是SIGTERM。由于进程被终止,调试器无法提供回溯。

从迹象来看,以及之前的高内存使用,它可能与OOM杀手有关。使用

彻底禁用 OOM Killer
sudo sh -c "echo 2 > /proc/sys/vm/overcommit_memory"

导致许多程序崩溃。

可以做些什么来找到问题的根源,例如获得一个回溯,指出哪些地方正在使用过多的内存?

【问题讨论】:

    标签: linux out-of-memory


    【解决方案1】:

    我在 Open Suse 15.2 上调试 Fortran 程序崩溃时发现了这个问题。很明显,从测试人员的描述来看这是一个内存不足的问题,但在我的系统上我只会看到

    >>> ./run-simulation
    [1] Killed
    

    在终端上,不会发出回溯。

    在我的系统上,问题的根源原来是虚拟内存设置为“无限”,正如所见

    >>> ulimit -a
    

    设置虚拟内存的最大值,例如

    >>> ulimit -v 24''000''000  # in kB -> 24 GB on a 32 GB RAM system
    

    通过使模拟程序从 ALLOCATE 返回错误代码或因未处理的失败分配(例如来自表达式 cmplx(transpose(some_larger_than_expected_matrix)) 中的临时变量)而崩溃并返回跟踪*,从而解决了该问题。


    * 假设可执行文件在编译时支持回溯(依赖于编译器),通过调试器运行,...

    【讨论】:

      猜你喜欢
      • 2016-10-18
      • 2016-06-17
      • 2013-09-19
      • 2014-11-07
      • 2018-06-01
      • 2012-12-17
      • 2011-11-03
      • 2012-03-15
      • 2014-12-11
      相关资源
      最近更新 更多