web-dev-qa-db-fra.com

que sont la pagecache, les denteries, les inodes?

Je viens d'apprendre ces 3 nouvelles techniques de https://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system =:


Pour libérer la pagecache:

# echo 1 > /proc/sys/vm/drop_caches

Pour libérer des dentiers et des inodes:

# echo 2 > /proc/sys/vm/drop_caches

Pour libérer la pagecache, les dentiers et les inodes:

# echo 3 > /proc/sys/vm/drop_caches

J'essaie de comprendre ce que sont exactement la pagecache, les dentiers et les inodes. Que sont-ils exactement?

Les libérer permet également de supprimer le cache utile memcached et/ou redis ?

-

Pourquoi je pose cette question? Mon serveur Amazon EC2 RAM se remplissait au fil des jours - de 6% à 95% en l'espace de 7 jours. Je dois exécuter un cronjob bihebdomadaire pour les supprimer puis l'utilisation de la mémoire redescend à 6%.

19
Rakib

Avec une simplification excessive, permettez-moi d'essayer d'expliquer dans ce qui semble être le contexte de votre question car il y a plusieurs réponses.

Il semble que vous travaillez avec la mise en cache de la mémoire des structures de répertoires. Un inode dans votre contexte est une structure de données qui représente un fichier. A denteries est une structure de données qui représente un répertoire. Ces structures peuvent être utilisées pour créer un cache mémoire qui représente la structure de fichiers sur un disque. Pour obtenir une liste directe, le système d'exploitation peut aller dans les denteries - si le répertoire est là - lister son contenu (une série d'inodes). Si ce n'est pas le cas, accédez au disque et lisez-le en mémoire afin de pouvoir le réutiliser.

Le cache de page peut contenir des mappages de mémoire aux blocs sur le disque. Cela pourrait en théorie être des E/S tamponnées, des fichiers mappés en mémoire, des zones paginées d'exécutables - tout ce que le système d'exploitation pourrait contenir en mémoire à partir d'un fichier.

Vos commandes vident ces tampons.

18
user3344003

J'essaie de comprendre ce que sont exactement la pagecache, les dentiers et les inodes. Que sont-ils exactement?

user3344003 a déjà donné une réponse exacte à cette question spécifique, mais il est toujours important de noter que ces structures de mémoire sont allouées dynamiquement.

Lorsqu'il n'y a pas de meilleure utilisation de la "mémoire libre", la mémoire sera utilisée pour ces caches, mais automatiquement purgée et libérée lorsqu'une autre application "plus importante" souhaite allouer de la mémoire.

Non, ces caches n'affectent pas les caches gérés par les applications (y compris redis et memcached).

Mon serveur Amazon EC2 RAM se remplissait au fil des jours - de 6% à 95% en l'espace de 7 jours. Je dois exécuter un cronjob bihebdomadaire pour les supprimer puis l'utilisation de la mémoire redescend à 6%.

Vous interprétez probablement mal la situation: votre système peut simplement utiliser efficacement ses ressources.

Pour simplifier un peu les choses: la mémoire "libre" peut aussi être vue comme "inutilisée", voire plus dramatique - un gaspillage de ressources: vous l'avez payé, mais ne vous en servez pas. C'est une situation très peu économique, et le noyau Linux essaie de faire une utilisation "plus utile" de votre mémoire "libre".

Une partie de sa stratégie consiste à l'utiliser pour enregistrer différents types d'E/S de disque en utilisant divers caches de mémoire de taille dynamique. Un accès rapide à la mémoire cache économise un accès "lent" au disque, c'est donc souvent une idée utile.

Dès qu'un processus "plus important" veut allouer de la mémoire, le noyau Linux libère volontairement ces caches et met la mémoire à la disposition du processus demandeur. Il n'est donc généralement pas nécessaire de "libérer manuellement" ces caches.

Le noyau Linux peut même décider d'échanger la mémoire d'un processus autrement inactif sur le disque (espace d'échange), libérant RAM pour être utilisé pour des tâches "plus importantes", y compris probablement pour être utilisé comme un peu de cache.

Donc, tant que votre système n'échange pas activement d'entrée/sortie, il n'y a aucune raison de vider manuellement les caches.

Un cas courant pour "vider manuellement" ces caches est purement à des fins de comparaison: votre première analyse de référence peut s'exécuter avec des caches "vides" et ainsi donner de mauvais résultats, tandis qu'une deuxième analyse affichera des résultats bien "meilleurs" (en raison de la caches chauffées). En vidant vos caches avant toute analyse de référence, vous supprimez les caches "réchauffés" et vos analyses de référence sont donc plus "justes" à comparer les unes aux autres.

6

L'idée fausse courante est que la "mémoire libre" est importante. La mémoire est destinée à être utilisée.

Alors clarifions cela:

  • Il y a de la mémoire utilisée, qui est l'endroit où les données importantes sont stockées, et si cela atteint 100%, vous êtes mort
  • Ensuite, il y a le cache/tampon, qui est utilisé tant qu'il y a de l'espace pour le faire. C'est de la mémoire facultative pour accéder aux fichiers du disque plus rapidement, principalement. Si vous manquez de mémoire libre, cela se libérera et vous permettra d'accéder directement au disque.

La suppression de la mémoire cache comme vous le suggérez est dans la plupart des cas inutile et signifie que vous désactivez une optimisation, vous obtiendrez donc un ralentissement.

Si vous manquez vraiment de mémoire, c'est-à-dire si votre "mémoire utilisée" est élevée et que vous commencez à voir l'utilisation de swap, alors vous devez faire quelque chose.

[~ # ~] cependant [~ # ~] : il existe un bogue connu s'exécutant sur les instances AWS, le cache dentry mangeant de la mémoire sans raison apparente. Il est clairement décrit et résolu dans ce blog .

Ma propre expérience avec ce bogue est que le cache "dentry" consomme à la fois la mémoire "utilisée" et "mise en cache" et ne semble pas la libérer à temps, provoquant éventuellement un échange. Le bogue lui-même peut de toute façon consommer des ressources, vous devez donc l'examiner.

2
Tristan

Je déteste ramener un vieux fil des morts, mais j'ai eu des problèmes de mémoire récemment sur mes machines virtuelles Linux. Malheureusement, même avec la virtualisation des machines informatiques étant grande et les progrès de la mémoire Linux et l'allocation des ressources sont superbes, des conflits se produisent lorsque l'hyperviseur agit ce qu'il appelle des "fonctionnalités de performance".

VMWare enverra activement RAM qui n'a pas été "écrit ou modifié" récemment, sur le disque. Lorsque votre disque est sur un SAN, cela signifie lire à partir du RAM est maintenant au mieux de 1 Gbit/s à 10 Gbit/s si vous avez un RAID VRAIMENT performant et un accès réseau stable (en ignorant le fait que maintenant les RAM disons que 100 VM utilisent toutes le même SAN) . DDR3 RAM fonctionne à 25 Gbps + sur les systèmes modernes, donc je suppose que vous pouvez voir le problème avec les systèmes fonctionnant au 1/25ème à moins de 1/2 de la vitesse prévue.

Les caches sur mes systèmes Linux ont littéralement la même vitesse que les E/S disque du système de fichiers, ce qui signifie qu'ils n'aident pas nos performances et envoient activement le système d'exploitation RAM dans Swap au lieu d'effacer les caches. C'est un énorme problème grâce à VMWare, pas à cause de Linux, mais sachez que l'infrastructure cloud fait souvent des conneries stupides comme ça tout le temps malheureusement. Vous pouvez en lire plus ici: https://www.vmware.com /content/dam/digitalmarketing/vmware/en/pdf/techpaper/perf-vsphere-memory_management.pdf ou si vous utilisez VMWare, vous remarquerez sûrement la "mémoire allouée" par rapport à la "mémoire active" et où vos machines virtuelles affichera toujours une quantité différente de VMWare en raison de cette distinction et du traitement de la mémoire.

0
Tmanok