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.

95voto

David Schwartz Points 31009

Vous avez tout à fait raison. Ce n'est pas une bonne pratique de libérer de la RAM. Il s'agit probablement d'un exemple d'administration système de culte de la cargaison.

14 votes

+1 pour avoir mentionné l'Administration du Système Cargo Cult. Tout sysadmin qui ne connait pas ce terme et sa signification devrait être viré.

12 votes

@Tonny: Nous nous retrouverions sans département des sysadmin alors :(

0 votes

@PlasmaHH Malheureusement, c'est la situation dans laquelle la plupart d'entre nous se retrouvent... La seule chose pire qu'un sysadmin qui ne connaît pas CargoCult, c'est un responsable des TIC qui ne sait pas et qui dirige son département comme un CargoCult. J'ai travaillé pour un tel une fois. J'ai quitté cet endroit après 3 mois et j'ai juré de ne plus jamais refaire ça. (Ils ont fait faillite 7 mois plus tard... En partie à cause de la gestion des TIC qui a cassé leur système de vente de manière irréparable.)

64voto

ananthan Points 1470

Oui, vider le cache libérera de la RAM, mais cela oblige le noyau à rechercher 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 la RAM disponible est épuisée. Il écrit fréquemment le contenu sali sur le disque en utilisant pdflush.

22 votes

+1 pour expliquer pourquoi c'est une mauvaise idée.

0 votes

@ananthan - Un post sur rsync suggère de vider les caches - unix.stackexchange.com/a/510800

0 votes

@Motivé Et cela a du sens si vous ne faites pas entièrement confiance à votre mémoire (c'est-à-dire que la RAM non ecc pourrait avoir un bit inversé dans les segments de cache), mais pas pour accélérer les choses, mais pour minimiser le risque que les erreurs de mémoire modifient vos résultats de rsync. Sur un serveur avec de la mémoire ecc, les chances que cela se produise sont tellement faibles que vous ne devriez pas vous en soucier.

39voto

TMH Points 135

La raison de vider les caches de cette manière est de faire des tests de performances du disque, et c'est la seule raison pour laquelle cela existe.

Lors de l'exécution d'un test intensif d'E/S, vous voulez être sûr que les différents paramètres que vous essayez effectuent réellement des E/S sur le disque, c'est pourquoi Linux vous permet de vider les caches plutôt que de redémarrer complètement.

Pour citer la documentation :

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

L'utilisation de ce fichier peut causer des problèmes de performances. Puisqu'il supprime les objets mis en cache, cela peut coûter une quantité significative d'E/S et de CPU pour recréer les objets supprimés, surtout s'ils étaient fortement utilisés. Pour cette raison, son utilisation en dehors d'un environnement de test ou de débogage n'est pas recommandée.

0 votes

Bien sûr, en fonction de ce que vous essayez de faire, même un redémarrage complet pourrait ne pas suffisamment effacer le cache du disque.

1 votes

"ces objets sont automatiquement récupérés par le noyau lorsque la mémoire est nécessaire" est l'objectif de conception mais cela pourrait ne pas toujours être le comportement réel.

0 votes

@DanPritts Qu'est-ce qui vous fait précisément penser que ce n'est pas le cas?

30voto

Steinbitglis Points 1180

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 mis en cache, très peu susceptibles d'être consultés dans un avenir proche, par exemple des fichiers journaux. Ces fichiers "mangent" la mémoire vive, qui devra plus tard être libérée lorsque nécessaire par le système d'exploitation d'une manière ou d'une autre.

En fonction de vos paramètres de swappiness, de vos schémas d'accès aux fichiers, de vos schémas d'allocation mémoire et de nombreuses autres choses imprévisibles, il peut arriver que si vous ne libérez pas ces caches, ils devront plus tard être forcés d'être réutilisés, ce qui prend un peu plus de temps que d'allouer de la mémoire à partir du pool de mémoire inutilisée. Dans le pire des cas, les réglages de swappiness de Linux feront sortir de la mémoire du programme, car Linux pense que ces fichiers sont peut-être plus susceptibles d'être utilisés dans un futur proche que la mémoire du programme.

Dans mon environnement, Linux se trompe assez souvent, et au début de la plupart des bourses européennes (vers 9 heures locales) les serveurs commencent à faire des choses qu'ils ne font qu'une fois par jour, nécessitant d'inverser la mémoire qui avait été précédemment évincée car l'écriture de fichiers journaux, leur compression, leur copie, etc. remplissaient le cache au point où des choses devaient être évincées.

Mais est-ce que vider les caches est la solution à ce problème ? Certainement pas. La solution ici 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 en ligne de commande comme vmtouch (qui peut également être utilisé pour examiner les choses ainsi que les fichiers mis en cache).

De cette façon, vous pouvez supprimer les données qui ne sont plus nécessaires des caches, et conserver les données qui devraient être mises en cache, car lorsque vous videz tous les caches, beaucoup de choses doivent être relues depuis le disque. Et cela au pire moment possible : lorsque c'est nécessaire ; provoquant des retards dans votre application qui sont perceptibles et souvent inacceptables.

Vous devriez avoir en place un système qui surveille vos schémas d'utilisation de la mémoire (par exemple si quelque chose est évincé) et analyser en conséquence, et agir en conséquence. La solution pourrait être d'évincer certains gros fichiers à la fin de la journée en utilisant vtouch ; cela pourrait aussi être d'ajouter plus de mémoire vive car l'utilisation maximale quotidienne du serveur est juste cela.

0 votes

Toutes les applications sur mon serveur fonctionnent sur nohup. Peut-être que nohup.out est mis en cache et consomme de la mémoire?

0 votes

@ivcode: Cela pourrait être une raison, vérifiez la taille de nohup.out. Peut-être utiliser vmtouch pour déterminer combien de celui-ci est mis en cache.

0 votes

J'ai un cron job pour cat /dev/null > chemin/nohup.out toutes les 15 minutes car nohup.out augmente rapidement. Peut-être que Linux met en cache nohup.out même si je le nettoie

8voto

David Wilkins Points 193

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

Libérer des ressources

Le vidage des caches libérera essentiellement des ressources, mais cela a pour effet secondaire de forcer le système à travailler plus dur pour faire ce qu'il essaie de faire. Si le système effectue des échanges (tentative de lecture et écriture plus rapide d'une partition d'échange sur disque qu'il n'est réellement capable de le faire) alors vider les caches périodiquement peut soulager le symptôme, mais ne résout rien à la cause.

Qu'est-ce qui consomme la mémoire?

Vous devriez déterminer ce qui entraîne une forte consommation de mémoire qui rend le vidage des caches efficace. Cela peut être causé par un certain nombre de processus serveur mal configurés ou simplement mal utilisés. Par exemple, sur un serveur, j'ai observé une utilisation maximale de la mémoire lorsque un site Magento atteignait un certain nombre de visiteurs dans un intervalle de 15 minutes. Cela s'est avéré être dû à Apache configuré pour autoriser trop de processus à s'exécuter simultanément. Trop de processus, utilisant beaucoup de mémoire (Magento est parfois une bête) = échanges.

En conclusion

Ne supposez pas simplement que c'est quelque chose de nécessaire. Soyez proactif pour découvrir pourquoi c'est là, ayez le courage de le désactiver si d'autres suggèrent que c'est incorrect, et observez le système - apprenez quel est le vrai problème et corrigez-le.

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