93 votes

Pourquoi vider les caches dans Linux?

Dans nos serveurs, nous avons l'habitude de vider les caches à minuit.

sync; echo 3 > /proc/sys/vm/drop_caches

Lorsque j'exécute le code, il semble libérer beaucoup de RAM, mais est-ce vraiment nécessaire? N'est-ce pas du gaspillage d'avoir de la RAM libre?

65 votes

Trouvez la personne qui a mis cela et demandez-lui pourquoi elle l'a fait. Comme vous l'avez deviné correctement, il n'y a pas de raison évidente pour cela.

2 votes

Cette personne n'est plus employée. Je ne peux donc pas lui demander. Lorsque je demande à d'autres personnes, elles disent que c'est une bonne pratique de libérer de la mémoire vive mais je ne vois pas l'intérêt. Dans quels cas devrais-je utiliser le code ci-dessus de toute façon ?

13 votes

Débogage du noyau. C'est tout. Cela ne libère pas réellement de la RAM ; il supprime des caches, comme son nom l'indique, et réduit donc les performances.

4voto

mirabilos Points 659

Linux/m68k a en fait un bug de kernel qui fait que kswapd devient fou et utilise 100% du CPU (50% s'il y a une autre tâche gourmande en CPU, comme un autobuilder de paquets binaires Debian - vulgo buildd - déjà en cours), ce qui peut (la plupart du temps; pas toujours) être atténué en exécutant cette commande particulière toutes les quelques heures.

Cela étant dit... votre serveur n'est probablement pas un système m68k (Atari, Amiga, Macintosh classique, VME, Q40/Q60, Sun3) ;-)

Dans ce cas, la personne qui a inséré ces lignes a suivi des conseils douteux ou, au mieux, obsolètes, ou a mal compris comment la RAM devrait être utilisée (aujourd'hui, on dit en effet que "la RAM libre est une RAM gaspillée" et suggère la mise en cache), ou a "découvert" que cela "corrige" [sic!] un autre problème ailleurs (et a été trop paresseuse pour chercher une solution appropriée).

0 votes

"un bug du noyau qui provoque un comportement incontrôlable de kswapd" - Quel bug est-ce ?

0 votes

@Ben voir ce fil de discussion (ce message et quelques réponses, l'une d'entre elles incluant une supposition sur l'origine du problème)

1 votes

Je rencontre un problème similaire (bien que ce soit x86_64) et la seule solution pour le moment est de vider le cache serverfault.com/questions/740790/…

4voto

Dan Pritts Points 3091

Je peux penser à une raison plausible de faire cela dans une tâche cron nocturne.

Sur un grand système, il peut être utile de vider périodiquement les caches afin de supprimer la fragmentation de la mémoire.

Le support transparent des énormes pages du noyau effectue un balayage périodique de la mémoire pour regrouper de petites pages en énormes pages. Dans des conditions dégénérées, cela peut entraîner des pauses du système d'une minute ou deux (j'ai vécu cela sous RHEL6 ; espérons que cela s'est amélioré). Vider les caches peut permettre au balayeur d'énormes pages d'avoir de la place pour travailler.

Vous pourriez faire valoir que c'est une bonne raison de désactiver les énormes pages transparentes ; d'un autre côté, vous pouvez estimer que l'amélioration globale des performances des énormes pages transparentes vaut la peine d'accepter de perdre vos caches une fois par jour.


J'ai pensé à une autre raison pour laquelle vous voudriez le faire, bien que pas dans une tâche cron. Juste avant qu'un système de virtualisation ne migre une machine virtuelle vers un nouveau hardware serait un très bon moment pour le faire. Moins de contenu de mémoire à copier vers le nouvel hôte. Vous devrez éventuellement lire à partir du stockage, bien sûr, mais je prendrais probablement ce compromis.

Je ne sais pas si l'un des logiciels de virtualisation le fait réellement.

1 votes

Avez-vous une source pour cela? Cela semble être quelque chose qui devrait être corrigé dans le noyau s'il s'agit d'un tel problème.

3 votes

J'ai une expérience personnelle avec les pauses liées aux transparent hugepages. RHEL6, Dell R810, 4CPU, 64 Go de RAM. Désactiver les transparent hugepages (il y a un fichier /proc pour le faire) a immédiatement résolu les pauses. Je n'ai pas essayé la technique de suppression de cache à l'époque ; au lieu de cela, j'ai reconfiguré nos applications Java pour utiliser des hugepages non transparentes et j'ai laissé les transparent hugepages désactivées. De mémoire, nous avons assez étudié la situation pour réaliser que nous n'étions pas les seuls touchés et que Red Hat connaissait le problème.

0 votes

Bonjour Dan, je constate le même comportement sur mon serveur. Je travaille avec une énorme quantité de données et il y a une chute drastique des performances après 10+ calculs du même programme Python (x2-3 du temps de la première computation). Si je regarde, la taille du cache mémoire est énorme, 100+ Go. Et si je vide ce cache mémoire et que je relance mon programme, je retrouve mon temps initial de calcul. Aurais-tu des documents ou des informations à partager sur ce phénomène? Merci.

3voto

Guntram Blohm Points 469

Une raison pourrait être que le site exécute une sorte de surveillance, qui vérifie la quantité de RAM libre et envoie un avertissement aux administrateurs lorsque la RAM libre tombe en dessous d'un certain pourcentage. Si cet outil de surveillance est assez stupide pour ne pas inclure le cache dans le calcul de la RAM libre, il pourrait envoyer de faux avertissements ; vider régulièrement le cache pourrait supprimer ces avertissements tout en permettant à l'outil de remarquer quand la RAM "réelle" devient faible.

Bien sûr, dans ce genre de situation, la vraie solution est de modifier l'outil de surveillance pour inclure le cache dans le calcul de la RAM libre ; nettoyer le cache n'est qu'une solution temporaire, et une mauvaise en plus, car le cache se remplira rapidement lorsque les processus accèdent au disque.

Donc même si mon hypothèse est correcte, le nettoyage du cache n'a pas de sens, c'est plutôt une solution temporaire par quelqu'un qui n'est pas assez compétent pour résoudre le problème principal.

2voto

aularon Points 156

Juste pour ajouter mon grain de sel : Le système sait très bien que ces pages mémoire sont des caches, et supprimera autant que nécessaire lorsque une application demande de la mémoire.

Un paramètre pertinent est /proc/sys/vm/swappiness, qui indique au noyau lors des nouvelles allocations de mémoire de préférer supprimer les caches mémoire ou d'échanger les pages de mémoire allouées "inactives".

2voto

Iridos Points 21

La question date de 2014, mais comme le problème persiste à ce jour sur certains backends centos 6.8 cachés, il peut toujours être utile pour quelqu'un.

https://github.com/zfsonlinux/zfs/issues/1548 décrit un problème avec zfs. Là, l'espace disque n'est pas libéré pour les fichiers supprimés car si nfs est utilisé par-dessus zfs, les inodes des fichiers ne sont pas supprimés du cache d'inodes du noyau.

Pour citer du fil de discussion sur le bug, behlendorf, le 6 janvier 2015, a écrit :

La spéculation actuelle est que, pour une raison quelconque, le serveur NFS garde une version mise en cache du handle du fichier. Jusqu'à ce que le serveur NFS supprime ce handle de fichier, ZFS ne peut pas supprimer ce fichier. Des tests légers ont montré que le fait de vider les caches sur le serveur entraînera la suppression de cette référence (comme le handle de fichier NFS), à quel moment l'espace est correctement libéré. La pression mémoire peut également entraîner sa suppression.

c'est-à-dire qu'un echo 3 > /proc/sys/vm/drop_caches nocturne est le correctif le plus simple pour ce bug si vous ne souhaitez pas avoir d'arrêt pour restructurer votre zfs.

Donc peut-être pas de gestion administrateur aveugle, mais un assez bon débogage était la raison.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X