Quand le swap est-il replacé dans la mémoire physique?

8

Quand le swap est-il replacé dans la mémoire physique sous Linux? Est-ce uniquement sur demande, c'est-à-dire. quand c'est nécessaire? Ou le swap est-il lentement transféré vers la mémoire physique lorsque l'ordinateur n'est pas à pleine charge?

Ztyx
la source

Réponses:

7

À la demande. En fait, Linux transférera lentement la mémoire physique pour la permuter lorsqu'elle est inactive (voir: "permutation").

Ignacio Vazquez-Abrams
la source
Merci. Une réponse courte et concise. J'aime ça (même si j'apprécie les efforts de tous les autres dans leurs réponses)!
Ztyx
Cette réponse est fausse. La question est de savoir quand la mémoire est paginée et non paginée. C’est le contraire. En cas de défaut de page, le noyau rechargera la page à partir du disque / échange. Donc surtout sur demande. Vous pouvez accéder à toute la mémoire virtuelle d'un processus pour déclencher des défauts de page. En conséquence, les pages seraient recopiées dans la RAM.
user228505
7

Pendant le fonctionnement normal, les données de swap sont chargées dans la mémoire à la demande, comme d'autres l'ont répondu, mais il y a un cas de plus lorsque cela se produit: c'est lorsque l'espace de swap est désactivé, à condition qu'il y ait suffisamment de mémoire physique pour charger tout le contenu du swap.

Faites juste:

swapoff -a

… Et toutes vos données de swap «reviendront» dans la mémoire. L'effet secondaire est que les tampons / caches de disque peuvent être vidés.

Parfois, il peut être souhaitable de le faire swapoff -a ; swapon -a, par exemple après un processus de fuite de mémoire bogué, avant de planter, des processus plus importants soient éliminés - pour vous assurer que tout processus en cours d'exécution dans le système est chargé en mémoire et n'attendra pas l'échange quelques minutes.

Jacek Konieczny
la source
Oh, vous apprenez quelque chose de bien tous les jours! Btw, "swapoff -a" échouera s'il n'y a pas assez de mémoire physique? Y a-t-il un risque à appeler swapoff?
Ztyx
Il échouera s'il n'y a pas assez de mémoire physique. C'est toujours un risque swapoffqui n'échouera pas, mais le système manquera de mémoire peu de temps après swapoffet le MOO tuera le processus aléatoire (dans le pire des cas, le shell sur le point d'appeler swaponou la swaponcommande). En pratique, cela est très peu probable - une grande quantité de mémoire est utilisée par les caches avant d' swapoffêtre appelée, donc il devrait y avoir suffisamment de RAM pour que les deux commandes s'exécutent.
Jacek Konieczny
7

Comme d'autres l'ont souligné, les pages ne seront recopiées dans la RAM qu'en cas de besoin (à la demande) au lieu de prendre de la RAM qui pourrait être mieux laissée disponible pour le cache / les tampons.

Le fait que les pages soient recopiées dans la RAM et non déplacées est important et peut prêter à confusion si vous n'en avez pas conscience. La page ne sera pas désallouée du swap à moins qu'elle ne soit plus nécessaire du tout (c'est-à-dire que la page soit complètement désallouée), qu'elle soit modifiée dans la RAM (donc la copie dans swap n'est plus correcte), ou que le swap soit bas (et -des blocs de disque sont nécessaires pour échanger d'autres pages). De cette façon, si la page doit être à nouveau échangée à l'avenir, aucune écriture sur le disque n'est nécessaire car le noyau sait qu'il existe déjà une bonne copie sur le disque - cela peut réduire considérablement le "thrashing" lorsque la RAM disponible devient extrêmement faible mais l'espace de swap n'est pas également congestionné.

Vous pouvez voir combien de pages se trouvent actuellement dans la RAM et permuter cat /proc/meminfo- la SwapCachedligne est la quantité de données qui se trouve dans les pages qui sont actuellement à la fois dans la RAM et sur le disque. Si vous pensez que votre swap actuel l'utilise plus que prévu, vérifiez la valeur SwapCached car cela pourrait bien expliquer la différence.

David Spillett
la source
Il y a déjà eu des discussions sur des questions similaires. Cependant, pas cette question spécifique. Voir aussi serverfault.com/questions/100448/… qui traite de SwapCached.
Ztyx
Je ne me souviens même pas d'avoir écrit cette réponse ... J'aurais probablement pu simplement la lier (ou la copier + la coller) au lieu de taper ce qui précède ...
David Spillett
0

Cela est généralement lié au matériel que vous utilisez. Sur la plupart des matériels (y compris Intel), la MMU contrôle l'ensemble du processus.

Lorsqu'un programme alloue de la mémoire, il le demandera à la MMU et récupérera une adresse virtuelle. À son tour, la MMU enregistrera cette page comme étant "en cours d'utilisation" dans la carte globale de l'espace d'adressage.

Lorsque le programme accède réellement à cet espace mémoire, la MMU recherche la page dans la carte d'adresses. Si cette page est en mémoire "live", elle renverra un pointeur "live" à l'OS qui gérera la lecture / écriture de la mémoire au nom du programme. Si la mémoire n'est pas actuellement allouée, cela déclenchera un défaut de page. Cette exception de processeur est ensuite interceptée par le système d'exploitation qui est ensuite chargé de déterminer où se trouvent les données dans le fichier d'échange, de les charger dans la mémoire physique et de rendre la page à la MMU afin que le processus initial puisse continuer.

Cela signifie que, à moins d'accéder à la page mémoire, elle ne reviendra jamais dans la mémoire "en direct" une fois mise en swap. C'est pourquoi il existe généralement une API de système d'exploitation qui permet aux programmes de spécifier qu'un bloc de mémoire particulier ne doit PAS être échangé sur le disque et doit être conservé en mémoire (je ne connais pas Linux, mais sous Windows, c'est la fonction VirtualLock) .

Stéphane
la source
mlock(2) linux.die.net/man/2/mlock
Ignacio Vazquez-Abrams