Question Quelles sont les conditions exactes en fonction desquelles Linux échange la mémoire de processus (s) de la RAM vers un fichier d'échange?


Mon serveur a 8 Go de RAM et 8 Go configurés pour le fichier d'échange. J'ai des applications gourmandes en mémoire en cours d'exécution. Ces applications ont des charges de pointe au cours desquelles nous constatons une augmentation de l'utilisation de l'échange. Environ 1 GIG de swap est utilisé.

J'ai un autre serveur avec 4 Go de RAM et 8 Go de swap et autres applications gourmandes en mémoire qui s'exécutent. Mais ici, l’utilisation des échanges est très négligeable. Environ 100 MB.

Je me demandais quels sont les exact conditions ou un formule brute sur la base de laquelle Linux effectuera l’échange d’une mémoire de processus en mémoire vive vers le fichier d’échange. Je sais que c'est basé sur le facteur swapiness. Sur quoi d'autre est-il basé? Taille du fichier d'échange? Tous les pointeurs sur la documentation interne / le code source de kernel Linux expliquant cela seront formidables.


7
2018-01-08 16:26


origine




Réponses:


Le sous-système de machine virtuelle d'un noyau Linux est une bête très compliquée. Le noyau utilise des méthodes heuristiques et des algorithmes pour déterminer les pages à permuter, le moment opportun. Je ne pense pas qu'il existe une formule simple capable de décrire comment et quand les pages sont mises sur disque. Peut-être que cet article de LWN vous est utile:

http://lwn.net/Articles/83588/


4
2018-01-08 16:38





Comme vous le savez probablement, le noyau Linux utilise autant de mémoire que possible pour mettre en cache des choses. C'est pourquoi la sortie de free ressemble à un manque de mémoire, selon la ligne du haut:

 $ free -m
              total       used       free     shared    buffers     cached
 Mem:          3168       2963        205          0        155       1263
 -/+ buffers/cache:       1543       1624
 Swap:          494         86        407

mais la partie importante est la quantité de RAM que les tampons et le cache n'utilisent pas

 -/+ buffers/cache:       1543       1624

Néanmoins, tout sauf 205 Mo de mémoire sont utilisés dans cet exemple, même s'il s'agit d'un cache. Comme cela m’a été expliqué (ou du moins, si j’ai bien compris), si un programme demande tout à coup> 205 Mo de mémoire, ce bloc sort du swap, de sorte que le processus puisse avoir le bloc de mémoire, puis il sort de swap dès qu’il a la possibilité de libérer de la mémoire utilisée par le cache.

Comme mentionné par pfo, les mécanismes sous-jacents sont complexes et vont bien au-delà de ma compréhension. J'ai posé à Ted Ts'o à peu près la même question lors d'une classe qu'il enseignait à LISA et je vous ai donné essentiellement la même réponse qu'il m'a donnée, ou du moins telle que je l'ai comprise.

Incidemment, je soupçonne que la mémoire "utilisée" dans le swap n’est utilisée par rien à ce stade, mais qu’elle n’a pas encore été libérée.


2
2018-01-08 16:58



swapoff -a && swapon -adevrait être utilisé pour libérer cet espace de swap. - pfo
Si un programme demandait soudainement plus de 205 Mo de mémoire, Linux ne pas obtenir une partie de la mémoire "hors échange". Au lieu de cela, le système pourrait simplement décider que certaines de ses pages de cache disque ne sont pas aussi importantes que de fournir cette demande de RAM, marquer ces pages comme inutilisées et effacer leur contenu, puis les transmettre au processus. Après tout, tout le contenu du cache disque peut simplement être lu ultérieurement si quelqu'un regarde à nouveau le fichier mis en cache! Swap ne serait même pas impliqué. - Brandon Rhodes
Ce n'est pas ainsi que cela m'a été expliqué (ou du moins, comment j'ai compris l'explication) - Matt Simmons


En développant la réponse de pfo, un fournisseur peut également prérégler son (ses) noyau (s) déployé (s) pour gérer le swappiness d'une certaine manière. Sur un système Red Hat, vous pouvez en configurer une grande partie dans /etc/sysctl.conf. Les paramètres de Google tels que:

vm.swappiness
vm.vfs_cache_pressure

En adaptant soigneusement la rapidité du système aux besoins spécifiques de votre application, vous pourrez peut-être réduire votre utilisation de la permutation sur cette machine de 8 Go. J'ai une note dans mes fichiers qui dit pour vm.swappiness "l'utilisation de la mémoire de permutation par défaut sur le noyau 2.6.xx est définie à 60%" mais n'a pas enregistré le lien où j'ai lu cela, alors prenez-le avec un grain de sel. :)


2
2018-01-08 18:48





Nous nous sommes intéressés à ce problème sur les serveurs d'applications JBoss de production sur AWS.

Je voudrais diff sysctl -a deux systèmes.

1) Pour les serveurs, définissez vm.swappiness sur près de 0. Cette option préfère conserver les éléments en mémoire.

2) Activez un petit fichier d'échange sur tous les serveurs afin de pouvoir surveiller la charge de mémoire réelle. (Vérifiez le swap utilisé%).

3) Surveiller les défauts de page (nFLT) avec Cacti ou similaire.

4) Vérifiez ulimits.

5) Réglez en fonction des performances mesurables de l'application.


1
2018-01-08 20:38