Script bash qui libère de la RAM

Avez-vous déjà était à court de mémoire sur votre pc ? Plus possible de faire quoi que ce soit. C’est le freeze total qui glace votre machine. La seule solution est le hard reboot. Si cela n’a jamais été votre cas, je vous propose de lancer plusieurs instance d’eclipse, une machine virtuelle et plusieurs build maven. Il semblerait que dans mon cas, ce dernier refuse même de me rendre la mémoire qu’il mange.

Les systèmes d’exploitation sont censés gérer la mémoire vive correctement. Disons plutôt qu’une fois qu’un programme a libéré de la mémoire, le système se doit de la rendre disponible pour un autre.

En partant du principe que de la mémoire vive qui n’est pas utilisé est de la mémoire inutile, sur linux, le système alloue de la mémoire même s’il ne l’utilise pas. Il la place dans un cache, ce qui est censé faciliter sa réutilisation. Donc il est normal que même si vous ne demandez pas à votre machine de faire beaucoup d’opérations, la sortie de la commande free indique que presque toute votre RAM est utilisé.

$ free
             total       used       free     shared    buffers     cached
Mem:       8196504    6416800    1779704          0      31176    1395008
-/+ buffers/cache:    4990616    3205888
Swap:      1999864          0    1999864

Le chiffre le plus important est donc la mémoire libre dans le cache.

Il existe cependant une méthode pour agir sur ce cache. On peut demander au système de le nettoyer.

$ sudo echo 3 | tee /proc/sys/vm/drop_caches

Cette commande semblait résoudre mon problème mais comme j’aime les solutions de bourrins, je me suis dit qu’on pouvait scripter son appel. Je flush donc le cache dès que le niveau de la mémoire libre atteint un seuil critiquement bas.

#!/bin/sh
 
MINIMUM_MEM=131072
TIMER=5
 
while true; do
  clear
  a=0
  free | while read ramline; do
 
    if [ $a = 1 ] ; then
        SUBSTRING=`echo $ramline| cut -d' ' -f 4`
        echo "RAM free: $SUBSTRING"
        if [ $SUBSTRING -lt $MINIMUM_MEM ] ; then
            tmp=`echo 3 | tee /proc/sys/vm/drop_caches`
            echo "drop caches! ";
        fi
     fi
 
    a=`expr $a + 1`
  done
  sleep $TIMER
done

Il peut paraître bizarre d’outrepasser le système pour la gestion de son cache. Il devrait faire le travail mieux que nous. Dropper trop souvent le cache induit forcement une perte de performance, mais en tout cas mon problème de freeze semble bel et bien résolu.

Articles similaires :

Mots-clefs : , , ,

Laisser une réponse