257 votes

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

Je pensais que l'essence même de la partition d'échange était d'agir comme un filet de sécurité de stockage temporaire lorsque la 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 ?

224voto

gnrfan Points 7647

Vous pourriez essayer de modifier votre valeur de "swappiness" :

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

Qu'est-ce que le 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 swap. Les disques étant 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 trop agressivement déplacés hors de la mémoire.

  1. le taux d'échange peut avoir une valeur comprise entre 0 et 100

  2. swappiness=0 indique au noyau d'éviter le swapping des processus hors de la mémoire physique aussi longtemps que possible. Pour les versions 3.5 et plus récentes du noyau, cette option désactive l'échange de mémoire.

  3. swappiness=100 indique au noyau d'échanger agressivement 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 d'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 serveurs Ubuntu ont des exigences de performance différentes de celles des systèmes de bureau, et la valeur par défaut de 60 est probablement plus appropriée.

Pour vérifier la valeur de permutation

cat /proc/sys/vm/swappiness

Pour modifier la valeur de permutation Un changement temporaire (perdu au redémarrage) avec une valeur de permutation de 10 peut être effectué avec

sudo sysctl vm.swappiness=10

Pour rendre un changement permanent , éditez le fichier de configuration avec votre éditeur préféré :

gksudo gedit /etc/sysctl.conf

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

vm.swappiness=10

Sauvegardez le fichier et redémarrez.

Ejecutar sudo sysctl --load=/etc/sysctl.conf après avoir édité le fichier pour appliquer les changements

Vous pouvez également consulter le site : https://askubuntu.com/a/103916/54187

122voto

thomasrutter Points 33791

Il y a plusieurs aspects différents à votre question.

Tout d'abord, quelle est votre définition du mot "libre". En fait, ce n'est pas aussi simple qu'il n'y paraît dans Linux (ou tout autre 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 (sauf pour les derniers Mo) comme "cache". Cela inclut le cache des pages, les caches des inodes, etc. C'est une bonne chose - cela permet d'accélérer considérablement les choses. L'écriture sur le disque et la lecture du disque peuvent être énormément accélérées par le cache.

Idéalement, vous avez assez de mémoire pour toutes vos applications, et il vous reste plusieurs centaines de Mo pour le cache. Dans cette situation, tant que vos applications n'augmentent pas leur utilisation de la mémoire et que le système ne se bat pas pour obtenir suffisamment d'espace pour le cache, il n'y a pas besoin de swap.

Lorsque les applications réclament plus de mémoire vive, elles occupent simplement une partie de l'espace qui était utilisé par le cache, ce qui réduit le cache. La désaffectation du cache est suffisamment simple et bon marché pour être effectuée en temps réel - tout ce qui se trouve dans le cache est soit une seconde copie de quelque chose qui se trouve déjà sur le disque, et qui peut donc être désaffecté instantanément, soit quelque chose que nous aurions dû transférer sur le disque dans les secondes suivantes. de toute façon .

Ce n'est pas une situation spécifique à Linux - tous les systèmes d'exploitation modernes fonctionnent de cette manière. Les différents systèmes d'exploitation peuvent simplement présenter la RAM libre de manière différente : certains incluent le cache dans ce qu'ils considèrent comme "libre", d'autres non.

Quand on parle de RAM libre, c'est beaucoup plus significatif pour inclure Le cache, parce qu'il est pratiquement gratuit - il est disponible si une application le demande. Sous Linux, le free le rapporte dans les deux sens - la première ligne inclut le cache dans la colonne de la RAM utilisée, et la deuxième ligne inclut 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 n'en reste plus assez pour un bon fonctionnement du cache, Linux peut décider de réallouer une partie de la mémoire inutilisée de l'application de la RAM au swap.

Il ne le fait pas en fonction d'un seuil précis. Ce n'est pas comme si vous atteigniez un certain pourcentage d'allocation et que Linux commençait à échanger. Il a un algorithme plutôt "flou". Il prend en compte un grand nombre d'éléments, qui peuvent être décrits par "la pression exercée sur l'allocation de mémoire". S'il y a beaucoup de "pression" pour allouer de la nouvelle mémoire, alors il y aura plus de chances que certaines soient échangées pour faire plus de place. S'il y a moins de "pression", ces chances diminueront.

Votre système dispose d'un paramètre de "swappiness" qui vous permet d'ajuster la façon dont cette "pression" est calculée. Il n'est normalement pas recommandé de modifier ce paramètre, et je ne vous recommande pas de le faire. La permutation est globalement une très bonne chose - bien qu'il existe quelques cas limites où elle nuit aux performances, si vous considérez les performances globales du système, c'est un avantage net pour un large éventail de tâches. Si vous réduisez la permutation, vous laissez la quantité de mémoire cache diminuer un peu plus qu'elle ne le ferait autrement, même si cela peut être vraiment utile. C'est à vous de décider si ce compromis est suffisant pour résoudre le problème que vous rencontrez avec le swapping. Vous devez simplement 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 système de bureau, à savoir la rapidité avec laquelle les applications peuvent à nouveau répondre aux entrées de l'utilisateur après avoir été laissées inactives pendant une longue période et avoir été soumises à des processus d'arrière-plan lourds en E/S (comme une sauvegarde de nuit). Il s'agit d'une lenteur très visible, mais pas assez pour justifier la désactivation totale de la permutation et très difficile à éviter dans n'importe quel système d'exploitation. Si vous désactivez l'échange, cette lenteur initiale après la sauvegarde ou l'analyse antivirus peut ne pas se produire, mais le système peut fonctionner un peu plus lentement toute la journée. Cette situation n'est pas limitée à Linux, non plus.

Lorsqu'il choisit 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 - en lecture ou en écriture. Il dispose d'un algorithme assez simple pour calculer cela, qui choisit bien la plupart du temps.

Si votre système dispose d'une grande quantité de RAM (à l'heure où nous écrivons ces lignes, 8 Go est une quantité énorme pour une distro Linux typique), il est très rare que vous ayez besoin de swap. 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 de RAM peut vous sauver du plantage d'une application. Mais si vous savez que vous n'allez pas en avoir besoin, vous peut faites-le.

Mais comment le swap 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'espace d'échange est une opération lente, mais elle n'est effectuée que lorsque le noyau est certain que le bénéfice global sera plus important que cela. Par exemple, si la mémoire de votre application a augmenté au point que vous n'avez presque plus de cache et que vos E/S sont très inefficaces à cause de cela, vous pouvez en fait 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 l'échange de données afin de la libérer.

C'est aussi un dernier recours si vos applications demandent effectivement plus mémoire que vous avez réellement. Dans ce cas, le swapping est nécessaire pour éviter une situation de dépassement de la mémoire, qui entraîne souvent le plantage de l'application ou son arrêt forcé.

L'échange est seulement associé à avec des moments où votre système a des performances médiocres parce que cela se produit à des moments où vous êtes à court de RAM utilisable, ce qui ralentirait votre système (ou le rendrait instable) même si vous n'aviez pas de swap. Pour simplifier les choses, le swap se produit parce que votre système s'enlise, plutôt que l'inverse.

Une fois que les données sont dans le swap, quand est-ce qu'elles en ressortent ?

Transférer des données hors de l'espace d'échange est (pour les disques durs traditionnels, du moins) aussi long que de les y placer. Il est donc compréhensible que votre noyau soit tout aussi réticent à retirer des données de l'espace de pagination, surtout si elles ne sont pas réellement utilisées (c'est-à-dire lues ou écrites). Si vous avez des données dans l'espace d'échange et qu'elles ne sont pas utilisées, alors c'est une bonne chose qu'elles restent dans l'espace d'échange, car cela laisse plus de mémoire pour d'autres choses que l'espace d'échange. sont utilisé, ce qui peut accélérer votre système.

32voto

Scott Severance Points 13166

La définition de la valeur de permutation ne fonctionne pas dans toutes les situations. Si cela fonctionne pour vous, tant mieux. Sinon, j'ai écrit un script pour effacer périodiquement le swap en le désactivant et en le réactivant.

Le basculement de l'échange est un peu risqué si vous ne faites pas attention. Si vous n'avez pas assez de RAM libre pour contenir tout ce qui est en RAM plus tout dans swap, essayer de désactiver swap fera que votre système ne répondra plus. Mon script vérifie d'abord s'il y a assez de RAM libre (ce qui prend un peu de temps, car la quantité réelle de RAM libre est différente de ce que l'on peut trouver dans la base de données de l'ordinateur). free signale qu'il est libre), puis ne fait basculer le swap que si c'est le cas. Mais, si vous êtes un peu à court de RAM, ne démarrez pas un autre processus majeur pendant que le script est en cours d'exécution. 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 sans réponse ; si vous n'avez pas assez de RAM, il refusera de basculer le swap. J'utilise ce script sans problème depuis près de cinq ans maintenant.

10voto

derberlinersmurf Points 101

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

5voto

drake01 Points 3311

Généralement, le swap reste inutilisé sur les systèmes d'aujourd'hui. D'après mon expérience, les processus qui tournent depuis longtemps sans opérations intensives sont déplacés vers le swap par linux.
Il ralentit le fonctionnement de quelques programmes concernés.
Si vous avez beaucoup de RAM libre, vous pouvez désactiver l'échange en exécutant la commande :
swapoff -av (vous aurez besoin sudo droits pour cela).
Si vous n'aimez pas le swap off, vous pouvez l'activer en utilisant la commande symétrique :
swapon -av (encore une fois sudo nécessaire).

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