Pourquoi utiliser swap quand il y a suffisamment d'espace libre dans la RAM?

125

L'utilisation d'un espace d' échange au lieu de la RAM peut considérablement ralentir un PC.

Alors pourquoi, quand j’ai assez de RAM, mon système Linux (Arch) utilise-t-il l’échange?

Commander ma sortie de conky ci-dessous:

sortie conky

De plus, cela pourrait-il être la cause des problèmes de vitesse et de réactivité 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
Stefan
la source
5
Je suis à peu près sûr que la dynamique de cette question a considérablement changé, les disques SSD devenant la norme. Même si votre disque SSD grand public est toujours beaucoup plus lent que la RAM, il est désormais question de ce qui est le moins cher - RAM $ / Go ou SSD $ / Go. Le SSD, même s'il est plus lent, est beaucoup moins cher et dans la plupart des cas assez rapide pour que même l'échange permette d'éviter de perturber de manière significative l'expérience utilisateur, comme c'était le cas avec les médias rotationnels.
lkraav
7
Parfois, si vous utilisiez autrefois l’échange à cause de la mémoire vive, il peut arriver que des données précédemment échangées y restent, car elles ne sont pas utiles pour le moment.
Totor
1
Comme dit Totor. Parfois, le système va paginer quelque chose (pour une raison quelconque). Si cette page est ultérieurement remise en mémoire pour une opération de lecture, la copie dans l’espace de permutation n’est pas supprimée. Si la même page est paginée à nouveau ultérieurement, sans être modifiée, elle peut le faire sans écrire à nouveau sur le disque. La copie qui est là est déjà à jour. En d'autres termes, une page peut occuper de l'espace à la fois dans la permutation et dans la mémoire principale.
vendredi

Réponses:

93

Il est normal que les systèmes Linux utilisent un échange, même s'il reste encore de la mémoire vive. Le noyau Linux échangera des pages de mémoire qui sont très rarement utilisées (par exemple, les gettyinstances dans lesquelles vous utilisez uniquement X11 et un autre démon inactif).

L'utilisation de l'espace d'échange devient un problème uniquement lorsque la quantité de RAM disponible est insuffisante et que le noyau est obligé de déplacer en permanence les pages de la mémoire pour les échanger et les retourner en RAM, uniquement pour que les applications continuent de fonctionner. Dans ce cas, les applications de surveillance du système afficheraient une grande activité d'E / S de disque.

À des fins de comparaison, mon système Ubuntu 10.04, avec deux utilisateurs connectés avec des sessions X11 et deux exécutant le bureau GNOME, utilise environ 600 Mo de swap et ~ 1 Go de RAM (sans compter les tampons et le cache fs), je dirais donc que vos chiffres d'échange l'utilisation semble normale.

Riccardo Murri
la source
39
En remplaçant les programmes inactifs, vous disposez de plus de mémoire pour la mise en cache de fichiers. Et cela accélère les choses.
Jmanning2k
91

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

/proc/sys/vm/swappiness

La valeur par défaut est 60. Définir cette valeur sur 0 signifie ne jamais utiliser de permutation lorsqu'il reste de la RAM et que 100 remplace la mémoire dès que possible.

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

sudo sysctl vm.swappiness=10

Pour changer la valeur de façon permanente, éditez 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 désirée. Si ce fichier n'existe pas (par exemple dans Arch Linux), essayez /etc/sysctl.d/99-sysctl.confplutôt.

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

Marcel Stimberg
la source
27
Notez que réduire le swappiness ne signifie pas nécessairement une augmentation des performances ou de la réactivité. J'ai vu des rapports faisant état d' une swappiness croissante se traduisant par de meilleures performances. Ne croyez pas ce que vous lisez qui n'inclut pas de points de repère et vérifiez que les points de repère utilisent une charge de travail similaire à la vôtre.
Gilles
Est-ce que cela persiste après le redémarrage? Je pensais que / proc était régénéré à chaque démarrage.
HandyGandy
@ HandyGandy: j'ai ajouté des informations à la réponse sur la façon de la changer de manière permanente.
Marcel Stimberg
@ HandyGandy: pour être pédant, / proc n'est pas régénéré à chaque démarrage, mais proc est plutôt un système de fichiers virtuel, il n'est donc "généré" que lorsque vous y accédez. Cela n'existe pas du tout sur le disque.
Lie Ryan
swappinessla valeur n'a aucun effet sur mon système. Même en le mettant à 0, les pages cruciales et fréquemment utilisées (par exemple, l'index de mon IDE) continueront à être échangées lorsqu'il reste encore 2 Go de RAM libre.
chefarov
46

Linux commence à permuter avant que la RAM ne soit pleine. Ceci est fait pour améliorer les performances et la réactivité:

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

  • La réactivité est améliorée en remplaçant les pages lorsque le système est inactif, plutôt que lorsque la mémoire est saturée et qu'un programme est en cours d'exécution et demande plus de RAM pour mener à bien une tâche.

Bien entendu, l’échange ralentit le système - mais l’alternative à l’échange n’est pas l’échange, c’est plus de mémoire vive ou moins de mémoire vive.

Gilles
la source
Donc, dans un sens, le swap est une mesure au cas par cas ? Ça et la chose en hibernation ?
Tshepang
@Tshepang: Avoir assez de swap pour s'adapter à votre mémoire virtuelle n'est pas «au cas où», c'est nécessaire (sinon vos programmes vont planter à cause du manque de mémoire).
Gilles le
1
@Tschepang: Le tueur OOM est la raison pour laquelle ils plantent. (Techniquement, vous pouviez vous passer d’un tueur OOM et ne pouvoir simplement rien allouer, mais cela aurait de bonnes chances de verrouiller le système; le tueur OOM donne un peu plus de chances à l’administrateur de pouvoir se connecter et pour les processus importants de continuer à fonctionner.)
Gilles
1
Je comprends votre propos: "échanger des pages lorsque le système est inactif, plutôt que lorsque la mémoire est pleine", mais le gars utilise à peine 15% de sa RAM. Loin d'être presque complet, n'est-ce pas? Même si un échange précédent provoqué par plein de RAM peut avoir quitté cette situation ...
Totor
1
"Linux commence à permuter avant que la RAM ne soit pleine" quand? exactement
Yousha Aleayoub
12

Ceci est un vieux post, cependant, je prendrais toujours la liberté de faire part de mes pensées ici.

À partir de l’en bas, Linux divisera d’abord la mémoire en pages (généralement 4 Ko par page sur un système x86_64). Ensuite, une mémoire virtuelle est créée, dont le mappage est effectué avec une mémoire physique à l'aide de la 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. Veuillez noter que lorsque vous voyez / proc / meminfo, vous verrez VMalloc * en tant que 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 à partir de la mémoire virtuelle. Toutefois, il n'est pas nécessaire que la mémoire soit mappée (c'est-à-dire mappée sur la mémoire physique). Il existe un concept de "copie sur écriture" pour la gestion de la mémoire. Ainsi, si vos processus utilisent réellement la mémoire allouée à partir de la mémoire virtuelle (c’est-à-dire qu’elle enregistre sur la mémoire), elle est alors 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 dans la mémoire, alors que chaque processus peut accéder au même emplacement mémoire et effectuer 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 mémoire. Cela aide à accélérer les processus, car lire à nouveau glibc (etc.) à partir du disque prendrait beaucoup de temps.

Ce qui précède concernait les bibliothèques partagées proprement dites, il en va de même pour la lecture de fichiers. Si vous lisiez 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 serait plus rapide. Les données ont été mises en cache en mémoire et la relecture n'a pas été effectuée pour tous les blocs.

Qu'est-ce qu'un tampon?

En ce qui concerne la mémoire tampon, lorsqu'un processus effectue un fichier d'E / S, il utilise la mémoire tampon du noyau pour écrire des données sur le disque. Les processus demandent 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 à synchroniser ces données dans la mémoire tampon sur le disque. De cette façon, les processus comptent sur le noyau pour choisir le bon moment pour synchroniser les données sur le disque et les processus pourraient continuer. Rappelez-vous qu’il s’agit d’entrées / sorties générales effectuées par des 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 opensource sont libaio. En outre, il existe des moyens d'appeler la synchronisation explicite aux FD ouverts dans le contexte de vos processus,

Quels sont les défauts de page alors?

Prenons un exemple, lorsque vous démarrez un processus (par exemple un navigateur Web), dont le fichier binaire fait 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 consomme 300 Mo. Toutefois, la mémoire n’est pas entièrement mappée sur la mémoire physique (la mémoire résidente RSS serait inférieure, voir la sortie ci-dessus). Lorsque l'exécution du code atteint un point pour lequel la mémoire n'est pas physiquement mappée, une erreur de page pose problème. Le noyau mapperait cette mémoire sur physique, associerait la page mémoire à votre processus. Un tel défaut de page est appelé "Défauts de page mineurs". De même, lorsqu'un processus est en train de faire un fichier, les erreurs de page majeures sont levées.

Quand et pourquoi Swap Out se produit?

Situation 1:

En ligne avec les 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 effectuer un certain mappage de la mémoire. Cependant, il n'y a pas assez de RAM physique 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 ces pages sur une partition séparée (appelée SWAP), libérera certaines pages et mappera les pages libérées sur la nouvelle requête à venir. Comme l'écriture sur disque est beaucoup plus lente que la RAM à l'état solide, ce processus prend beaucoup de temps, ce qui entraîne un ralentissement.

Situation 2:

Disons que vous voyez beaucoup de mémoire libre disponible dans le système. Même à ce moment-là, vous voyez qu'il y a beaucoup d'échanges en cours. Il pourrait y avoir un problème de fragmentation de la mémoire. Prenons un processus qui requiert 50 Mo de mémoire contiguë du noyau. (garder à l'esprit contiguë). De toute évidence, le noyau aurait alloué des pages au hasard à différents processus et en aurait libéré certains. Cependant, lorsque nous demandons une mémoire contiguë, il faudra rechercher un bloc qui satisfasse à la demande des processus. S'il ne parvient pas à obtenir une telle mémoire, il devra échanger certaines anciennes pages de mémoire, puis allouer des pages contiguës. Même dans de tels cas, SWAP out aurait lieu. À partir de la version 2.6 et supérieure, les problèmes de fragmentation ont considérablement diminué. Toutefois, si le système fonctionne pendant 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 constatons qu'il reste encore une bonne quantité de mémoire RAM disponible. Cependant, même alors, l'échange est arrivé. À ce stade, nous avons vérifié l’arbre des processus et nous n’avons vu aucun processus nécessitant 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 passe 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

info de zone

swap gratuit bas gratuit

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

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

Anugraha Sinha
la source
2
Vous devez préciser si, dans votre "situation 2", le processus exigeant consiste à allouer de la mémoire physique, ce qui est un cas inhabituel. La plupart des processus ne traitent que de la mémoire virtuelle où la fragmentation est presque sans importance. Vous voudrez peut-être aussi mieux expliquer comment vous affirmez qu'il existe une fragmentation de la mémoire à partir des chiffres et du graphique affichés, car ce n'est pas évident à première vue. Oh, et d'ailleurs, vous parlez de mémoire contiguë , espérons pas de mémoire contagieuse ;-)
jlliagre
@ Jlliagre: Merci pour les entrées. Je suis en train de corriger l'erreur "contiguë".
Anugraha Sinha
5

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 et à disposer de plus de mémoire.

En hibernation

Mais swap peut également être utilisé en veille prolongée, ce qui peut s'avérer très utile lorsque vous avez un ordinateur portable ou que vous souhaitez économiser de l'énergie et mettre votre ordinateur en veille prolongée avant de quitter le travail. Vous pouvez donc commencer plus rapidement le lendemain matin.

Le fait d’avoir une fonction d’hibernation est l’une des principales raisons pour lesquelles nous voyons encore aujourd’hui le conseil d’avoir au moins la taille de la RAM pour le swap. De cette façon, le système peut mettre toute la RAM utilisée dans la permutation et passer en veille prolongée.

Les carences

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

L'utilisation de l'échange crypté avec la mise en veille prolongée ne fonctionne pas 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 d'espace de swap à chaque démarrage) et un initrd / initramfs pour activer le volume chiffré avant de le reprendre.

Huygens
la source
3

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

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

L'année dernière, j'ai remplacé l'un de mes sites Web par un nouveau framework de serveur Web prometteur, construit sur Firefox. Il peut sembler étrange de créer un système côté serveur au-dessus d’un programme axé sur le client tel que Firefox, mais cela présentait d’énormes avantages. Firefox est très puissant, offre des services internes vraiment impressionnants et réduit l'inadéquation de l'impédance entre le serveur et le client si les deux plates-formes sont similaires.

Mais il y a un inconvénient: Firefox est grand. Vraiment gros. Il s’agissait d’un projet de la version 1.x, de sorte qu’ils n’avaient pas eu l’impression de supprimer le support de l’interface graphique. t autoriser l’espace de permutation, ce code graphique et toutes les autres parties de Firefox que je n’utilisais pas utilisaient de la vraie RAM. J'ai fini par avoir besoin de 512 Mo de RAM minimum pour pouvoir exécuter le site sans plantage dû à l'épuisement de la mémoire. Si mon VPS disposait d'un espace d'échange, j'aurais probablement pu me débrouiller avec un forfait de 256 Mo.

[*] Supprimer le code de l'interface graphique de la structure n'était peut-être même pas souhaitable, car l'un des avantages de cette plate-forme était le grattage Web haute fidélité, car la structure côté serveur pouvait télécharger des pages Web depuis un autre site et les manipuler. comme vous le feriez côté client. Pensez aux mashups. Beaucoup de ce genre de choses casseraient si vous ne pouviez pas "rendre" la page Web dans un contexte graphique.

À propos, ce framework web est pratiquement mort maintenant, il est donc inutile de le nommer. Il vaut mieux prendre la leçon plus générale à coeur: oui, le swap est toujours utile même si vous avez des concerts de RAM libre.

Warren Young
la source
3

D'après Ubuntu Swap FAQ auquel Marcel s'est associé

Au minimum, il est fortement recommandé que l’espace de permutation soit égal à la quantité de mémoire physique (RAM). En outre, il est recommandé que l’espace de permutation soit deux fois plus important que la quantité de mémoire physique (RAM), en fonction de la quantité de disque dur.

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

Jader Dias
la source
6
Je trouve toujours cela incroyable. Pourquoi devrais-je avoir besoin de 8 Go d’échange pour mon système sans hibernation de 4 Go? Ai-je vraiment besoin de 128 Go d'échange pour mon nœud de calcul de 64 Go? Je n'accorde généralement pas plus de 1 Go pour le swap, sauf pour des raisons très spécifiques.
David Mackintosh
2
Il laisse plus d'espace pour la mise en cache du disque dur lent comme d'habitude dans une mémoire vive ultra rapide. (De plus, certains systèmes d'hibernation enregistrent une copie de la RAM dans un espace d'
échange
6
@David, @Jader: Le swap = 2 * ram figure est un vieux châtaignier qui a survécu bien après que la justification initiale est devenue sans objet. Désormais, les gens essaient de trouver un moyen de justifier ce chiffre au lieu de proposer un chiffre approprié pour leur système. . Vous voyez pourquoi avons-nous besoin de définir deux fois plus d'espace d'échange que notre mémoire physique? .
Gilles
1
@Gilles Je m'en tiens à ma position car j'ai déjà vu un article faisant autorité sur ce sujet contredisant un groupe d'experts dont je ne sais pas à quel point leurs connaissances sont approfondies.
Jader Dias
4
Si vous vous en souvenez, partagez-le.
Gilles
2

Je pense que "Gilles" a déjà mentionné le fait que, même si vous disposez de suffisamment de mémoire RAM, l’échange peut être utile lors de certaines "insuffisances", tout en préservant certaines données même après des arrêts - ou ai-je tort de supposer cela? depuis que la RAM est épuisé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. À un moment donné, lorsque j'avais désactivé tous les échanges et que je ne comptais que sur ma RAM, j'avais des expériences péniblement difficiles à essayer de déboguer une erreur système, un plantage, etc. après l'arrêt du système. Depuis lors, j'ai réactivé la partition de swap.

ILMostro_7
la source