Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Programmation > Sorties de root > Libérer de la mémoire vive sous GNU/Linux

Libérer de la mémoire vive sous GNU/Linux

jeudi 14 mars 2013, par Julien H.

De plus en plus de nos robots utilisent des ordinateurs embarqués miniatures équipés d’un système d’exploitation GNU/Linux.

L’un des avantages est certes de bénéficier de centaines de programmes déjà fonctionnels pour gérer les entrées/sorties, la mémoire, les protocoles de communication, etc...

Mais comme ces programmes n’ont pas forcément été écrits pour un robot mobile - loin de là comme vous vous en doutez - il y a des petits inconvénients, notamment la consommation de ressources habituellement pléthoriques et qui sur nos cartes de capacités réduites viennent rapidement à manquer.

C’est le cas de la mémoire vive. Voici tout d’abord comment déterminer la mémoire consommée et disponible : "free -m" (le m signifie qu’on veut voir les nombres affichés en méga-octets).


robot # free -m
total used free shared buffers cached
Mem : 454 388 66 0 0 115
 /+ buffers/cache : 273 181
Swap : 0 0 0

On peut constater qu’il y a 454 Mo de mémoire vive sur cette carte, et qu’il n’en reste plus que 66 Mo de libres. En allant voir le bout de la ligne, on constate que 115 Mo sont "cachés" : cela signifie qu’une partie de la mémoire est utilisée pour des programmes qui ne tournent plus mais dont on pourrait avoir prochainement besoin dans le cas d’un usage normal ce qui signifie avec un humain qui ouvre des applications (mail, Internet, musique), les ferment, les ouvrent, et ainsi de suite.

Or dans la plupart du temps, les programmes que nous écrivont pour nos robots tournent en permanence et utilisent des mécanismes de synchronisation pour réagir rapidement aux événements. Pas besoin de laisser des anciens programmes se mettre en cache.

La solution consiste à changer le mode de gestion du cache. Plutôt que de lancer un programme, il faut aller écrire un certain chiffre dans un fichier de configuration des processus.

RTFM [1] : la lecture par "man proc" de la documentation est toujours instructive. Comme cela fait plusieurs centaines de pages, voici l’extrait qui nous intéresse :

/proc/sys/vm
This directory contains files for memory management tuning,
buffer and cache management.

/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches,
dentries and inodes from memory, causing that memory to become free.

To free pagecache, use echo 1 > /proc/sys/vm/drop_caches ; to
free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches ;
to free pagecache, dentries and inodes, use echo 3 >
/proc/sys/vm/drop_caches.

Because this is a non-destructive operation and dirty objects
are not freeable, the user should run sync(8) first.

Pour faire simple, on peut libérer la mémoire disponible (à condition que votre noyau Linux soit plus récent que le 2.6.16) en écrivant 3 dans drop_caches, ce qui se fait ainsi (avec la vérification juste après) :


robot # echo 3 > /proc/sys/vm/drop_caches
robot # free -m
total used free shared buffers cached
Mem : 454 294 160 0 0 28
 /+ buffers/cache : 266 188
Swap : 0 0 0

Ouii !! On est passé en une seconde de 66 Mo à 160 Mo de mémoire vive disponible.

Attention : sur certaines cartes comme la Raspberry Pi, le compte par défaut ne peut pas écrire dans drop_caches, même en sudo. Il faut donc se connecter en root (depuis votre terminal utilisateur, avec la commande "sudo su"). Mais le fonctionnement est le même eet on peut passer de 28 Mo libres à 66 Mo libres. Particulièrement utile quand on vient de se servir du navigateur Midori et qu’on veut récupérer de l’espace mémoire pour tester un programme.


[1Read The Famous Manual, interjection qu’on utilisait pour indiquer plus ou moins élégamment (F.... au lieu de Famous) d’aller lire la doc, mais c’était avant que Google n’existe

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.