Définition de / proc / sys / vm / drop_caches pour vider le cache

80

Dans le cadre de certaines synchronisations du cache froid, j'essaie de libérer le cache du système d'exploitation. La documentation du noyau (récupérée en janvier 2019) indique:

drop_caches

Writing to this will cause the kernel to drop clean caches, as well as
reclaimable slab objects like dentries and inodes.  Once dropped, their
memory becomes free.

To free pagecache:
    echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
    echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
    echo 3 > /proc/sys/vm/drop_caches

This is a non-destructive operation and will not free any dirty objects.
To increase the number of objects freed by this operation, the user may run
`sync' prior to writing to /proc/sys/vm/drop_caches.  This will minimize the
number of dirty objects on the system and create more candidates to be
dropped.

This file is not a means to control the growth of the various kernel caches
(inodes, dentries, pagecache, etc...)  These objects are automatically
reclaimed by the kernel when memory is needed elsewhere on the system.

Use of this file can cause performance problems.  Since it discards cached
objects, it may cost a significant amount of I/O and CPU to recreate the
dropped objects, especially if they were under heavy use.  Because of this,
use outside of a testing or debugging environment is not recommended.

You may see informational messages in your kernel log when this file is
used:

    cat (1234): drop_caches: 3

These are informational only.  They do not mean that anything is wrong
with your system.  To disable them, echo 4 (bit 3) into drop_caches.

Je suis un peu louche sur les détails. Fonctionnement

echo 3 > /proc/sys/vm/drop_caches

libère pagecache, dentries et inodes. D'accord.

Donc, si je veux que le système recommence à mettre en cache normalement, dois-je d'abord le réinitialiser à 0? Mon système a actuellement la valeur 0, ce qui, je suppose, est la valeur par défaut. Ou va-t-il se réinitialiser tout seul? Je vois au moins deux possibilités ici, et je ne suis pas sûr de savoir laquelle est vraie:

  1. echo 3 > /proc/sys/vm/drop_cacheslibère pagecache, dentries et inodes. Le système commence alors immédiatement à nouveau à mettre en cache. Je ne suis pas sûr de ce à quoi je m'attendrais, /proc/sys/vm/drop_cachessi tel est le cas. Retourner à 0 presque immédiatement?

  2. Si /proc/sys/vm/drop_cachesest défini sur 3, le système ne met pas en cache la mémoire tant qu'il n'a pas été réinitialisé à 0.

Quelle affaire est vraie?

Faheem Mitha
la source
22
Pour l'utiliser avec sudo:echo 3 | sudo tee /proc/sys/vm/drop_caches
Volker Siegel
Vache sacrée! @VolkerSiegel Je frotte les Interwebs depuis des heures et trouve votre commentaire au hasard. J'ai essayé et cela a fonctionné parfaitement! Merci d'avoir ajouté ce petit truc. Je ne veux pas détourner cette question, mais si ce n'est pas inapproprié, j'aimerais demander une explication. Quand je l' utilise avec sshpass sudo -i && echo 3 > /proc/sys/vm/drop_caches, je reçois une erreur: stdin: is not a tty. Utiliser votre méthode "sudo" fonctionne. Pourquoi?
harperville
2
@harperville Posez une question. c'est presque certainement un problème sans rapport.
Faheem Mitha
1
@harperville Oui - c'est une très bonne question - avec une réponse intéressante, posez-la séparément! Alors laissez-moi savoir ici. Ou vous voulez que je pose la question moi-même et que j'y réponde?
Volker Siegel

Réponses:

108

Ce n'est pas collant - vous écrivez simplement dans le fichier pour le faire supprimer les caches, puis il recommence immédiatement à mettre en cache.

Fondamentalement, lorsque vous écrivez dans ce fichier, vous ne modifiez pas vraiment un paramètre, vous émettez une commande au noyau. Le noyau agit sur cette commande (en supprimant les caches) puis continue comme avant.

TomH
la source
2
OK merci. La valeur revient-elle immédiatement à 0?
Faheem Mitha
33
@FaheemMitha Non, la valeur que vous pouvez lire est ce que vous mettez en dernier, mais elle n'est utilisée nulle part, seule l'action d'écrire est importante. Le code source est dans fs/drop_caches.c.
Gilles 'SO- arrête d'être méchant'
Y a-t-il un avantage spécifique pour la machine virtuelle Java?
JE Carter II
3
Il n'y a aucun avantage pour les applications, au contraire: les fichiers se chargeront plus lentement car aucun inodes en cache. En outre, vous n'êtes pas à court de mémoire: si une application a besoin de mémoire, elle l'utilisera du cache du système d'exploitation. Voir linuxatemyram.com .
dr0i
@TomH, sur "seule l'action d'écrire compte" est-ce la synccommande?
KaizenCoder