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

181

Je pensais que l’essence de swap était de servir de filet de sécurité de stockage temporaire lorsque la mémoire vive était pleine mais que ma partition de swap était constamment utilisée même si j’ai parfois jusqu’à 3 Go de mémoire vive. Est-ce normal?

    
posée Mysterio 30.06.2012 - 00:16
la source

6 réponses

159

Vous pouvez essayer de changer votre valeur de "swappiness":

Dans la FAQ sur l'échange d'Ubuntu :

  

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

     

Le paramètre swappiness contrôle la tendance du noyau à déplacer les processus de la mémoire physique et sur le disque d'échange. Étant donné que les disques sont beaucoup plus lents que la RAM, cela peut ralentir les temps de réponse du système et des applications si les processus sont trop agressivement déplacés.

     
  1. swappiness peut avoir une valeur comprise entre 0 et 100

  2.   
  3. swappiness = 0 indique au noyau d'éviter de permuter les processus en dehors de la mémoire physique aussi longtemps que possible

  4.   
  5. swappiness = 100 indique au noyau de permuter de manière agressive les processus de la mémoire physique et de les déplacer pour échanger le cache

  6.   

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. 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 est probablement plus adaptée.

     

Pour vérifier la valeur de permutation

     

cat /proc/sys/vm/swappiness

     

Pour modifier la valeur de permutation , une modification temporaire (perdue au redémarrage) avec une valeur de permutation de 10 peut être effectuée avec

     

sudo sysctl vm.swappiness=10

     

Pour apporter un changement permanent , modifiez le fichier de configuration avec votre éditeur favori:

     

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

     

Enregistrez le fichier et redémarrez.

Vous pouvez également consulter: lien

    
réponse donnée jpetersen 30.06.2012 - 01:10
la source
83

Votre question comporte plusieurs aspects.

Premièrement, quelle est votre définition de "libre"? En fait, ce n'est pas aussi simple que cela en a l'air sous Linux (ou tout autre système d'exploitation moderne).

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

Chaque application peut utiliser une partie de votre mémoire. Linux utilise toute la mémoire inoccupée (sauf les derniers Mb) comme "cache". Cela inclut le cache de la page, les caches inode, etc. C'est une bonne chose - cela aide à accélérer les choses. L’écriture sur disque et la lecture sur disque peuvent être accélérées par le cache.

Idéalement, vous avez suffisamment de mémoire pour toutes vos applications, et il vous reste encore 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 parvient pas à obtenir suffisamment d'espace pour le cache, aucun échange n'est nécessaire.

Une fois que les applications réclament plus de mémoire RAM, elles vont simplement dans une partie de l’espace utilisé par le cache, réduisant ainsi le cache. La désallocation du cache est assez simple et facile à réaliser 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, soit simplement libérée instantanément, soit 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 la mémoire vive gratuite différemment: certains incluent le cache dans le cadre de ce qu’ils considèrent comme "gratuit" et d’autres pas.

Lorsque vous parlez de mémoire vive libre, inclure dans le cache est beaucoup plus utile, car il est pratiquement gratuit - disponible si une application le demande. Sous Linux, la commande free la signale dans les deux sens - la première ligne inclut le cache dans la colonne 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 épuisé suffisamment de mémoire pour que le cache fonctionne correctement, Linux peut décider de ré-allouer de la mémoire d’application inutilisée de la mémoire RAM pour la remplacer.

Il ne le fait pas selon une coupure définitive. Ce n'est pas comme si vous atteigniez un certain pourcentage d'allocation, alors Linux commence à échanger. Il a un algorithme plutôt "flou". Cela prend beaucoup de choses en compte, ce qui peut être mieux décrit par "combien de pression existe pour l’allocation de mémoire". S'il y a beaucoup de "pression" pour allouer de la mémoire, cela augmentera les chances que certains soient échangés pour gagner de la place. S'il y a moins de "pression", cela diminuera ces chances.

Votre système a un paramètre "swappiness" qui vous aide à modifier la façon dont cette "pression" est calculée. Il n'est généralement pas recommandé de modifier cela du tout, et je ne vous recommanderais pas de le modifier. La permutation est globalement une très bonne chose - même s'il existe quelques cas extrêmes où elle nuit aux performances, si vous regardez les performances globales du système, cela représente un avantage net pour un large éventail de tâches. Si vous réduisez le swappiness, vous laissez la quantité de mémoire cache se réduire un peu plus qu'elle ne le ferait autrement, même si cela peut être vraiment utile. Que ce soit un compromis suffisant pour tout problème que vous rencontrez lors de l'échange est à vous. Vous devriez juste savoir ce que vous faites, c'est tout.

Il existe une situation bien connue dans laquelle le swap nuit aux performances perçues sur un système de bureau, et à la rapidité avec laquelle les applications peuvent répondre à nouveau aux entrées des utilisateurs après une longue période d'inactivité et des processus d'arrière-plan importants ( comme une sauvegarde de nuit) exécuter. Ceci est une lenteur très visible, mais pas suffisante pour justifier la désactivation du swap tous ensemble et très difficile à empêcher dans tous les systèmes d’exploitation. Désactivez le swap et cette lenteur initiale après l'analyse de sauvegarde / virus peut ne pas se produire, mais le système peut fonctionner un peu plus lentement toute la journée. Ce n’est pas non plus une situation limitée à Linux.

Lorsque vous choisissez ce qui doit être échangé sur le disque, le système essaie de sélectionner la mémoire qui n’est pas réellement utilisée (lecture ou écriture). Il a un algorithme assez simple pour le calculer, qui choisit bien la plupart du temps.

Si vous avez un système dans lequel vous avez une énorme quantité de RAM (au moment d’écrire, 8 Go représentent une quantité énorme pour une distribution Linux typique), vous ne rencontrerez que très rarement une situation où le swap est 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 de RAM peut vous sauver de certaines applications en panne. Mais si vous savez que vous n’en aurez pas besoin, vous pouvez le faire.

Comment échanger rapidement mon système? Ne pas échanger ralentit les choses?

Le transfert de données de la mémoire RAM à l’échange est une opération lente, mais elle n’est prise que lorsque le noyau est certain que le bénéfice global sera plus important. Par exemple, si la mémoire de votre application a atteint le point où il ne reste presque plus de cache et que votre E / S est très inefficace, vous pouvez en fait obtenir beaucoup plus de vitesse en libérant de la mémoire, même après le coût initial de l'échange de données afin de le libérer.

C'est aussi 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 situation de mémoire insuffisante qui entraînera souvent le blocage d'une application ou sa mise à mort.

La permutation est uniquement associée à des 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 rendrait instable) même si vous n'avez pas échangé. Donc, pour simplifier les choses, la permutation se produit car votre système s’enlève, plutôt que l’inverse.

Une fois que les données sont en échange, à quel moment s’en sort-il?

Le transfert de données hors échange est (pour les disques durs traditionnels, au moins) tout aussi long que leur insertion. Il est donc compréhensible que votre noyau soit tout aussi réticent à supprimer des données du swap, surtout s'il n'est pas réellement utilisé (c.-à-d. Lu ou écrit). Si vous avez des données en swap et qu'elles ne sont pas utilisées, alors c'est une bonne chose que cela reste dans le swap, car cela laisse plus de mémoire pour les autres choses utilisées , ce qui peut accélérer votre système.

    
réponse donnée thomasrutter 04.07.2012 - 05:50
la source
21

Définir la valeur de permutation ne fonctionne pas dans toutes les situations. Si ça marche pour toi, génial. Sinon, j'ai écrit un script pour effacer périodiquement les swaps en les éteignant puis en les rallumant.

Changer de swap est un peu risqué si vous ne faites pas attention. Si vous ne disposez pas de suffisamment de mémoire vive pour stocker tout ce qui se trouve dans RAM plus tout en swap, essayer de désactiver le swap fera que votre système ne répondra plus. Mon script vérifie d'abord s'il y a suffisamment de mémoire vive (ce qui est un peu compliqué, car la quantité de mémoire vive disponible est différente de ce que free rapporte comme étant libre), puis ne fait qu'activer le swap. Mais si vous manquez un peu de RAM, ne lancez pas un autre processus majeur pendant que le script est en cours d'exécution. La voici:

#!/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 }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"

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 la RAM est insuffisante, elle refusera de basculer. J'ai utilisé ce script sans problèmes depuis près de cinq ans maintenant.

    
réponse donnée Scott Severance 04.07.2012 - 04:38
la source
4

Généralement, le swap reste inutilisé sur les systèmes actuels. D'après mon expérience, les processus qui fonctionnent pendant une longue période sans opérations intensives sont transférés au système Linux.
Cela ralentit l'exécution de certains programmes.
Si vous avez beaucoup de mémoire 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 le swap off, vous pouvez l'activer, en utilisant la commande symétrique:
swapon -av (encore%% requis).

    
réponse donnée drake01 30.06.2012 - 00:24
la source
3

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

Une façon de forcer ces pages en mémoire consiste à désactiver le périphérique de swap. Si vous en avez deux, vous pouvez en désactiver une, la rallumer, puis éteindre la seconde. Si l'échange est vraiment nécessaire, il se déplacera entre les appareils. Vous pouvez simplement désactiver le périphérique de swap (ou le fichier), mais si vous avez vraiment besoin d’un espace de swap, des choses radicales peuvent se produire.

Outre les choses normales en mémoire, tempfs utilise l’espace de swap, 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 la permutation des pages. Une fois créés, les fichiers temporaires ne peuvent plus être utilisés après quelques minutes et sont de bons candidats à déplacer vers le périphérique de swap.

À la rigueur, vous pouvez utiliser un fichier en tant que périphérique de swap. Ceci est utile si vous avez besoin d'un espace d'échange supplémentaire temporaire.

    
réponse donnée BillThor 30.06.2012 - 06:02
la source
2

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 total disponible.

#!/bin/bash

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

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
    
réponse donnée derberlinersmurf 03.10.2017 - 15:37
la source

Lire d'autres questions sur les étiquettes