web-dev-qa-db-fra.com

Pourquoi utiliser swap quand il y a plus qu'assez d'espace libre dans la RAM?

Utiliser swap espace au lieu de RAM peut ralentir considérablement un PC.

Alors pourquoi, quand j'en ai plus qu'assez RAM disponible, mon système Linux (Arch) utilise-t-il le swap?

Découvrez ma sortie conky ci-dessous:

conky output

Cela pourrait-il également être la cause des problèmes de vitesse et de réactivité du système que je rencontre?

Sortie de free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357
132
Stefan

Il est normal que les systèmes Linux utilisent certains swap même s'il y a toujours RAM gratuit. Le noyau Linux se déplacera pour échanger des pages mémoire qui sont très rarement utilisées (par exemple , les instances getty lorsque vous utilisez uniquement X11 et certains autres démons inactifs).

L'utilisation de l'espace d'échange devient un problème seulement quand il n'y en a pas assez RAM disponible, et le noyau est obligé de déplacer continuellement les pages de mémoire pour permuter et revenir en RAM, juste pour Dans ce cas, les applications de surveillance du système afficheraient beaucoup d'activité d'E/S disque.

À titre de comparaison, mon système Ubuntu 10.04, avec deux utilisateurs connectés avec des sessions X11 exécutant à la fois le bureau GNOME, utilise ~ 600 Mo de swap et ~ 1 Go de RAM (sans compter les tampons et le cache fs), donc Je dirais que vos chiffres d'utilisation des swaps semblent normaux.

96
Riccardo Murri

Ce comportement peut être configuré en définissant la valeur de:

/proc/sys/vm/swappiness

La valeur par défaut est 60. Si vous la définissez sur 0, vous n'utiliserez jamais de swap lorsqu'il reste RAM restante et 100 remplace la mémoire dès que possible.

Pour modifier temporairement la valeur (perdue au redémarrage):

Sudo sysctl vm.swappiness=10

Pour modifier définitivement la valeur, modifiez le fichier:

/etc/sysctl.conf

en tant que root (par exemple Sudo nano /etc/sysctl.conf) et modifiez ou ajoutez (si ce n'est pas le cas) la ligne:

vm.swappiness

à la valeur souhaitée. Si ce fichier n'existe pas (par exemple dans Arch Linux), essayez /etc/sysctl.d/99-sysctl.conf au lieu.

Il y a eu un débat sur la question de savoir si l'échange avec la mémoire disponible est bon ou mauvais, mais le l'aide d'Ubuntu recommande en effet une valeur de 10 pour les systèmes de burea . Voir aussi ce tutoriel sur Digital Ocean pour CentOS .

96
Marcel Stimberg

Linux commence à échanger avant que le RAM soit rempli. Ceci est fait pour améliorer les performances et la réactivité:

  • Les performances sont améliorées car parfois RAM est mieux utilisé pour le cache disque que pour stocker la mémoire du programme. Il est donc préférable de remplacer un programme inactif depuis un certain temps et de conserver à la place les fichiers fréquemment utilisés dans cache.

  • La réactivité est améliorée en échangeant des pages lorsque le système est inactif, plutôt que lorsque la mémoire est pleine et qu'un programme est en cours d'exécution et demande plus RAM pour terminer une tâche).

L'échange ralentit le système, bien sûr - mais l'alternative à l'échange n'est pas d'échanger, c'est d'avoir plus RAM ou utiliser moins de RAM.

Ceci est un ancien poste, cependant, je prendrais encore la liberté de mettre mes pensées ici.

À partir de la base, Linux diviserait d'abord la mémoire en pages (généralement 4K par page sur le système x86_64). Par la suite, une mémoire virtuelle est créée, dont le mappage est effectué avec de la mémoire physique à l'aide de MMU (unité de gestion de la mémoire).

Les processus se voient allouer de la mémoire à partir de la zone de mémoire virtuelle, donc veuillez noter que lorsque vous voyez/proc/meminfo, vous verrez VMalloc * comme détails de la mémoire virtuelle.

Disons que vous avez un processus qui demande de la mémoire (disons 300 Mo - un navigateur Web). Le processus se verrait allouer 300 Mo de la mémoire virtuelle, cependant, il n'est pas nécessaire qu'il soit mappé en mémoire (c'est-à-dire mappé sur la mémoire physique). Il existe un concept de "Copie en écriture" pour la gestion de la mémoire, par lequel, si vos processus utilisent réellement la mémoire allouée à partir de la mémoire virtuelle (c'est-à-dire qu'ils font une écriture sur la mémoire), alors seulement, elle est mappée sur la mémoire physique. Cela aide le noyau à fonctionner correctement dans un environnement multi-processus.

Que sont les caches?

Une grande partie de la mémoire utilisée par les processus est partagée. Disons que la bibliothèque glibc est utilisée par presque tous les processus. Quel est l'intérêt de conserver plusieurs copies de glibc en mémoire, lorsque chaque processus peut accéder au même emplacement de mémoire et faire le travail. Ces ressources fréquemment utilisées sont conservées dans le cache de sorte que lorsque les processus le demandent, elles puissent être référencées au même emplacement de mémoire. Cela aide à accélérer les processus, car la lecture de la glibc (etc.) à partir du disque prendrait beaucoup de temps.

Ce qui précède était pour les bibliothèques partagées par exemple, similaire est également vrai pour la lecture de fichiers. Si vous lisez un fichier volumineux (disons 100-200 Mo) pour la première fois, cela prendrait beaucoup de temps. Cependant, lorsque vous essayez de refaire la même lecture, ce sera plus rapide. Les données ont été mises en cache dans la mémoire et la relecture n'a pas été effectuée pour tous les blocs.

Qu'est-ce que le tampon?

En ce qui concerne le tampon, lorsqu'un processus effectue des E/S sur fichiers, il s'appuie sur le tampon du noyau pour écrire des données sur le disque. Les processus, demande au noyau de faire le travail. Ainsi, au nom du processus, le noyau écrit les données dans son "tampon" et indique au processus que l'écriture est terminée. De manière asynchrone, le noyau continuera de synchroniser ces données dans le tampon sur le disque. De cette façon, les processus s'appuient sur le noyau pour choisir une heure correcte pour synchroniser les données sur le disque, et les processus pourraient continuer à fonctionner. N'oubliez pas qu'il s'agit d'E/S générales que font les processus normaux. Cependant, les processus spécialisés, qui doivent confirmer que les E/S sont réellement effectuées sur le disque, peuvent utiliser un autre mécanisme pour effectuer des E/S sur le disque. Certains des utilitaires open source sont libaio. En outre, il existe des moyens d'appeler la synchronisation explicite aux FD ouverts dans le contexte de vos processus, afin de forcer le noyau à le noyau à synchroniser les données sur le disque pour l'écriture que vous auriez pu faire.

Quels sont donc les défauts de page?

Prenons un exemple, lorsque vous démarrez un processus (par exemple un navigateur Web), dont le binaire est d'environ 300 Mo. Cependant, les 300 Mo complets du binaire du navigateur Web ne commencent pas à fonctionner instantanément. Le processus continue de passer de fonctions en fonctions dans son code. Comme indiqué précédemment, la mémoire virtuelle serait consommée de 300 Mo. Cependant, tout n'est pas mappé en mémoire physique (la mémoire résidente RSS serait inférieure, voir la sortie supérieure). Lorsque l'exécution de code atteint un point pour lequel la mémoire n'est pas réellement mappée physiquement, une erreur de page pose problème. Le noyau associe cette mémoire à la mémoire physique, associe la page mémoire à votre processus. Un tel défaut de page est appelé "Défauts de page mineurs". De la même manière, lorsqu'un processus effectue des E/S de fichiers, des erreurs de page majeures sont déclenchées.

Quand et pourquoi Swap Out se produit?

Situation 1:

Conformément aux détails ci-dessus, considérons un scénario où la bonne quantité de mémoire devient mappée en mémoire. Et maintenant, un processus démarre, ce qui nécessite de la mémoire. Comme discuté ci-dessus, le noyau devra faire un mappage de mémoire. Cependant, il n'y a pas assez de physique RAM disponible pour mapper la mémoire. Maintenant, le noyau va d'abord regarder dans le cache, il aura quelques anciennes pages de mémoire qui ne sont pas utilisées. Il videra celles pages sur une partition distincte (appelée SWAP), libérer certaines pages et mapper les pages libérées à la nouvelle demande à venir. Comme l'écriture sur le disque est beaucoup plus lente que la RAM à semi-conducteurs, ce processus prend beaucoup de temps, et donc un ralentissement est vu.

Situation 2:

Disons que vous voyez beaucoup de mémoire disponible dans le système. Même alors, vous voyez qu'il y a beaucoup d'échanges. Il pourrait y avoir un problème probable de fragmentation de la mémoire. Considérons un processus, qui nécessite 50 Mo de mémoire contiguë du noyau. (gardez à l'esprit contiguë). De toute évidence, le noyau aurait alloué des pages de manière aléatoire à différents processus et en aurait libéré certains. Cependant, lorsque nous demandons de la mémoire contiguë, il devra chercher un morceau qui satisfasse la demande des processus. S'il n'est pas en mesure d'obtenir une telle mémoire, il devra effectuer un remplacement de certaines anciennes pages de mémoire, puis allouer des pages contiguës. Même dans de tels cas, la sortie SWAP se produirait. À partir de Kernel ver 2.6 et supérieur, ces problèmes de fragmentation ont considérablement diminué. Cependant, si le système fonctionne depuis longtemps, de tels problèmes peuvent toujours survenir.

Voir cet exemple ( sortie vmstat )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04, nous voyons qu'il y a toujours une bonne quantité de RAM disponible disponible. Cependant, même alors l'échange s'est produit. Nous avons vérifié l'arborescence des processus à ce stade , et nous n'avons vu aucun processus qui exigerait une telle quantité de mémoire (plus que de la mémoire libre). Le soupçon évident était la situation 2 décrite ci-dessus. Nous avons vérifié les journaux buddyinfo et zoneinfo ci-dessus (utilisez echo m>/proc/sysrq -trigger pour les vérifier, la sortie va dans syslogs).

Pour un système normal, la comparaison des informations de zone est la suivante. Et les graphiques pour cache/free/low mem sont également mentionnés ci-dessous

zone info

swap free low free

En regardant les informations, il est clair qu'il y a une fragmentation de la mémoire dans le nœud 0 et le nœud 1 normal (le nœud est une machine basée sur NUMA, donc plusieurs nœuds (voir numactl pour vérifier les informations de votre système)).

La fragmentation de la mémoire est également une raison pour laquelle l'utilisation du swap peut augmenter même lorsque la mémoire disponible est là.

15
Anugraha Sinha

Avoir plus de mémoire disponible

Comme tout le monde l'a dit, oui, l'échange vous aidera à vous débarrasser de la mémoire inutilisée, ce qui vous aidera à avoir plus de mémoire disponible.

Hibernation

Mais le swap peut également être utilisé pour hibernation qui peut être très utile lorsque vous avez un ordinateur portable ou que vous souhaitez économiser de l'énergie et mettre votre ordinateur et travailler en hibernation avant de quitter le travail. Vous pouvez donc démarrer plus rapidement le lendemain matin.

Avoir une fonction d'hibernation est l'une des principales raisons pour lesquelles nous voyons encore aujourd'hui conseiller d'avoir au moins la taille de RAM pour le swap. De cette façon, le système peut mettre tous les RAM dans le swap et passe en veille prolongée.

lacunes

Veillez à ce qu'une fois échangé, les données d'un processus puissent être lues dans l'échange même après l'arrêt, à moins que l'échange n'ait été crypté (bien sûr).

L'utilisation de l'échange crypté avec l'hibernation ne fonctionne pas immédiatement avec toutes les distributions. Vous devez utiliser une clé de chiffrement constante (certaines configurations génèrent de manière aléatoire la clé de chiffrement de l'espace d'échange à chaque démarrage) et un initrd/initramfs pour activer le volume chiffré avant de reprendre.

5
Huygens

De buntu Swap F.A.Q. que Marcel a lié à

Au minimum, il est fortement recommandé que l'espace de swap soit égal à la quantité de mémoire physique (RAM). En outre, il est recommandé que l'espace de swap soit le double de la quantité de mémoire physique (RAM) en fonction de la quantité de disque dur

Je pense que vous devriez augmenter votre espace de swap dans votre système. Le swap accélère RAM allocation de mémoire en permettant de supprimer les données déjà paginées.

3
Jader Dias

Un grand nombre de programmes modernes sont construits sur des cadres gonflés qui entraînent beaucoup de déchets dont vous n'avez pas réellement besoin pour exécuter le programme. L'échange de ces pages inutilisées libère RAM pour le cache et les programmes qui peuvent réellement utiliser la RAM.

Je parle ici d'une expérience personnelle douloureuse.

L'année dernière, j'ai changé l'un de mes sites Web vers un nouveau cadre de serveur Web prometteur qui a été construit sur Firefox. Cela peut sembler étrange de construire un système côté serveur au-dessus d'un programme axé sur le client comme Firefox, mais cela présentait d'énormes avantages. Firefox est très puissant, offre des services internes vraiment impressionnants, et il réduit le décalage d'impédance entre le serveur et le client pour avoir les deux plates-formes similaires.

Mais il y a un inconvénient: Firefox est grand. Vraiment gros. Il s'agissait d'une sorte de projet de la version 1.x, donc ils n'avaient pas abordé des choses comme la suppression de la prise en charge de l'interface graphique. [*] Mon site n'avait pas besoin de tout cela, mais parce que la technologie VPS que mon hébergeur utilisait ne faisait pas '' t permettre l'espace de swap, ce code GUI et toutes les autres parties de Firefox, je n'ai pas utilisé de vraie RAM. J'ai fini par avoir besoin de 512 Mo RAM minimum juste pour exécuter le site sans qu'il se bloque à cause de l'épuisement de la mémoire. Si mon VPS avait un espace de swap, j'aurais probablement pu obtenir par avec un plan de 256 Mo.

[*] La suppression du code GUI du framework n'était peut-être même pas souhaitable, car l'un des avantages de cette plate-forme était le raclage Web haute fidélité, car le framework côté serveur pouvait télécharger des pages Web à partir d'un autre site, et vous pouviez les manipuler comme vous serait du côté client. Pensez aux mashups. Une grande partie de ce genre de choses se briserait si vous ne pouviez pas "rendre" la page Web dans un contexte graphique.

Soit dit en passant, ce cadre Web est essentiellement mort maintenant, il n'y a donc aucun intérêt à le nommer et à le faire honte. Il est préférable de prendre à cœur la leçon plus large: oui, le swap est toujours utile même si vous avez des quantités de RAM gratuites.

3
Warren Young

Je pense que "Gilles" a déjà mentionné le fait que, bien que vous ayez plus que suffisamment de RAM, le swap peut être utile pendant certaines "lacunes" ainsi que la sauvegarde persistante de certaines données même après des arrêts - ou ai-je tort de supposer cela? ( depuis RAM est éliminée après les redémarrages), j'ai 12 Go de RAM disponible sur mon système, et moi aussi, j'ai déjà réfléchi à cette question auparavant. À un moment donné, lorsque j'avais désactivé tous les swaps et que je ne comptais que sur ma RAM, j'ai eu des expériences douloureusement difficiles en essayant de déboguer des erreurs système, ou des plantages, etc. après les arrêts du système. Depuis lors, j'ai réactivé la partition de swap.

2
ILMostro_7