web-dev-qa-db-fra.com

Pourquoi supprimer des caches sous Linux?

Dans nos serveurs, nous avons l'habitude de supprimer 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 ai-je vraiment besoin de le faire. N'est-ce pas gratuit RAM un déchet?

84
ivcode

Vous avez 100% raison. C'est pas une bonne pratique pour libérer de la RAM. Il s'agit probablement d'un exemple d'administration du système culte des cargaisons.

90
David Schwartz

Oui, l'effacement du cache libérera de la RAM, mais le noyau recherchera des fichiers sur le disque plutôt que dans le cache, ce qui peut entraîner des problèmes de performances.

Normalement, le noyau vide le cache lorsque le RAM disponible est épuisé. Il écrit fréquemment du contenu sale sur le disque à l'aide de pdflush.

63
ananthan

La raison de supprimer des caches comme celui-ci est pour l'analyse comparative des performances du disque, et c'est la seule raison pour laquelle il existe.

Lorsque vous exécutez un benchmark intensif en E/S, vous voulez être sûr que les différents paramètres que vous essayez font tous des E/S sur disque, donc Linux vous permet de supprimer les caches plutôt que de redémarrer complètement.

Pour citer le documentation :

Ce fichier n'est pas un moyen de contrôler la croissance des différents caches du noyau (inodes, denteries, pagecache, etc ...) Ces objets sont automatiquement récupérés par le noyau lorsque de la mémoire est nécessaire ailleurs sur le système.

L'utilisation de ce fichier peut entraîner des problèmes de performances. Puisqu'il supprime les objets mis en cache, il peut coûter une quantité importante d'E/S et de CPU pour recréer les objets abandonnés, surtout s'ils étaient sous utilisation intensive. Pour cette raison, une utilisation en dehors d'un environnement de test ou de débogage n'est pas recommandée.

35
Joe

L'idée de base ici n'est probablement pas si mauvaise (juste très naïve et trompeuse): il peut y avoir des fichiers en cache, qui sont très peu accessibles dans un avenir proche, par exemple les fichiers journaux. Ces béliers "dévorés", qui devront par la suite être libérés au besoin par l'OS d'une manière ou d'une autre.

En fonction de vos paramètres de permutation, du modèle d'accès aux fichiers, du modèle d'allocation de mémoire et de bien d'autres choses imprévisibles, il peut arriver que lorsque vous ne libérez pas ces caches, ils seront plus tard forcés à être réutilisés, ce qui prend un peu plus de temps que allouer de la mémoire à partir du pool de mémoire inutilisée. Dans le pire des cas, les paramètres de permutation de linux entraîneront la permutation de la mémoire programme, car linux pense que ces fichiers sont plus susceptibles d'être utilisés dans un avenir proche que la mémoire programme.

Dans mon environnement, linux devine assez souvent mal, et au début de la plupart des bourses européennes (vers 0900 heure locale), les serveurs commenceront à faire des choses qu’ils ne font qu’une fois par jour, ayant besoin d’échanger de la mémoire qui a été échangée auparavant parce que l’écriture les fichiers journaux, les compresser, les copier, etc. remplissaient le cache au point où les choses devaient être échangées.

Mais la suppression des caches est-elle la solution à ce problème? certainement pas. La solution serait de dire à linux ce qu'il ne sait pas: que ces fichiers ne seront probablement plus utilisés. Cela peut être fait par l'application d'écriture en utilisant des choses comme posix_fadvise() ou en utilisant un outil de ligne cmd comme vmtouch (qui peut également être utilisé pour examiner des choses ainsi que des fichiers de cache).

De cette façon, vous pouvez supprimer les données qui ne sont plus nécessaires des caches et conserver les éléments qui doivent être mis en cache, car lorsque vous supprimez tous les caches, beaucoup de choses doivent être relues à partir du disque. Et cela au pire moment possible: quand c'est nécessaire; entraînant des retards dans votre demande qui sont visibles et souvent inacceptables.

Ce que vous devriez avoir en place, c'est un système qui surveille vos modèles d'utilisation de la mémoire (par exemple, si quelque chose est en train de s'échanger), puis analyse en conséquence et agit en conséquence. La solution pourrait être d'expulser certains gros fichiers à la fin de la journée en utilisant vtouch; il peut également être nécessaire d'ajouter plus de RAM, car l'utilisation maximale quotidienne du serveur est exactement cela.

26
PlasmaHH

J'ai vu des caches de dépôt utiles lors du démarrage d'un tas de machines virtuelles. Ou toute autre chose qui utilise de grandes pages telles que certains serveurs de base de données.

Les grandes pages sous Linux doivent souvent défragmenter RAM afin de trouver 2 Mo de physique contigu RAM à mettre dans une page. Libérer tout le cache de fichiers rend cela processus très facile.

Mais je suis d'accord avec la plupart des autres réponses, car il n'y a généralement pas de bonne raison de supprimer le cache de fichiers tous les soirs.

16
Zan Lynx

Il est possible que cela ait été institué comme un moyen de stabiliser le système alors qu'il n'y avait personne ayant les compétences ou l'expérience pour réellement trouver le problème.

Libérer des ressources

La suppression des caches libérera essentiellement certaines ressources, mais cela a pour effet secondaire de rendre le système plus difficile à faire pour faire ce qu'il essaie de faire. Si le système est en train de permuter (en essayant de lire et d'écrire à partir d'une partition de permutation de disque plus rapidement qu'il ne l'est réellement), la suppression périodique des caches peut atténuer le symptôme, mais ne fait rien pour remédier au cause.

Qu'est-ce qui mange de la mémoire?

Vous devez déterminer ce qui cause une grande consommation de mémoire qui fait que la suppression des caches semble fonctionner. Cela peut être dû à un nombre illimité de processus serveur mal configurés ou simplement mal utilisés. Par exemple, sur un serveur, j'ai été témoin d'une utilisation maximale de la mémoire lorsqu'un site Web Magento a atteint un certain nombre de visiteurs dans un intervalle de 15 minutes. Cela a fini par être causé par la configuration d'Apache pour permettre à trop de processus de s'exécuter simultanément. Trop de processus, utilisant beaucoup de mémoire (Magento est parfois une bête) = échange.

Bottom Line

Ne vous contentez pas de supposer que c'est quelque chose qui est nécessaire. Soyez proactif pour découvrir pourquoi il existe, ayez le courage de le désactiver si d'autres suggèrent qu'il est incorrect et observez le système - apprenez quel est le vrai problème et corrigez-le.

8
David Wilkins

Linux/m68k a en fait un bogue de noyau qui fait que kswapd devient fou et consomme 100% de CPU (50% s'il y a une autre tâche liée au CPU, comme un constructeur automatique de paquets binaires Debian - vulgo buildd - en cours d'exécution déjà), 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, Classic Macintosh, VME, Q40/Q60, Sun3) ;-)

Dans ce cas, la personne qui a mis les lignes a suivi des conseils douteux ou, au mieux, obsolètes, ou a eu une idée de la façon dont RAM devrait être mal utilisé (la pensée moderne dit en effet "gratuit RAM est RAM gaspillé "et suggère la mise en cache), ou" a découvert "que cela" corrige "[sic!] Un autre problème ailleurs (et était trop paresseux pour rechercher une solution appropriée).

4
mirabilos

Je peux penser à une raison plausible de le faire dans un travail cron nocturne.

Sur un grand système, il peut être utile de supprimer régulièrement les caches afin de pouvoir supprimer la fragmentation de la mémoire.

La prise en charge des pages géantes transparentes du noyau effectue un balayage périodique de la mémoire pour fusionner les petites pages en pages géantes. Dans des conditions dégénérées, cela peut entraîner des pauses système d'une minute ou deux (mon expérience avec cela était dans RHEL6; j'espère que c'est amélioré). La suppression des caches peut laisser à la balayeuse d'énormes pages un espace de travail.

Vous pourriez faire valoir que c'est une bonne raison de désactiver les pages géantes transparentes; OTOH vous pensez peut-être que l'amélioration des performances globales des pages géantes transparentes vaut la peine, et vaut la peine de payer le prix de la perte de vos caches une fois par jour.


J'ai pensé à une autre raison pour laquelle vous voudriez le faire, mais pas dans un travail cron. Juste avant la migration d'un système de virtualisation, un VM vers un nouveau matériel serait un très bon moment pour cela. Moins de contenu mémoire à copier vers le nouvel hôte. Vous devrez éventuellement lire à partir du stockage, au lieu de cela, bien sûr, mais je prendrais probablement ce compromis.

Je ne sais pas si l'un des logiciels virt fait cela.

3
Dan Pritts

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

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 du ram libre; le nettoyage du cache n'est qu'une solution de contournement, et une mauvaise également, car le cache se remplit rapidement lorsque les processus accèdent au disque.

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

Juste pour ajouter mes deux cents: Le système sait très bien que ces pages mémoire sont des caches, et chuteront autant que nécessaire quand une application demandera de la mémoire.

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

2
aularon

La question date de 2014, mais comme le problème existe à ce jour sur certains backends centos 6.8 cachés, il peut encore ê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é au-dessus de zfs, les inodes du fichier ne sont pas supprimés du cache d'inodes du noyau.

Pour citer le fil de bogue, behlendorf, 6 janvier 2015 a écrit:

La spéculation actuelle est que, pour une raison quelconque, le serveur NFS conserve une version mise en cache du descripteur de fichier. Jusqu'à ce que le serveur NFS supprime ce descripteur de fichier, ZFS ne peut pas dissocier ce fichier. Certains tests légers ont montré que la suppression de caches sur le serveur entraînerait la suppression de cette référence (comme le descripteur de fichier NFS), moment auquel l'espace est correctement libéré. La pression de la mémoire peut également entraîner sa chute.

c'est-à-dire qu'un écho nocturne 3>/proc/sys/vm/drop_caches est le correctif le plus simple pour ce bogue si vous ne voulez pas avoir de temps d'arrêt pour restructurer votre zfs.

Donc peut-être pas l'administration du cargo cargo, mais un assez bon débogage en était la raison.

1
Iridos

Lorsque votre cache de pages est assez volumineux (beaucoup plus grand que votre utilisation actuelle de swap), et que le swap in et swap out se produit à tour de rôle, c'est à ce moment que vous devez supprimer les caches. J'ai vu des cas où l'utilisation de la mémoire augmente dans l'un de mes serveurs de base de données MariaDB exécutant Ubuntu 16.04LTS, et Linux a simplement choisi d'augmenter l'utilisation de l'échange au lieu de supprimer les caches de page inutilisés. D'énormes pages transparentes déjà désactivées dans mon système car TokuDB exigeait qu'il soit désactivé. Quoi qu'il en soit, ce n'est peut-être pas un bug, mais Linux continue de faire ce comportement est assez déroutant pour moi. Diverses sources ont déclaré que Linux supprimerait le cache de pages lorsque l'application le demanderait:

Mais la réalité n'est pas si simple. La solution de contournement est soit:

  1. Exécuter périodiquement le cache de dépôt
  2. Exécuter le cache de suppression lorsque cela est nécessaire (surveiller à l'aide de vmstat 1 pour permuter les activités)
  3. Conseillez à Linux de supprimer certains fichiers du cache (comme les fichiers journaux Apache) à l'aide d'un utilitaire tel que dd ou python-fadvise. Voir https://unix.stackexchange.com/questions/36907/drop-a-specific-file-from-the-linux-filesystem-cache

Exemple dd run:

dd if=/var/log/Apache2/access_log.1 iflag=nocache count=0

Exemple python-fadvise:

pyadvise -d /var/log/Apache2/access_log.1

0
YudhiWidyatama

Cela peut avoir un sens sur les systèmes NUMA (accès à la mémoire non uniforme), où, en général, chaque CPU (socket) peut accéder à toute la mémoire de manière transparente mais sa propre mémoire est accessible plus rapidement que la mémoire des autres socket, en association avec des applications HPC parallèles.

De nombreuses applications parallèles simples ont tendance à effectuer des E/S de fichiers à partir d'un seul processus, laissant ainsi à la sortie une grande fraction de mémoire sur un seul nœud NUMA alloué au cache disque, tandis que sur l'autre nœud NUMA, la mémoire peut être principalement libre. Dans ces situations, étant donné que le processus de récupération de cache dans le noyau Linux, à ma connaissance, n'est toujours pas compatible avec NUMA, les processus en cours d'exécution sur le nœud NUMA qui a de la mémoire allouée au cache sont obligés d'allouer de la mémoire sur l'autre nœud NUMA, tant qu'il y a libre RAM sur l'autre nœud, tuant ainsi les performances.

Cependant, dans un système HPC, il serait plus judicieux de nettoyer le cache avant de démarrer un nouveau travail utilisateur, pas à un moment précis avec cron.

Pour les applications non parallèles, il est peu probable que ce problème se pose.

0
Davide