如何避免内存不足导致系统挂起

如何避免内存不足导致系统挂起

我在 Ubuntu 上看到过很多与内存相关的问题,说实话我真的不明白为什么还会遇到这样的问题。

我有 8GB RAM。我尝试过有/无交换,没有太大区别。

问题是我经常(每天最多一次)必须硬重启我的笔记本电脑,因为它完全冻结了(等待没有帮助)。这很可能与我的网络浏览器的 RAM 使用情况有关。除此之外,笔记本电脑上没有运行任何高要求的进程。

为了实验/复制:

  • 我使用 Python 的无限循环来填充列表,从而“填充”我的内存。
  • 我打开我的(网络)浏览器(Chrome/Firefox),其中有一个或多个选项卡。

我的观察是:

  • Python 无法无限分配内存:它最终会引发MemoryError
  • 另一方面,浏览器对此毫不在意,在我的例子中,它会导致系统挂起。然后我不得不硬重启笔记本电脑。

我不明白:

  • 为什么允许浏览器分配越来越多的内存(似乎到最后一点)
  • 为什么系统会挂起而不是“仅仅”终止一个进程。

我知道交换需要 CPU,因此它可能会使系统挂起一段时间。这就是我禁用它的原因,因为我认为内核会迅速决定终止进程。

我不明白为什么这种基本用法(使用浏览器)在使用 8GB RAM 的最新操作系统上会出现问题。我需要调整我的系统才能拥有一个可靠的系统吗?

感谢任何有帮助的建议/解释/技巧。

答案1

我已经用内存/CPU 监控脚本解决了类似的问题,只需让它终止它发现的拥有超过 x 个 RAM 或 y 个内存超过 t 秒的任何进程即可。这并不能解决为操作系统保留 CPU/Mem 的问题,但它是一种解决方法,直到你找到更好的答案(当你找到更好的答案时,请与我分享,因为我来这里寻找同样的东西)

#!/bin/bash

# Kill POS if we're doing stupid shit.
HOG_COUNTER=0
while true; do
    # This is pulling CPU, change the awk column from 9 to something
    # that you want to check against.
    HOG=$(top -b -n 1 | grep pos2 | awk '$9 > 90 {print $1}')
    # If the hog variable is not empty, add some counter info - we don't
    # want to catch periodic spikes, we want to catch consistent offenders.
    if [ ! -z "$HOG" ]; then
        counter_time=$(date)
        HOG_COUNTER=$(expr ${HOG_COUNTER} + 1)
        echo "$counter_time - Found a hog: $HOG - ${HOG_COUNTER} counters." >> high_mem_kill_log
    else
        HOG_COUNTER=0
    fi
    # If we have more than 2 counters (3 or more) then we kill the process
    # that's doing it.
    if [ $HOG_COUNTER -gt 2 ]; then
        kill_time=$(date)
        echo "$kill_time - Found a hog: $HOG.  $HOG_COUNTER counters.  Killing $HOG." >> high_mem_kill_log
        kill $HOG
    fi
    sleep 30s
done

相关内容