web-dev-qa-db-fra.com

Comment éviter d'avoir trop de mémoire pour accrocher le système

J'ai vu beaucoup de questions liées à la mémoire sur Ubuntu et, pour être honnête, je ne comprends vraiment pas comment il est encore possible de lutter contre de tels problèmes.

J'ai 8 Go de RAM. J'ai expérimenté avec/sans échange sans trop de différences.

Le problème est que je dois fréquemment (jusqu’à une fois par jour) redémarrer mon ordinateur portable car il est entièrement gelé (l’attente n’aide pas). Cela est probablement lié à RAM utilisation de mes navigateurs Web. En dehors de cela, aucun processus très exigeant ne s'exécute sur l'ordinateur portable.

Pour expérimenter/reproduire:

  • Je "remplis" ma mémoire avec Python avec une boucle infinie qui remplit une liste.
  • J'ouvre mon navigateur (Web) (soit Chrome/Firefox), avec un ou plusieurs onglets.

Mes observations sont:

  • Python ne peut pas allouer de la mémoire à l'infini: il déclenchera éventuellement un MemoryErrorname__.
  • le navigateur dans l’autre main ne donne pas de f *** et va, dans mon cas, bloquer le système. Je dois alors redémarrer l'ordinateur portable.

Je ne comprends pas:

  • pourquoi le navigateur est autorisé à allouer de plus en plus de mémoire (jusqu'au dernier bit, semble-t-il)
  • pourquoi le système se bloque au lieu de "simplement" tuer un processus.

Je suis conscient que la permutation nécessite du processeur, elle risque donc de bloquer le système pendant un certain temps. C'est pourquoi je l'ai désactivé, donc je pensais que le noyau déciderait rapidement de tuer un processus.

Je ne comprends pas comment une utilisation aussi élémentaire (utilisation de navigateurs) pourrait poser problème avec un système d'exploitation récent utilisant 8 Go de RAM. Dois-je modifier mon système pour en avoir un fiable?

Merci pour tout conseil/explication/astuce qui pourrait aider.

6
pltrdy

J'ai résolu un problème similaire avec un script mémoire/observateur cpu et je lui ai juste demandé de tuer tous les processus qu'il voit qui ont plus de x RAM ou y de mémoire pendant plus de t secondes. Cela ne résout pas le problème de la réservation CPU/Mem pour le système d'exploitation, mais c'est une solution de contournement jusqu'à ce que vous trouviez une meilleure réponse (et partagez-la avec moi car je suis ici à la recherche de la même chose).

#!/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