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.
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.
1 votes
Au fait, nous avons un serveur sur VMware qui n'a pas beaucoup de mémoire et nous avons une tâche cron qui surveille sa mémoire vive avec
vmstat 2 3|tail -1|awk '{print $4}'
lorsque la valeur baisse de plus que certains montant, il libère des caches sinon le serveur va planter30 votes
@ivcode Ensuite, vous devriez trouver et corriger le problème avec ce serveur plutôt que d'essayer d'éviter les conditions qui le provoquent. Si ma voiture calait à chaque fois que je tournais brusquement à droite, éviter les virages brusques à droite est une solution médiocre.
0 votes
Merci beaucoup @David pour tes explications claires. Cela m'a incité à soumettre la question au développeur logiciel plutôt que de chercher des solutions temporaires.
0 votes
Je ne peux que supposer que peut-être c'était une mesure pour réduire les pertes de données, peut-être à cause de plantages/paniques/pertes de courant fréquents.
7 votes
Lié thedailywtf.com/Articles/Modern-Memory-Management.aspx Fortement affirmant que c'est une mauvaise idée.
2 votes
@EkriirkE pour réduire les pertes de données, seul
sync
serait suffisant, vider les caches n'apporterait rien dans ce but.7 votes
Connexe, et une description utile du "problème": linuxatemyram.com
4 votes
sudo killall -r .*
libère également beaucoup de mémoire0 votes
Peut-être que la personne qui a mis cela est Patrick R : serverfault.com/questions/105606/supprimer-linux-cached-ram
1 votes
@Max
sudo killall -s KILL -r .* `;)`
5 votes
Il s'agit probablement de "système de guano". La personne qui l'a mis là ne se souvient peut-être pas pourquoi il est là, ou si ça fonctionne, ou pourquoi ça fonctionne si ça fonctionne. Peut-être que personne ne sait pourquoi il est là. Il reste là parce que "si ça fonctionne, ne le casse pas". Dans les systèmes avec un contrôle de configuration médiocre, cette merde s'accumule. La réponse à long terme est d'améliorer la gestion de la configuration/changement/révision de vos systèmes. Un système de gestion de configuration comme CFEngine, Chef ou Puppet ne vous empêchera pas de faire des choses stupides, mais vous devrez être constamment stupide, ce qui (nous l'espérons) est plus susceptible d'être repéré et traité.