Comment vider le swap s'il y a de la RAM libre?

315

Lorsque j'ouvre une application exigeant beaucoup de RAM (VirtualBox définie à 2 Go de RAM), un espace d'échange est généralement utilisé, en fonction des éléments que j'ai ouverts à ce moment-là.

Cependant, lorsque j'ai quitté cette dernière application, les 2 Go de RAM sont libérés, mais la même utilisation d'espace de swap reste.

Par exemple, à l'heure actuelle, environ deux heures après la fermeture de VirtualBox, j'ai 1,6 Go de RAM libre et 770 Mo en swap.

Comment puis-je dire à Ubuntu d’arrêter d’utiliser cet échange et de revenir à l’utilisation de la RAM?

jfoucher
la source
La chose la plus facile est de redémarrer votre appareil et de gagner du temps en vous adaptant à la RAM et à la sauvegarde gratuite de la puissance de l'ordinateur portable et de la température de l'ordinateur.
Mohamed Slama
5
Grosse hypothèse selon laquelle repeupler tous les éléments de votre ordinateur prend moins de temps que cela.
jQwierdy
Ubuntu 16.04, au moins, peut continuer à utiliser le swap longtemps après son utilisation, ralentissant ainsi l'ordre de grandeur de votre système en s'appuyant sur le fichier d'échange, même si ce n'est plus une nécessité. L'intervention manuelle peut donc par utile. Le redémarrage n'est pas toujours une option.
Mat

Réponses:

167

Le fait que le swap soit alloué ne signifie pas qu'il est "utilisé". Bien que des programmes tels que System Monitor et Top affichent une partie de votre espace d'échange alloué (dans votre exemple, 770 Mo), cela ne signifie pas que le système active / désactive activement le système.

Pour savoir si un échange est en cours, vous pouvez utiliser la vmstatcommande. Laissez-le fonctionner quelques secondes pour vous sicalmer et regarder les colonnes (swapin) et so(swapout). Si rien ne se passe, il n'y a aucune raison d'être inquiet.

Voici la sortie de l'exécution vmstat 1, où vous pouvez voir que ma machine n'échange pas du tout.

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0  78588 230788   9596  72196    0    0     0     0  543  652 12  6 78  0
 0  0  78588 230780   9596  72196    0    0     0     0  531  410  1  0 99  0
 0  0  78588 230796   9596  72196    0    0     0     0  300  335  1  1 97  0
 1  0  78588 230788   9608  72224    0    0    40     0  737  762  4  4 84  8
 5  0  78588 230788   9608  72224    0    0     0     0  415  385  9  3 84  0
 0  0  78588 230540   9616  72224    0    0     0    44  611  556 55  5 31  0
 0  0  78588 230532   9616  72224    0    0     0     0  574  662  1  6 89  0

Pourtant, ici, topvous pouvez voir que j'ai un espace d'échange alloué: -

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached
popey
la source
32
“Aucune raison d'être inquiet”, jusqu'au moment où je continue à utiliser une application qui a été remplacée. alors tout l'enfer se déchaîne.
törzsmókus
207
Cet article ne répond pas à la question.
Emchristiansen
18
La prémisse de la question est basée sur des idées fausses. Cet article aborde les idées fausses.
Popey
30
Je ne vois pas une idée fausse, je vois un désaccord sur ce que "utilisé" signifie. Vous voulez dire "utilisé" pour faire référence à un échange actif / inactif, alors que la question initiale semble avoir le mot "utilisé", ce qui signifie qu'il y a des données qui ont été échangées et qu'il faudra peut-être plus tard y retourner. raisons valides de vouloir vider le swap après un événement qui remplace beaucoup d'autres mémoires, préemptant par la suite le swap actif dont l'utilisateur sait qu'il se produira plus tard (surtout si le "dé-swap" ultérieur est susceptible de se produire pendant la le disque est sous charge pour d'autres raisons).
drfrogsplat
39
Après avoir exécuté une application gourmande en mémoire, mes autres applications ne réagissent pas lorsque je les bascule, probablement en raison de leur permutation. Un moyen de dire au système de dé-échanger autant de données que possible (suivi d'une pause-café) serait préférable à l'attente de 20 secondes à chaque fois que je modifie Alt + Tab.
Mark K Cowan
425

Le noyau Linux sous-jacent Ubuntu "remplacera" automatiquement ces pages du disque vers la RAM selon les besoins, alors en général, je dirais que cela doit se faire naturellement.

Cependant, si vous sentez vraiment que vous devez le forcer (je vois un scénario dans lequel vous voudriez savoir que le système réagira plus tard), vous pouvez momentanément désactiver et réactiver le swap.

sudo swapoff -a
sudo swapon -a

OU alternativement comme une seule ligne

swapoff -a; swapon -a

Soyez prudent, car vous risqueriez de rendre votre système instable, surtout si sa mémoire vive est déjà insuffisante.

SpamapS
la source
8
Cela a fait le tour, l'échange a été copié à la RAM. Je suppose que vous devez simplement vous assurer d’avoir au moins la quantité d’échange utilisée comme bélier libre avant d’effectuer l’échange, n'est-ce pas?
jfoucher
12
L'échange n'a pas été copié dans la RAM. C'était simplement désactivé. Vous devez vous assurer que la boîte n'échange pas avant de le faire. Si vous le faites, le noyau verra la mémoire disparaître et OOM-Killer commencera probablement à supprimer les applications de manière arbitraire. Il n'y a aucune raison pour que vous ayez besoin de "nettoyer" le swap comme ça. (voir mon autre commentaire) :)
popey
51
En fait, l’échange est copié dans la RAM, ou plus exactement, les pages sont rééchant du disque vers la RAM avant que l’échange ne puisse être désactivé.
SpamapS
14
Les pages ne sont copiées dans la RAM que si un processus en a encore besoin. Parfois, une page échangée appartient à un processus déjà terminé et le noyau ne se soucie pas de retirer immédiatement ces pages de l'échange.
BrunoJCM
6
Cela devrait être la bonne réponse, car c'est le moyen de récupérer les pages échangées dans la RAM, puis de vider la mémoire d'échange
Alfonso Jiménez
144

Vous pouvez également définir votre valeur "swappiness" à partir de la valeur par défaut de 60. Ainsi, le swap ne deviendra pas si volumineux pour commencer. Pourquoi la valeur par défaut d’expédition est définie sur 60 alors que la valeur recommandée est 10 me laisse perplexe. De Ubuntu SwapFAQ :

Le paramètre par défaut dans Ubuntu est swappiness = 60. Réduire la valeur par défaut de swappiness améliorera probablement les performances globales pour une installation de bureau Ubuntu typique. Une valeur de swappiness = 10 est recommandée , mais n'hésitez pas à expérimenter.

En modifiant cette valeur sur 10 ou même sur 0, vous pouvez ajouter une augmentation de vitesse significative et perceptible à un système ancien avec un lecteur lent. Définir cette valeur sur 0 ne désactive pas l'échange pour les noyaux Linux 3.4 et inférieurs, mais avec la version 3.5+, vous voudrez utiliser la valeur 1 si vous souhaitez conserver le paramètre le plus bas *.

Je ne vois aucune raison de ne pas régler cette valeur sur 0, car tout ce qui arrive sur le disque est plus lent que la RAM. J'ai 8 cœurs virtuels, un SSD rapide et 8 Go de mémoire et mon échange est défini sur 0. À ce moment, j'ai 3 machines virtuelles en cours d'exécution, ma mémoire est utilisée de 7,1 Go sur 7,7 Go, mon échange utilisé est à seulement 576 Ko de 952MB et tous les systèmes fonctionnent correctement!

De Ubuntu SwapFAQ :

Le paramètre swappiness contrôle la tendance du noyau à déplacer les processus de la mémoire physique vers le disque de swap. Les disques étant beaucoup plus lents que la RAM, les temps de réponse du système et des applications peuvent être plus lents si les processus sont déplacés de manière trop agressive en dehors de la mémoire.

  1. le swappiness peut avoir une valeur comprise entre 0 et 100
  2. swappiness = 0 indique au noyau d'éviter d'écarter les processus de la mémoire physique le plus longtemps possible
  3. swappiness = 100 indique au noyau d'échanger de manière agressive les processus de la mémoire physique et de les déplacer vers le cache d'échange

Vous trouverez ci-dessous des instructions de base pour vérifier le swappiness, vider votre swap et ramener le swappiness à 0:

Pour vérifier la valeur de swappiness:

cat /proc/sys/vm/swappiness

Pour définir temporairement le swap sur 0 ( comme suggéré par SpamapS ):

Cela videra votre échange et transférera tout le swap dans la mémoire. Tout d’abord, assurez-vous de disposer de suffisamment de mémoire en consultant l’onglet Ressources de gnome-system-monitor, votre mémoire disponible devrait être supérieure à votre échange utilisé. Ce processus peut prendre un certain temps, utilisez gnome-system-monitor pour surveiller et vérifier les progrès.

sudo swapoff --all

Pour définir la nouvelle valeur sur 0:

sudo sysctl vm.swappiness=0 

Pour réactiver l'échange:

sudo swapon --all

Pour définir définitivement swappiness sur 0:

  1. sudoedit /etc/sysctl.conf
  2. Ajouter cette ligne vm.swappiness = 0
  3. sudo shutdown -r now # redémarrer le système

* Avec la version 3.5+ du noyau, le réglage de swappiness à 0 le désactive complètement et un réglage de 1 est recommandé si vous souhaitez utiliser l'algorithme de swappiness le plus bas. source: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

Elijah Lynn
la source
1
Je viens de mettre à jour la réponse pour inclure un moyen permanent de définir le swappiness. Pas sûr de savoir comment il a été tellement voté, je suppose que personne ne l’a testé.
Elijah Lynn
1
Plus de bonne lecture sur swappiness dans cette réponse => askubuntu.com/a/103916/11929
Elijah Lynn
3
Je ne sais pas si cela était disponible lorsque l'auteur a initialement publié la réponse, mais une valeur swappiness de "60" est en place pour les installations de serveur Ubuntu, car cet environnement a un ensemble de spécifications différent en matière de performances. help.ubuntu.com/community/…
Frito, le
1
Ce paramètre est très efficace pour contrôler la taille de l’échange. Mon système a 16G de RAM et 16G swap. Parfois, je cours sur des ordinateurs virtuels et certaines de mes applications sont remplacées. Lorsque je ferme les ordinateurs virtuels, l'utilisation de la RAM diminue, mais l'utilisation de l'échange reste la même et mon système est à la traîne lors du changement d'applications. Changer le swapiness a amélioré les performances pour moi.
Kapad
1
Cela devrait être la réponse acceptée vraiment. Explication détaillée du problème et de sa solution, ainsi que des liens et une solution pour conserver la mémoire Swap, mais aidez-la à garder le contrôle dès le départ. Des trucs géniaux. Merci. :)
Jack_Hu
53

J'ai constaté que le vidage de la permutation peut être très utile sur les systèmes dotés de disques lents et de RAM limitée. Bien sûr, comme déjà mentionné, la façon de faire est de courir sudo swapoff -a; sudo swapon -a. Le problème ici est que si la RAM est insuffisante, cela causera toutes sortes de problèmes.

J'ai écrit un script que j'appelle toggle_swapqui a fonctionné pour moi ces dernières années. Il vérifie qu'il reste suffisamment de RAM avant de désactiver le swap. C'est ici:

#!/bin/bash

free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
Scott Severance
la source
Génial je cherchais quelque chose comme ça. Peut-être que pour être un peu plus en sécurité, vous pourriez présenter le nombre et les pourcentages, puis demander, juste pour être absolument sûr.
Atherion
2
J'ai mis à jour le code et créé une base de données gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c
Jekis
C’est la conclusion à laquelle j’ai abouti après avoir lu tous les conseils, comme il faut s’assurer qu’il ya suffisamment de RAM avant de tuer le swap. Merci monsieur, script merveilleux. Devrait être inclus dans Ubuntu par défaut (je ne plaisante pas, c'est vraiment un must.)
Apache
Sauf que si vous lancez une nouvelle chose en désactivant l'échange, et avant de la réactiver, elle n'aura pas assez de mémoire.
barteks2x
Cela dépend de combien de mémoire libre vous avez. S'il y a assez de mémoire libre pour tout stocker dans le swap ET le nouveau processus, il n'y a pas de problème. Sinon, vous avez raison.
Scott Severance
25

Après avoir passé du bon temps à balayer quelques jours, je suis parvenu à la conclusion que le noyau devrait être laissé à lui-même. Il sait ce qu'il fait et il est optimisé pour vous offrir la meilleure expérience.

À moins que vous ayez une très bonne raison de vouloir récupérer ce disque, je le laisserais.

Erigami
la source
2
Vmstat m'a montré que swapin et swapout se passaient, et Chrome était lent, alors que mon processeur était à peine utilisé. Assez bonne raison, non?
Xerus
Il y a certainement des cas où certaines permutations sur le bureau la rendent lente. (pas pendant la permutation, mais aussi après, quand il y a assez de RAM, longtemps après.) Donc, au mieux, cette réponse n'est qu'une expérience subjective qui se produit dans certains cas.
Cray
-1

Les performances ne sont pas affectées si votre espace d'échange est occupé. La seule pénalité de performance est que les choses entrent / sortent du swap. Si rien n'est échangé / échangé, vous n'avez à vous soucier de rien.

Rory
la source
10
Oui , mais si quelque chose est en cours , il a troqué n'affecte les performances, d' où cette question.
quant
C’est vraiment absurde. Habituellement, les gros échanges de remplacement se font sur des disques durs ou sur un périphérique plus lent que la RAM. Si l’espace est épuisé, les éléments existants sont remplacés, comme le navigateur Internet, et vous l’utilisez pratiquement à partir d’un périphérique plus lent. ..
jave.web