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

plt*_*rdy 7 memory-usage ram 16.04

我在 Ubuntu 上看到了很多与内存相关的问题,老实说,我真的无法理解如何仍然可以解决这些问题。

我有 8GB 内存。我已经尝试使用/不使用交换而没有太大区别。

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

为了实验/复制:

  • 我用 Python 用一个无限循环填充列表来“填充”我的记忆。
  • 我打开我的(网络)浏览器(Chrome / Firefox),带有一个或多个标签。

我的观察是:

  • Python 不能无限分配内存:它最终会引发一个MemoryError.
  • 另一方面,浏览器不会对此表示担忧,并且在我的情况下会挂起系统。然后我必须硬重启笔记本电脑。

我不明白:

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

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

我无法理解最近使用 8GB RAM 的操作系统如何使用这种基本用法(使用浏览器)。我是否需要调整我的系统以获得可靠的系统?

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

小智 5

我已经使用内存/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
Run Code Online (Sandbox Code Playgroud)