web-dev-qa-db-fra.com

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

Lorsque j'ouvre une application nécessitant 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à.

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

Par exemple, à l'heure actuelle, environ deux heures après la fermeture de VirtualBox, j'ai 1,6 Go d'espace disque disponible RAM et 770 Mo en échange.

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

304
jfoucher

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 commande vmstatname__. Laissez-le fonctionner quelques secondes pour vous calmer et observez les colonnes si(swapin) et so(swapout). Si rien ne se passe, il n'y a aucune raison d'être inquiet.

Voici le résultat de l'exécution de vmstat 1, où vous pouvez voir que ma machine ne permute 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, dans topvous pouvez voir que l’espace de swap est alloué: -

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

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

Cependant, si vous estimez vraiment que vous devez le forcer (je vois un scénario dans lequel vous voudriez savoir que le système sera réactif ultérieurement), vous pouvez momentanément désactiver et réactiver le swap.

Sudo swapoff -a
Sudo swapon -a

OU alternativement en une seule commande

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.

401
SpamapS

Vous pouvez également définir votre valeur "swappiness" à partir de la valeur par défaut de 60. Ainsi, le swap ne deviendra pas si gros pour commencer. Pourquoi la livraison par défaut 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. 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 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 le swap 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, mon utilisation de mémoire est de 7.1 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 changer le swappiness en 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 ):

Ceci videra votre échange et transférera tous les échanges en mémoire. Tout d’abord, assurez-vous que vous avez assez de mémoire disponible 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/

140
Elijah Lynn

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 cela a déjà été mentionné, la manière de procéder consiste à exécuter 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_swap qui a fonctionné pour moi ces dernières années. Il vérifie qu'il y a suffisamment de mémoire libre 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
52
Scott Severance

Après avoir passé du temps avec swappiness pendant deux jours, je suis parvenu à la conclusion que le noyau devait être laissé à lui-même. Il sait ce qu'il fait et 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.

26
Erigami

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.

0
Rory