Question Pourquoi swap est-il utilisé alors que j'ai beaucoup de mémoire vive?


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


183
2018-06-29 22:16


origine


Veuillez 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 commandes de ces commandes demain. Il est 12 heures maintenant :( - Mysterio
Je devrais éditer le titre pour ajouter "... mais je suis trop endormi pour m'en soucier maintenant, alors vous faites la sieste aussi": P - ish


Réponses:


Vous pouvez essayer de changer votre valeur "swappiness":

Du FAQ sur l'échange de 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. Comme 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 agressifs.

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

  2. swappiness = 0 indique au noyau d'éviter de changer de processus de la mémoire physique aussi longtemps que possible

  3. 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

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 changer 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

Faire un changement permanent, modifiez 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

Enregistrez le fichier et redémarrez.

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


160
2018-06-29 23:10



Spéculation inactive: cela pourrait être bénéfique pour les performances - les pages auxquelles on n'a pas accédé depuis longtemps peuvent être copiées pour échanger de l'espace, ce qui permet au système d'exploitation de les expulser rapidement s'il a besoin de mémoire, mais le contenu de la page reste en mémoire . - Simon Richter
@SimonRichter Oui, c'est l'idée. Swappiness of 60 est probablement trop agressif sur les systèmes modernes, car cela signifie que vous commencez à changer lorsque vous avez encore plusieurs Go de mémoire libre. - Brendan Long
Courir sudo sysctl --load=/etc/sysctl.conf après avoir modifié le fichier pour appliquer les modifications - deFreitas


Votre question comporte plusieurs aspects.

Tout d'abord, quelle est votre définition de "libre"? En réalité, ce n'est pas aussi simple que cela puisse paraître sous 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 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 le disque et la lecture du disque peuvent être accélérées par le cache.

Idéalement, vous avez suffisamment de mémoire pour toutes vos applications et vous avez 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 vive, elles vont simplement dans une partie de l'espace utilisé par le cache, réduisant ainsi le cache. La désinstallation du cache est assez simple et peu coûteuse pour que tout soit 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, soit tout simplement désalloué ou ont dû vider sur le disque dans les prochaines secondes en tous cas.

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 rapporter différemment la mémoire vive: certains incluent le cache dans le cadre de ce qu’ils considèrent comme «gratuit» et d’autres pas.

Lorsque vous parlez de RAM libre, il est beaucoup plus significatif de comprendre cache, car il est pratiquement gratuit - il est disponible si une application le demande. Sous Linux, le free commande le 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 à partir de la RAM pour la permuter.

Cela ne se fait pas selon une limite définie. 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 le problème que vous rencontrez lors de l'échange, c'est à vous de décider. 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 c’est la rapidité avec laquelle les applications peuvent répondre à nouveau aux entrées des utilisateurs après avoir été laissées inactives pendant longtemps et 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 une situation limitée à Linux non plus.

Lors du choix de 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 où vous avez une énorme quantité de RAM (au moment de la rédaction, 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 fais le.

Mais comment échanger rapidement mon système? L'échange ne ralentit pas 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 mémoire que vous 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.

L'échange est seulement associé avec des moments où votre système fonctionne mal parce que cela se produit lorsque vous manquez de RAM utilisable, ce qui ralentirait votre système (ou le rendrait instable) même si vous ne disposiez pas de swap. Donc, pour simplifier les choses, l'échange se produit car votre système s’enlève plutôt que l’inverse.

Une fois que les données sont en swap, quand sort-il à nouveau?

Le transfert de données à partir de swap prend (pour les disques durs traditionnels, au moins) tout autant de temps que leur insertion. Il est donc compréhensible que votre noyau soit tout aussi réticent à supprimer des données du swap, en particulier s’il n’est pas réellement utilisé (par exemple, en lecture ou en écriture). 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 d'autres choses que sont être utilisé, potentiellement accélérer votre système.


83
2017-07-04 03:50



+1 pour une explication détaillée J'aime aussi garder 2GiB swap sur mes ordinateurs. Si quelque chose se passe mal (fuites de mémoire, etc.), vous pouvez voir le swap monter et rechercher le problème avant que la mémoire ne soit épuisée. C'est un filet de sécurité ainsi qu'un outil de performance. - Joe
Sur mon netbook, qui ne dispose que de 2 Go de RAM, je garde 4 Go de swap. C'est parce que j'utilise le netbook pour beaucoup plus que ce à quoi il était destiné et mes programmes nécessitent souvent plus de 2 Go de mémoire. Comme Linux se comporte très mal dans des situations de mémoire insuffisante, je préfère avoir un grand filet de sécurité. Et j'ai beaucoup d'espace disque. - Scott Severance
Si vos programmes requièrent souvent plus de 2 Go de mémoire, je penserais à y placer plus de mémoire (c'est très bon marché!) Car épuiser la mémoire RAM nuira aux performances. Pour le bénéfice des autres lecteurs: assurez-vous que vous ne regardez pas uniquement la mémoire cache qui est supposé pour obtenir de la RAM disponible - voir d'autres références à free -m. - thomasrutter
@neon_overload: je dois juste noter que selon HP, la RAM maximale de mon netbook est de 1 Go. J'ai maintenant 2 Go, et les sources Internet suggèrent que 2 Go est le maximum réel. Ainsi, le besoin de ces types de solutions de contournement. - Scott Severance
@ thomasrutter: Comment votre réponse change pour les gros serveurs, l'un des miens a 1 To (oui, un téraoctet complet) de RAM et utilise toujours swap; quel paramètre de permutation et quelle taille de partition swap recommanderiez-vous? - chrisinmtown


La définition de 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 n'avez pas assez de mémoire vive pour tout stocker dans la RAM plus tout ce qui est en swap, en essayant de désactiver le swap, ne répond plus à votre système. Mon script vérifie d’abord si la mémoire vive est suffisante (ce qui demande un peu de travail, car la quantité de mémoire vive disponible est différente de celle free rapports comme gratuits), puis ne change que si 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. 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 la RAM est insuffisante, elle refusera de basculer. J'ai utilisé ce script sans problèmes depuis près de cinq ans maintenant.


21
2017-07-04 02:38



+1 pour le script. Vous voudrez peut-être le moderniser un peu en changeant MB en MiB dans les sorties. J'ai écrit un script similaire sans tous les (bons) tests de sécurité que vous incluez. Sur mon ancien ordinateur portable, où l'échange était fortement utilisé, cela prendrait un certain temps - une minute ou deux, mais cela ne faisait aucun mal. De temps en temps, cela échouerait car il n'y avait pas assez de mémoire disponible pour le faire fonctionner, mais cela ne posait aucun problème supplémentaire. J'ai dû redémarrer pour clarifier les choses lorsque cela est arrivé. Cela avait à voir avec ce qui ressemblait à une fuite de mémoire dans Transmission (depuis corrigé, je crois) et ayant seulement 2GiB ram. - Joe
Si quelque chose a été déplacé pour être échangé et qu'il reste en échange, c'est normalement une bonne chose - cela signifie que les données ne sont pas réellement utilisées et qu'elles libèrent une partie de votre RAM pour d'autres choses, entraînant une augmentation potentielle de la vitesse. Qu'est-ce qui vous a amené à croire que ces données ne devraient pas être en échange et devraient prendre plus de RAM à la place? Habituellement, le noyau sait très bien ce qui est inutilisé et peut rester en toute sécurité dans le swap 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 assez peu ces jours-ci. La preuve est dans la performance. Par exemple, l'affichage des menus ou des programmes de commutation peut être lent en raison de l'échange, tout comme les effets visuels composites. Cette lenteur est guérie 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 une expérience répétée. - Scott Severance
Phew!! Cela n'a fait que relancer à 0% du swap ... Je n'ai pas eu beaucoup de temps pour examiner cette question complète et sa réponse mais je l'ai privilégiée pour la lire quand j'ai du temps libre. - AzkerM
Pourquoi ne vous contentez-vous pas de définir le swappiness à une valeur faible? Cela semble être la même chose que votre script, mais de manière beaucoup plus contrôlée. - jhfrontz


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 (tu auras besoin sudo droits pour cela.)
Si vous n'aimez pas le swap off, vous pouvez l'activer en utilisant une commande symétrique:
swapon -av (encore sudo Champs obligatoires).


4
2018-06-29 22:24



Le swap off est totalement exagéré puisque swapiness = 0 fait la même chose, mais plus sûr (si vous faire se retrouver avec trop de choses en mémoire, il jettera quelque chose dans swap). - Brendan Long
@BrendanLong Fair point .. Merci de m'avoir enseigné. :) - drake01


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é. Une fois la mémoire échangée, il est peu probable qu’elle soit échangée.

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.


3
2018-06-30 04:02





J'ai édité le script de Scott Severance pour correspondre aux nouvelles versions de free qui incluent déjà un champ de mémoire total 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
2017-10-03 13:37