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:
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
.
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):
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 :
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.
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.
- La commande
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 avecsudo
dans la pratique.
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
:
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:
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
:
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.