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), de l'espace d'échange est généralement utilisé, en fonction de ce que j'ai ouvert en même temps.

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

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 à l'utilisation de la RAM ?

1 votes

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

9 votes

Grosse hypothèse que repopuler 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 ait été nécessaire, rendant ainsi votre système beaucoup plus lent en se basant sur le fichier de swap 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 d'Ubuntu va automatiquement "échanger" ces pages du disque vers la RAM au besoin, donc en général je dirais simplement de laisser faire naturellement.

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

sudo swapoff -a
sudo swapon -a

Ou alternativement sur une seule ligne

sudo swapoff -a; sudo swapon -a

Soyez prudent en faisant cela, car vous pourriez rendre votre système instable, surtout s'il est déjà faible en 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 comme mémoire libre avant d'exécuter swapoff, n'est-ce pas ?

13 votes

L'échange 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 d'échange avant de faire cela. Si vous le faites, 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 » l'échange de cette manière. (voir mon autre commentaire) :)

66 votes

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

213voto

rossp Points 900

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

Pour savoir si des échanges sont effectués, vous pouvez utiliser la commande vmstat. Laissez-la s'exécuter quelques secondes pour se stabiliser et surveillez les colonnes si (swapin) et so (swapout). S'il ne se passe rien, il n'y a pas de quoi 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'au moment où je continue à utiliser une application qui a été échangée. alors tout l'enfer se déchaîne.

284 votes

Ce message ne répond pas à la question.

23 votes

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

174voto

Elijah Lynn Points 3577

Vous pouvez également définir votre valeur "swappiness" à autre chose que la valeur par défaut de 60, de cette façon, l'échange ne deviendra pas si grand dès le départ. Pourquoi la valeur par défaut est-elle définie sur 60 alors que la valeur recommandée est de 10 me laisse perplexe. De la FAQ d'échange Ubuntu:

Le paramètre par défaut dans Ubuntu est swappiness=60. La réduction de 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 gain de vitesse significatif et perceptible à un ancien système doté d'un disque lent. Définir cette valeur sur 0 n'éteint pas l'échange pour le noyau Linux 3.4 et inférieur, mais avec 3.5+ il le fait, vous voudrez donc utiliser une valeur de 1 si vous souhaitez le maintenir à son niveau le plus bas*.

Je ne vois aucune raison de ne pas définir cela sur 0 étant donné que tout ce qui passe par 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 d'échange Ubuntu:

Le paramètre de swappiness contrôle la propension du noyau à déplacer des processus de la mémoire physique vers le disque d'échange. Comme les disques sont bien 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 trop agressivement déplacés de la mémoire.

  1. swappiness peut avoir une valeur comprise entre 0 et 100
  2. swappiness=0 indique au noyau d'éviter le déplacement des processus de la mémoire physique aussi longtemps que possible
  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

Voici des instructions de base pour vérifier le swappiness, vider votre échange et changer le swappiness en 0 :

Pour vérifier la valeur de swappiness :

cat /proc/sys/vm/swappiness

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

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

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 la swappiness sur 0 :

  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+, la définition de swappiness à 0 l'éteint entièrement et une valeur de 1 est recommandée si vous souhaitez 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 inclure un moyen permanent de définir la swappiness. Je ne suis pas sûr de savoir comment elle a été autant upvotée, je suppose que personne ne l'a testée.

1 votes

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

0 votes

Ajouté une note sur 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 la mémoire swap peut beaucoup aider sur les systèmes avec des disques lents et de la RAM limitée. Bien sûr, comme déjà mentionné, la manière 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 suffisamment de RAM libre avant de désactiver réellement la 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ée:\t$used_swap ko ($((used_swap / 1024)) Mo)"
if [[ $used_swap -eq 0 ]]; then
    echo "Félicitations! Aucune swap n'est en cours d'utilisation."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Libération de la 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 numéro et les pourcentages, puis demander, juste pour être absolument sûr.

3 votes

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

0 votes

Voici la conclusion à laquelle je suis parvenu après avoir lu tous les conseils, comme quoi il faut d'une manière ou d'une autre s'assurer qu'il y a assez de RAM avant de tuer le swap. Merci monsieur, superbe script. Devrait être inclus par défaut dans Ubuntu (je ne plaisante pas, c'est vraiment un indispensable.)

26voto

Sam Warwick Points 121

Après avoir bidouillé avec swappiness pendant quelques jours, j'en suis arrivé à 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 tel quel.

7 votes

J'avais quelques choses en swap, vmstat m'a montré que le swapin et le swapout se produisaient, et Chrome était extrêmement lent, alors que mon CPU était à peine utilisé. Assez bonne raison, non?

1 votes

Il existe certainement des cas où certains échanges sur un ordinateur de bureau le rendent lent. (pas pendant l'échange lui-même, mais aussi après, lorsqu'il y a suffisamment de RAM, pendant longtemps après.) Ainsi, au mieux, cette réponse n'est que l'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