web-dev-qa-db-ja.com

システムをハングさせるためにメモリ不足を回避する方法

私はUbuntuでメモリ関連の質問をたくさん見てきましたが、正直なところ、このような問題にどのように取り組むことができるのか、本当に理解できません。

8GBのRAMがあります。スワップを使用して/使用せずに、大きな違いなしで実験しています。

問題は、ラップトップが完全にフリーズしているため(待機は役に立たない)頻繁に(1日に1回まで)ラップトップをハードリブートする必要があることです。これはおそらく、WebブラウザのRAM使用に関連しています。このことから、ラップトップ上で要求の厳しいプロセスは実行されていません。

実験/再現するには:

  • リストを埋める無限ループでPythonを使用してメモリを「埋めます」。
  • 1つ以上のタブで(Web)ブラウザー(Chrome/Firefoxのいずれか)を開きます。

私の観察は次のとおりです。

  • Pythonはメモリを無限に割り当てることはできません。最終的にMemoryErrorを発生させます。
  • 一方、ブラウザはそれについてf ***を表示せず、私の場合、システムをハングさせます。その後、ラップトップをハードリブートする必要があります。

わからない:

  • ブラウザがより多くのメモリを割り当てることができる理由(最後のビットまで)
  • プロセスを強制終了するのではなく、システムがハングするのはなぜですか。

スワップにはCPUが必要であるため、システムがしばらくハングすることがあります。だから私はそれを無効にしたので、カーネルはすぐにプロセスを強制終了することになると考えていました。

8GB RAMを使用する最近のOSでは、このような基本的な使用(ブラウザーを使用)がどのように問題になるかを理解できません。信頼できるシステムにするために、システムを調整する必要がありますか?

役立つアドバイス/説明/トリックをありがとう。

6
pltrdy

Memory/cpu watcherスクリプトを使用して同様の問題を解決し、x ramまたはyメモリーを超えるプロセスをt秒より長く強制終了させます。それはOS用の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
3
bubthegreat