432 votes

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

Lorsque j'ouvre une application intensive en RAM (VirtualBox configuré à 2 Go de RAM), une partie de l'espace d'échange est généralement utilisée, en fonction de ce que j'ai d'autre d'ouvert à ce moment-là.

Cependant, lorsque je quitte cette dernière application, les 2 Go de RAM sont libérés, mais l'utilisation du même espace d'échange reste inchangée.

Par exemple, en ce moment, environ deux heures après avoir fermé VirtualBox, j'ai 1,6 Go de RAM libre et toujours 770 Mo en swap.

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

1 votes

La chose la plus simple redémarrer votre appareil et économiser du temps de copie dans la RAM et libérer la RAM économise de l'énergie de l'ordinateur portable et la température du processeur

9 votes

Grande supposition que reconstituer toutes les données sur votre ordinateur prend moins de temps que cela.

3 votes

Ubuntu 16.04, au moins, peut continuer à utiliser le swap longtemps après qu'il ne soit nécessaire, rendant ainsi votre système beaucoup plus lent en se basant sur le fichier d'échange même s'il n'est plus nécessaire. L'intervention manuelle peut donc être utile. Redémarrer n'est pas toujours une option.

621voto

Jeremy Ruten Points 59989

Le noyau Linux sous-jacent à Ubuntu va automatiquement "swapper" ces pages du disque vers la RAM au besoin, donc en général je dirais juste laissez faire naturellement.

Cependant, si vous sentez vraiment que vous avez besoin de forcer cela, (je peux imaginer un scénario où vous voudriez savoir que le système sera réactif plus tard) vous pouvez momentanément désactiver et réactiver le swap

sudo swapoff -a
sudo swapon -a

Ou bien en une seule ligne

sudo swapoff -a; sudo swapon -a

Faites attention en faisant cela, car vous pourriez rendre votre système instable, surtout s'il manque déjà de RAM.

10 votes

Cela a fonctionné, l'échange a été copié dans la RAM. Je suppose qu'il suffit de s'assurer d'avoir au moins la quantité de swap utilisée en tant que RAM libre avant d'exécuter swapoff, n'est-ce pas?

13 votes

Le swap n'a pas été copié dans la RAM. Il a simplement été désactivé. Vous devriez vous assurer que la boîte ne fait pas de swap avant de le faire. Si vous le faites, alors le noyau verra la mémoire disparaître et l'OOM-Killer commencera probablement à tuer des applications de manière arbitraire. Il n'y a aucune raison pour laquelle vous devriez avoir besoin de 'nettoyer' le swap de cette manière. (voir mon autre commentaire) :)

66 votes

En fait, l'échange de données est, essentiellement, copié dans la RAM, ou plus précisément, les pages sont échangées de retour du disque à la RAM avant que l'échange puisse être désactivé.

213voto

rossp Points 900

Juste parce que l'espace d'échange est alloué, cela ne signifie pas qu'il est utilisé. Alors que des programmes comme le moniteur système et top afficheront une partie de votre espace d'échange alloué (dans votre exemple 770 Mo), cela ne signifie pas que le système effectue activement des échanges.

Pour savoir si des échanges sont en cours, vous pouvez utiliser la commande vmstat. Laissez-la s'exécuter pendant quelques secondes pour se stabiliser et surveillez les colonnes si (entrée d'échange) et so (sortie d'échange). S'il ne se passe rien, il n'y a aucune raison de s'inquiéter.

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

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 dans top vous pouvez voir que j'ai de l'espace d'échange alloué :

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached

54 votes

"aucune raison de s'inquiéter", jusqu'à ce que je continue à utiliser une application qui a été remplacée. alors tout l'enfer se déchaîne.

284 votes

Ce post ne répond pas à la question.

23 votes

La prémisse de la question est basée sur des idées fausses. Ce post aborde les idées fausses.

174voto

Elijah Lynn Points 3577

Vous pouvez également définir votre valeur "swappiness" par défaut de 60, de cette manière, l'échange ne deviendra pas si grand à l'origine. Pourquoi la valeur par défaut de l'expédition est définie à 60 alors que la valeur recommandée est de 10 me laisse perplexe. De la FAQ sur l'échange d'Ubuntu:

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 changeant cette valeur à 10 ou même 0, vous pouvez ajouter un boost de vitesse significatif et perceptible à un ancien système avec un lecteur lent. Définir cette valeur à 0 n'éteint pas l'échange pour le noyau Linux 3.4 et inférieur, mais avec 3.5+ c'est le cas, donc vous voudrez utiliser une valeur de 1 si vous voulez le maintenir à son réglage le plus bas*.

Je ne vois aucune raison de ne pas définir ceci à 0 puisque tout ce qui va 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. En ce moment, j'ai 3 machines virtuelles en cours d'exécution, mon utilisation de mémoire est de 7,1 sur 7,7 Go, mon échange utilisé est seulement de 576 Ko sur 952 Mo et tous les systèmes fonctionnent parfaitement!

De la FAQ sur l'échange d'Ubuntu:

Le paramètre swappiness contrôle la tendance du noyau à déplacer les processus de la mémoire physique vers le disque d'échange. Comme les disques sont beaucoup plus lents que la RAM, cela peut entraîner des temps de réponse plus lents pour le système et les applications si les processus sont déplacés trop agressivement hors de la mémoire.

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

Ci-dessous sont des instructions de base pour vérifier le swappiness, vider votre échange et changer le swappiness à 0:

Pour vérifier la valeur de swappiness:

cat /proc/sys/vm/swappiness

Pour définir temporairement l'échange à 0 (comme suggéré par SpamapS):

Cela videra votre échange et transférera tout l'échange en mémoire. Assurez-vous d'avoir suffisamment de mémoire disponible en consultant l'onglet des ressources de l'observateur système GNOME, votre mémoire libre doit être supérieure à votre échange utilisé. Ce processus peut prendre un certain temps, utilisez l'observateur système GNOME pour surveiller et vérifier la progression.

sudo swapoff --all

Pour définir la nouvelle valeur à 0:

sudo sysctl vm.swappiness=0 

Pour réactiver l'échange:

sudo swapon --all

Pour définir le swappiness sur 0 de manière permanente:

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

* Avec la version du noyau 3.5+, définir swappiness sur 0 l'éteint entièrement et une valeur de 1 est recommandée si vous voulez l'algorithme de swappiness le plus bas. source: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

2 votes

Je viens de mettre à jour la réponse pour y inclure une façon permanente de définir la swappiness. Je ne suis pas sûr comment il a eu autant de votes positifs, je suppose que personne ne l'a testé.

1 votes

Plus de bonnes lectures sur la swappiness dans cette réponse => askubuntu.com/a/103916/11929

0 votes

Ajouté une note concernant le comportement de swappiness=0 qui change avec la version du noyau Linux 3.5+.

57voto

Scott Severance Points 13166

J'ai trouvé que vider le swap peut aider beaucoup sur les systèmes avec des disques lents et une RAM limitée. Bien sûr, comme déjà mentionné, la façon de le faire est d'exécuter sudo swapoff -a; sudo swapon -a. Le problème ici est que s'il n'y a pas assez de RAM, le faire causera toutes sortes de problèmes.

J'ai écrit un script que j'appelle toggle_swap qui a fonctionné pour moi au cours des dernières années. Il vérifie s'il y a assez de RAM libre avant de désactiver réellement le swap. Le voici :

#!/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 "Mémoire libre:\t$total_free ko ($((total_free / 1024)) Mo)\nSwap utilisé:\t$used_swap ko ($((used_swap / 1024)) Mo)"
if [[ $used_swap -eq 0 ]]; then
    echo "Félicitations! Aucun swap n'est utilisé."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Libération du swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Pas assez de mémoire libre. Sortie."
    exit 1
fi

0 votes

Génial, je cherchais quelque chose comme ça. Peut-être pour être un peu plus sûr, vous pourriez présenter le nombre et les pourcentages, puis demander, juste pour être absolument sûr.

3 votes

J'ai mis à jour le code et ai créé un extrait basé sur gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c

0 votes

Ceci est la conclusion à laquelle je suis arrivé après avoir lu tous les conseils, comme on devrait d'une certaine manière s'assurer qu'il y a suffisamment de RAM avant de tuer le swap. Merci monsieur, merveilleux script. Devrait être inclus par défaut dans Ubuntu (je ne plaisante pas, c'est vraiment indispensable.)

26voto

Sam Warwick Points 121

Après avoir chipoté avec swappiness pendant quelques jours, j'en suis venu à la conclusion que le kernel devrait être laissé à ses propres choix. Il sait ce qu'il fait, et il est optimisé pour vous offrir la meilleure expérience.

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

7 votes

J'avais quelques éléments en échange, vmstat m'a montré que des swapin et swapout se produisaient, et Chrome était lent à mourir, alors que mon processeur était à peine utilisé. Une raison suffisante, n'est-ce pas?

1 votes

Il y a certainement des cas où certains échanges sur ordinateur de bureau le rendent lent. (pas pendant l'échange, mais aussi après, quand il y a assez de RAM, pendant longtemps après.) Donc au mieux, cette réponse n'est qu'une expérience subjective qui se produit dans certains cas.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X