Pourquoi est-ce que swap est utilisé alors que j'ai beaucoup de RAM libre?

208

Je pensais que l’essence même du swap était d’agir en tant que filet de sécurité du stockage temporaire lorsque la mémoire RAM était saturée, mais ma partition d’échange est utilisée en permanence, même si j’ai parfois jusqu’à 3 Go de RAM libre. Est-ce normal?

Mysterio
la source
3
S'il vous plaît partager le contenu ou la sortie des commandes / fichiers suivants pour mieux nous aider à résoudre votre problème ( instructions dans cette réponse ) : free -m,top -b 1
ish
Mettra à jour la question avec les pastebins de ces commandes demain. Il est 12 heures maintenant :(
Mysterio
Je devrais modifier le titre pour ajouter "... mais je suis trop fatigué pour m'en occuper pour le moment, alors vous aussi faites une sieste": P
ish

Réponses:

188

Vous pouvez essayer de changer votre valeur "swappiness":

De la FAQ sur l'échange sur Ubuntu :

Qu'est-ce que swappiness et comment puis-je le changer?

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. Pour les versions 3.5 et supérieures du noyau, cette option désactive la permutation.

  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

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. Remarque: les installations de serveur Ubuntu ont des exigences de performances différentes de celles des systèmes de bureau, et la valeur par défaut de 60 convient probablement mieux.

Pour vérifier la valeur de swappiness

cat /proc/sys/vm/swappiness

Pour changer la valeur de swappiness Une modification temporaire (perdue au redémarrage) avec une valeur de swappiness de 10 peut être effectuée avec

sudo sysctl vm.swappiness=10

Pour rendre une modification permanente , éditez le fichier de configuration avec votre éditeur favori:

gksudo gedit /etc/sysctl.conf

Recherchez vm.swappiness et changez sa valeur comme vous le souhaitez. Si vm.swappiness n'existe pas, ajoutez-le à la fin du fichier comme suit:

vm.swappiness=10

Enregistrez le fichier et redémarrez.

Aussi, vous pouvez vérifier: https://askubuntu.com/a/103916/54187

Jpetersen
la source
1
Spéculation d'inactivité: cela pourrait en réalité être bénéfique pour les performances: les pages inutilisées depuis un moment peuvent être copiées dans un espace d'échange, ce qui permet au système d'exploitation de les supprimer rapidement s'il a besoin de mémoire, mais le contenu de la page reste en mémoire. .
Simon Richter
7
@SimonRichter Oui, c'est l'idée. Le swappiness of 60 est probablement trop agressif sur les systèmes modernes, car cela signifie que vous commencez à échanger alors que vous avez encore plusieurs Go de mémoire libre.
Brendan Long
1
Exécuter sudo sysctl --load=/etc/sysctl.confaprès modification du fichier pour appliquer les modifications
deFreitas
92

Votre question comporte différents aspects.

Premièrement, quelle est votre définition du terme "gratuit"? En réalité, ce n’est pas aussi simple que cela puisse paraître sous Linux (ou tout système d’exploitation moderne).

Comment Linux utilise la RAM (très simplifié)

Chaque application peut utiliser une partie de votre mémoire. Linux utilise toute la mémoire autrement inoccupée (à l'exception des derniers Mo) en tant que "cache". Cela inclut le cache de page, les caches d’inodes, etc. C’est une bonne chose: cela permet d’accélérer les choses. L'écriture sur le disque et la lecture à partir du disque peuvent être accélérées énormément par le cache.

Idéalement, vous avez suffisamment de mémoire pour toutes vos applications et il vous reste encore plusieurs centaines de Mo à mettre en cache. Dans cette situation, tant que vos applications n'augmentent pas l'utilisation de la mémoire et que le système ne cherche pas à obtenir suffisamment d'espace pour le cache, aucun échange n'est nécessaire.

Une fois que les applications réclament plus de RAM, elles accèdent simplement à une partie de l'espace utilisé par le cache, ce qui réduit le cache. Désaffecter le cache est assez simple et peu coûteux pour que ce soit tout simplement fait en temps réel: tout ce qui se trouve dans le cache est soit une seconde copie de quelque chose qui est déjà sur le disque, alors vous pouvez simplement le désallouer instantanément, ou c'est quelque chose que nous aimerions. ont dû vider le disque dans quelques secondes de toute façon .

Ce n'est pas une situation spécifique à Linux - tous les systèmes d'exploitation modernes fonctionnent de cette façon. Les différents systèmes d'exploitation peuvent simplement signaler la RAM libre différemment: certains incluent le cache dans ce qu'ils considèrent comme "libre" et d'autres pas.

Lorsque vous parlez de RAM libre, il est beaucoup plus utile d’ inclure le cache, car il est pratiquement gratuit: il est disponible si une application le demande. Sous Linux, la freecommande l'indique dans les deux sens: la première ligne inclut le cache dans la colonne RAM utilisée, et la deuxième ligne comprend le cache (et les tampons) dans la colonne libre.

Comment Linux utilise le swap (encore plus simplifié)

Une fois que vous avez utilisé suffisamment de mémoire pour qu'il ne reste plus assez de cache pour un cache en bon fonctionnement, Linux peut décider de réaffecter une partie de la mémoire d'application non utilisée de la RAM à permuter.

Cela ne correspond pas à une coupure définitive. Ce n'est pas comme si vous atteigniez un certain pourcentage d'allocation, alors Linux commence à permuter. Il a un algorithme plutôt "flou". Il prend en compte de nombreux éléments, qui peuvent être décrits de la manière suivante: "quelle pression existe-t-il pour l'allocation de mémoire". S'il y a beaucoup de "pression" pour allouer une nouvelle mémoire, cela augmentera les chances que certaines personnes soient permutées pour gagner de la place. S'il y a moins de "pression", cela réduira ces chances.

Votre système possède un paramètre "swappiness" qui vous aide à modifier le calcul de cette "pression". Il est généralement déconseillé de modifier cela, et je ne vous recommanderais pas de le modifier. Dans l’ensemble, la permutation est une très bonne chose - bien qu’il existe quelques cas extrêmes qui nuisent aux performances, si vous examinez les performances globales du système, c’est un avantage net pour un large éventail de tâches. Si vous réduisez le swappiness, vous laissez la quantité de mémoire cache diminuer un peu plus que ce ne serait le cas autrement, même si cela peut vraiment être utile. Il vous appartient de décider si cela vous convient, quel que soit le problème que vous rencontrez avec la permutation. Vous devriez juste savoir ce que vous faites, c'est tout.

Il existe une situation bien connue dans laquelle le swap nuit réellement aux performances perçues sur un ordinateur de bureau. Il s’agit de la rapidité avec laquelle les applications peuvent à nouveau réagir à la saisie de l’utilisateur après une longue période d'inactivité et des processus d'arrière-plan lourds en IO (comme une sauvegarde du jour au lendemain). Il s’agit d’une lenteur très visible, mais insuffisante pour justifier la désactivation de l’échange de swap et très difficile à éviter sous n’importe quel système d’exploitation. Désactivez l'échange et cette lenteur initiale après l'analyse de sauvegarde / virus ne se produira peut-être pas, mais le système risque de fonctionner un peu plus lentement toute la journée. Ce n’est pas non plus une situation limitée à Linux.

Lors du choix de ce qui doit être échangé sur le disque, le système essaie de choisir la mémoire qui n'est pas réellement utilisée - lue ou écrite. Il a un algorithme assez simple pour calculer cela qui choisit bien la plupart du temps.

Si vous avez un système où vous avez une énorme quantité de RAM (au moment de l'écriture, 8 Go est une quantité énorme pour une distribution Linux typique), vous aurez très rarement recours à une situation dans laquelle un échange est absolument nécessaire. Vous pouvez même essayer de désactiver le swap. Je ne recommande jamais de le faire, mais uniquement parce que vous ne savez jamais quand davantage de mémoire RAM pourrait vous éviter un blocage d'application. Mais si vous savez que vous n'en aurez pas besoin, vous pouvez le faire.

Mais comment l'échange peut-il accélérer mon système? L'échange ne ralentit-il pas les choses?

Le transfert de données de la RAM vers l’échange est une opération lente, mais elle n’est prise que lorsque le noyau est pratiquement certain que les avantages globaux l’emporteront. Par exemple, si la mémoire de votre application a atteint un niveau tel qu'il ne vous reste presque plus de cache et que vos E / S sont très inefficaces, vous pouvez obtenir beaucoup plus de vitesse de votre système en libérant de la mémoire, même après la dépense initiale de permutation des données afin de les libérer.

C'est également un dernier recours si vos applications demandent réellement plus de mémoire que vous n'en avez réellement. Dans ce cas, la permutation est nécessaire pour éviter une insuffisance de mémoire, ce qui entraînerait souvent le blocage d'une application ou son exécution forcée.

L’échange n’est associé qu’à des moments où votre système ne fonctionne pas bien, car il se produit parfois lorsque vous manquez de RAM utilisable, ce qui ralentirait votre système (ou le rendrait instable) même si vous n’aviez pas d’échange. Donc, pour simplifier les choses, l’échange se produit parce que votre système est en train de s’embourber, et non l’inverse.

Une fois les données échangées, quand les données sont-elles à nouveau publiées?

Transférer des données en mode swap est (du moins pour les disques durs traditionnels) aussi fastidieux que de les stocker. Il va donc de soi que votre noyau sera tout aussi réticent à supprimer des données de l’échange, en particulier si elles ne sont pas réellement utilisées (c’est-à-dire qu'elles sont lues ou écrites). Si vous avez des données en swap et qu'elles ne sont pas utilisées, c'est une bonne chose qu'elles restent en swap, car elles laissent plus de mémoire pour d'autres éléments utilisés, ce qui peut potentiellement accélérer votre système.

thomasrutter
la source
5
+1 pour une explication détaillée. J'aime aussi garder 2GiB swap sur mes ordinateurs. Si quelque chose ne va pas - fuites de mémoire, etc., vous pouvez alors voir le swap augmenter et rechercher le problème avant que la mémoire ne soit saturée. C'est un filet de sécurité et un outil de performance.
Joe
1
Sur mon netbook, qui ne dispose que de 2 Go de RAM, je conserve 4 Go de swap. C'est parce que j'utilise le netbook pour bien plus que ce à quoi il était destiné et que mes programmes nécessitent souvent plus de 2 Go de mémoire. Étant donné que Linux se comporte très mal dans les situations de mémoire insuffisante, je préfère avoir un filet de sécurité important. Et j'ai beaucoup d'espace disque.
Scott Severance
Si vos programmes requièrent fréquemment plus de 2 Go de mémoire, je vous conseillerais de mettre plus de RAM (c'est ultra-économique!), Car l'épuisement de la mémoire vive nuirait aux performances. Pour le bénéfice des autres lecteurs: veillez à ne pas uniquement regarder dans la mémoire cache, qui est supposée absorber la mémoire RAM disponible - consultez les autres références free -m.
thomasrutter
2
@neon_overload: Je dois noter que, selon HP, la RAM maximale de mon netbook est de 1 Go. J'ai 2 Go ici, et des sources Internet suggèrent que 2 Go est le maximum actuel. Ainsi, la nécessité de ce type de solutions de contournement.
Scott Severance
@thomasrutter: en quoi votre réponse change-t-elle pour les gros serveurs, l'un des miens a 1 To (oui, un téraoctet complet) de RAM et utilise encore le swap; quel paramètre swappiness et quelle taille de partition swap recommanderiez-vous?
chrisinmtown
24

Définir la valeur de swappiness ne fonctionne pas dans toutes les situations. Si cela fonctionne pour vous, tant mieux. Si ce n'est pas le cas, j'ai écrit un script pour effacer périodiquement l'échange en le désactivant puis le rallumant.

Basculer swap est un peu risqué si vous ne faites pas attention. Si vous ne disposez pas de suffisamment de RAM libre pour tout stocker dans la RAM et dans le swap, essayer de le désactiver rendra votre système inactif. Mon script vérifie d'abord s'il y a assez de RAM disponible (ce qui prend un peu de travail, car la quantité réelle de RAM libre est différente de celle qui est freesignalée comme étant libre), puis ne bascule que le swap si c'est le cas. Toutefois, si vous êtes un peu à court de RAM, ne démarrez pas un autre processus important pendant l'exécution du script. C'est ici:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
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)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Vous devez exécuter ce script en tant que root (avec, par exemple sudo). Ce script ne laissera pas votre système inactif; Si vous ne disposez pas de suffisamment de RAM, il refusera le basculement. J'ai utilisé ce script sans problèmes pendant près de cinq ans maintenant.

Scott Severance
la source
+1 pour le script. Vous voudrez peut-être un peu la moderniser en modifiant MB en MiB dans les sorties. J'ai écrit un script similaire sans tous les (bons) tests de sécurité que vous avez inclus. Sur mon vieux cahier où le swap était très utilisé, il faudrait un certain temps pour courir - une minute ou deux, mais ça ne faisait pas mal. De temps en temps, cela échouait car il n'y avait pas assez de mémoire libre pour fonctionner, mais cela ne causait pas de problèmes supplémentaires. Je devais redémarrer pour clarifier les choses lorsque cela se produisait. Cela avait à voir avec ce qui ressemblait à une fuite de mémoire dans Transmission (depuis corrigé, je crois) et de ne disposer que de 2 Go de RAM.
Joe
6
Si quelque chose a été déplacé pour être échangé et qu'il reste échangé, c'est généralement une bonne chose: cela signifie que les données ne sont pas réellement utilisées et que cela libère une partie de votre RAM pour d'autres éléments, ce qui peut potentiellement augmenter la vitesse. Qu'est-ce qui vous a amené à penser que ces données ne devraient pas être échangées mais occuper davantage de RAM précieuse? Habituellement, le noyau sait assez bien ce qui n’est pas utilisé et ce qui peut rester sans risque en permutation pour libérer de la RAM.
thomasrutter
@neon: N'oubliez pas que mes machines ont respectivement 2 Go et 3 Go de RAM, ce qui est peu de nos jours. La preuve est en cours d'exécution. Par exemple, il peut être lent de permuter les menus ou de changer de programme, tout comme les effets Composite. Cette lenteur est corrigée en basculant le swap, démontrant ainsi qu'au moins dans certaines situations, les algorithmes d'optimisation du noyau sont sous-optimaux. Je ne peux pas discuter avec l'expérience répétée.
Scott Severance
Phew!! Cela a simplement réduit à 0% le swap ... Je n'ai pas eu beaucoup de temps pour examiner cette question complète et sa réponse, mais je l'ai favorisée pour la lire lorsque j'ai un peu de temps libre.
AzkerM
Pourquoi ne pas simplement définir swappiness à une valeur basse? Cela semblerait faire la même chose que votre script, mais de manière beaucoup plus contrôlée.
Jhfrontz
4

En général, l’échange reste inutilisé sur les systèmes actuels. D'après mon expérience, les processus qui s'exécutent depuis longtemps sans opérations intensives sont décalés pour être échangés par Linux.
Cela ralentit quelques programmes affectés.
Si vous avez beaucoup de mémoire libre, vous pouvez désactiver le swap en exécutant la commande:
swapoff -av(vous aurez besoin de sudodroits pour cela).
Si vous n'aimez pas le swap, vous pouvez l'activer en utilisant la commande symétrique:
swapon -av( à nouveau sudorequis).

drake01
la source
12
Désactiver entièrement le swap est excessif puisque swapiness = 0 fait la même chose, mais en toute sécurité (si vous vous retrouvez avec trop de choses en mémoire, cela jettera quelque chose dans swap).
Brendan Long
@BrendanLong Fair point .. Merci de m'apprendre. :)
drake01
3

Une fois que l'échange a été utilisé pour un programme, il a tendance à rester mappé pendant toute la durée de vie du programme. De nombreux programmes ont un code (et des données) qui est rarement utilisé. Une fois que la mémoire est remplacée, il est peu probable qu’elle le soit.

Une façon de forcer ces pages en mémoire consiste à éteindre le périphérique d'échange. Si vous en avez deux, vous pouvez en désactiver un, le réactiver, puis éteindre le second. Si un échange est vraiment nécessaire, il se déplacera d'un périphérique à l'autre. Vous pouvez simplement désactiver le périphérique (ou le fichier) swap, mais si vous avez vraiment besoin d'espace swap, des conséquences dramatiques peuvent survenir.

En plus des choses normales en mémoire, tempfs utilise l’espace d’échange et s’échange comme le reste de la mémoire. Si vous exécutez quelque chose qui nécessite beaucoup de disque temporaire, cela peut forcer le remplacement des pages. Une fois créés, les fichiers temporaires ne peuvent plus être utilisés après quelques minutes et sont de bons candidats pour être déplacés vers le périphérique de swap.

Dans un pincement, vous pouvez utiliser un fichier comme périphérique de swap. Ceci est utile si vous avez besoin temporairement d'un espace d'échange supplémentaire.

BillThor
la source
2

J'ai modifié le script de Scott Severance pour qu'il corresponde aux versions les plus récentes de free, qui incluent déjà un champ de mémoire totale disponible.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
derberlinersmurf
la source