web-dev-qa-db-fra.com

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

Je pensais que l’essence même du swap était de servir de filet de sécurité pour le stockage temporaire lorsque RAM était pleine, mais ma partition d’échange est constamment utilisée même si j’ai parfois jusqu’à 3 Go de RAM libre. Est-ce normal?

198
Mysterio

Vous pouvez essayer de changer votre valeur "swappiness":

De la FAQ sur l'échange de Ubunt :

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 de remplacer 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 davantage.

Pour vérifier la valeur de swappiness

cat /proc/sys/vm/swappiness

Pour modifier 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

176
jpetersen

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 RAM (très simplifié)

Chaque application peut utiliser une partie de votre mémoire. Linux utilise toute la mémoire autrement inoccupée (sauf les 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 peine pas à disposer de 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. La suppression de l'allocation de cache est assez simple et peu coûteuse pour être effectuée simplement en temps réel. Tout ce qui se trouve dans le cache est simplement une seconde copie d'un élément déjà présent sur le disque. Vous pouvez donc le désallouer instantanément, ou c'est quelque chose que nous souhaiterions. ont dû vider le disque dans les prochaines 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 différemment RAM libre différemment: certains incluent le cache dans le cadre de ce qu'ils considèrent comme "libre" et d'autres non.

Lorsque vous parlez de RAM libre, le cache include est beaucoup plus significatif, car il est pratiquement gratuit - il est disponible si une application le demande. Sous Linux, la commande free 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 de la mémoire d'application inutilisée de 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 dispose d’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 d’Edge 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 être réellement 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 en arrière-plan très chargés IO (telle qu'une sauvegarde pendant la nuit). Il s’agit d’une lenteur très visible, mais insuffisante pour justifier la désactivation de la permutation 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.

Lorsqu'il choisit ce qui doit être échangé sur le disque, le système essaie de choisir une 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 sur lequel vous avez une énorme quantité de RAM (au moment de l'écriture, 8 Go est une quantité énorme pour une distribution Linux typique), vous rencontrerez très rarement 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 seulement parce que vous ne savez jamais quand plus RAM peut vous sauver de certaines applications. Mais si vous savez que vous n’allez pas en avoir 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 RAM vers swap est une opération lente, mais elle n’est prise que lorsque le noyau est à peu près 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 est uniquement associé aux moments où votre système fonctionne mal, car cela se produit parfois lorsque vous manquez de RAM utilisable, ce qui ralentirait votre système (ou le rendait instable). même si vous n'aviez pas d'échange. Donc, pour simplifier les choses, l’échange a lieu parce que votre système s’embourbe, plutôt que l’inverse.

ne fois que les données sont en swap, quand est-ce qu'elles sortent à nouveau?

Transférer des données en mode swap est (du moins pour les disques durs traditionnels) aussi fastidieux que de les stocker. Il est donc compréhensible que votre noyau soit tout aussi réticent à supprimer des données de l’échange, en particulier si elles ne sont pas réellement utilisées (c.-à-d. Lues ou écrites). Si vous avez des données en swap et qu'elles ne sont pas utilisées, c'est une bonne chose de les conserver dans le swap, car cela laisse plus de mémoire pour les autres éléments utilisés , potentiellement accélérer votre système.

85
thomasrutter

La définition de la valeur de swappiness ne fonctionne pas dans toutes les situations. Si cela fonctionne pour vous, tant mieux. Sinon, 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 mémoire libre RAM pour tout stocker dans RAM plus tout dans le swap, si vous essayez de le désactiver, votre système ne répondra plus. Mon script vérifie d’abord si la quantité de mémoire libre RAM est suffisante (ce qui prend un peu de travail, car la quantité réelle de mémoire libre RAM est différente de ce que free rapporte comme étant libre), puis ne permute l’échange (swap) le cas échéant. Mais, 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 (par exemple, avec 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.

22
Scott Severance

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éplacés pour être échangés par Linux.
Cela ralentit quelques programmes affectés.
Si vous avez beaucoup de RAM libre, vous pouvez désactiver le swap en exécutant la commande:
swapoff -av (vous aurez besoin des droits Sudo pour cela.)
Si vous n'aimez pas l'échange, vous pouvez l'activer en utilisant la commande symétrique:
swapon -av (à nouveau Sudo requis).

4
drake01

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 d'échange (ou le fichier), mais si vous avez vraiment besoin d'espace d'échange, des événements dramatiques peuvent se produire.

En plus des éléments normaux en mémoire, tempfs utilise l’espace de permutation et s’échange de la même manière que 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.

3
BillThor

J'ai édité le script de Scott Severance pour correspondre 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
2
derberlinersmurf