Comment automatiser le vidage de cache sous Linux

Sous Linux, le cache mémoire n’est pas toujours vidé automatiquement, ce qui peut parfois surprendre quand on veut exécuter un processus gourmand en ressources qui refuse de se lancer alors qu’on a une large quantité de RAM. C’est ce qu’il m’est arrivé récemment sur Linux Mint en voulant lancer ollama qui demande 2.5Go de RAM, mon laptop principal en a 16 et je ne faisais rien de particulier à ce moment précis.

Vérifier l’état actuel du cache

En regardant le cache avec la commande top, on peut voir que le cache est parfois bien rempli comme ici avec un peu de 7Go:

Vérification de la mémoire cache utilisée avec la commande top

On peut le vider à la main à l’aide de quelques commandes mais nous allons voir ici comment l’automatiser pour qu’il s’exécute toutes les heures.

Création et explication du script

Tout d’abord, connectez vous en root avec sudo su et allez dans le dossier root avec cd /root.

Connection en root et accès au dossier /root

En cas de doute vous pouvez vérifier avec la commande pwd que vous êtes bien dans le bon dossier.

Première chose, nous allons créer le fichier qui nous permettra de vider automatiquement le cache et le tester manuellement. Si tout fonctionne, on automatisera. Vous pouvez taper vim freecache.sh (ou nano à la place de vim si vous préférez), ajouter le shebang en première ligne et entrer le code écrit en ligne 3 avant de sauvegarder avec :w (ou Ctrl+x si vous utilisez nano):

Création du script freecache.sh avec vim

Le code free && sync && echo 3 > /proc/sys/vm/drop_caches && free est une série de commandes généralement exécutées dans un shell Linux pour gérer l’utilisation de la mémoire, en particulier en ce qui concerne le cache. Voici une explication de chaque composant :

  1. free :
    • Cette commande affiche l’utilisation actuelle de la mémoire, y compris la mémoire totale, utilisée, libre, partagée, tampon et mise en cache.
    • Elle aide à comprendre combien de mémoire est utilisée avant d’apporter des modifications.
  2. sync :
    • La commande sync est utilisée pour vider les tampons du système de fichiers. Cela signifie qu’elle écrit toutes les données qui sont encore en mémoire (pages sales) sur le disque.
    • Cette étape garantit que toutes les modifications sont sauvegardées avant de vider les caches, évitant ainsi toute perte de données.
  3. echo 3 > /proc/sys/vm/drop_caches :
    • Cette commande indique au noyau Linux de supprimer divers caches de la mémoire.
    • La valeur 3 indique que le système doit vider :
      • Le cache des pages (fichiers mis en cache)
      • Les dentries (entrées de répertoire)
      • Les inodes (métadonnées sur les fichiers)
    • Écrire dans /proc/sys/vm/drop_caches nécessite des privilèges root ; il peut donc être nécessaire de le préfixer avec sudo dans la pratique.
  4. free (à nouveau) :
    • Enfin, cette commande est exécutée à nouveau pour afficher l’utilisation de la mémoire mise à jour après que les caches ont été vidés.
    • Cela permet aux utilisateurs de voir l’effet des commandes précédentes sur l’utilisation de la mémoire.

Premier test

Ensuite, nous pouvons exécuter ce fichier en tapant sh freecache.sh:

Test du script freecache.sh

Comme vu précédemment, la commande free est exécutée 2 fois: une fois avant vidage et une fois après. On voit que le nombre de donées en cache a nettement baissé, il est passé d’environ 7.5 Go à 1.2Go.

Maintenant il suffit d’automatiser l’exécution du script avec cron. Pour cela nous allons éditer le fichier crontab qui se trouve dans /etc en tapant vim /etc/crontab et en ajoutant la ligne suivante:

Ajout du script freecache.sh dans crontab

La ligne ajoutée indique que ce fichier s’exécutera à la 30e minute de chaque heure (À 0h30, 1h30, 2h30, etc…). Le 30 est pour les minutes et l´astérisque suivant correspond aux heures et indique donc qu’il s’exécutera à chaque heure. Si on voulait qu’il s’exécute uniquement à 12h30 par exemple on aurait commencé la ligne par « 30 12 ». Idem pour les astérisques des durées suivantes qui indiquent qu’ils seront exécutés à chaque fois (Chaque jour, chaque mois, etc…). Il ne reste plus qu’à redémarrer cron avec la commande systemctl restart cron et vérifier que tout s’est bien passé avec systemctl status cron:

Redémarrage du service cron

Tout est prêt

Maintenant que ce fichier est enregistré, le script créé videra le cache de votre machine toutes les heures. Cette page de la documentation FR d’Ubuntu vous donnera plus de détails si l’automatisation par cron vous intéresse.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Creative Commons License CC BY-SA 4.0