Pourquoi la plupart des gens recommandent-ils de réduire le swappiness à 10-20?


65

J'ai vu dans plusieurs sites qu'il est recommandé de réduire le swappiness à 10-20 pour de meilleures performances.

Est-ce un mythe ou pas? Est-ce une règle générale? J'ai un ordinateur portable avec 4 Go de RAM et 128 Go de disque SSD, quelle valeur recommandez-vous pour mon swappiness?

Merci.


5
Les sites que vous avez énumérés n'expliquent pas pourquoi ils recommandent de modifier la valeur par défaut. Les réponses ici sont bien meilleures, pour ce choix délicat concernant un problème complexe.
nealmcb

Réponses:


88

Parce que la plupart croient que l'échange = mauvais et que si vous ne réduisez pas le swappiness, le système échangera quand il n'en a pas vraiment besoin Aucune de celles-ci n'est vraiment vraie. Les gens associent les échanges aux moments où leur système est en train de s'enliser. Cependant, il s'agit surtout d'échanges parce que le système s'enlise, et non l'inverse. Lorsque le système échangera, il aura déjà pris en compte le coût de performance dans sa décision d’échanger et décidera de ne pas le faire, ce qui entraînerait une pénalité globale plus grande en termes de performance ou de stabilité du système.

Globalement, les paramètres par défaut donnent de bonnes performances et une bonne stabilité. Je recommanderais de le laisser par défaut. Il existe d’autres possibilités pour Linux d’améliorer la gestion de sa mémoire afin de résoudre certains problèmes, mais dans l’ensemble, le contrôle swappiness n’est pas une bonne solution de contournement: ajustez-le dans un sens, vous pouvez résoudre un problème et en créer d’autres. Dans la mesure du possible, installer simplement plus de RAM physique (et laisser Swappiness seul) éclipse tous les autres remèdes.

Comment Linux utilise la RAM

Toute RAM non utilisée par les applications peut être utilisée comme "cache". Le cache est important pour un système rapide et fluide, car il accélère les lectures et les écritures sur le disque.

Si vos applications augmentent leur utilisation de la mémoire au point d’utiliser presque toute votre mémoire RAM, votre mémoire cache diminuera et, en conséquence, les opérations sur les disques seront ralenties. De nos jours, il ne suffit pas d'avoir seulement des dizaines de mégaoctets, ou moins, pour le cache.

Si les applications augmentent encore davantage l'utilisation de la mémoire (en supposant que vous n'avez pas d'espace de swap), vous n'aurez non seulement pas d'espace pour le cache, mais vous manquerez éventuellement de mémoire et votre système devra arrêter les processus en cours d'exécution. Tuer des processus est pire qu'un ralentissement, car il vous donne un système instable et imprévisible.

Comment Linux utilise le swap

Pour lutter contre ces deux problèmes, votre système peut réaffecter de la mémoire d'application rarement utilisée à l'espace de permutation sur votre disque, libérant ainsi de la mémoire vive. La RAM supplémentaire peut empêcher les processus de disparaître en raison d'une insuffisance de mémoire et peut récupérer un peu de cache afin que les opérations de disque puissent fonctionner plus facilement.

Cette réallocation ne se fait toutefois pas selon un seuil défini. Vous n'atteignez pas un certain pourcentage d'allocation après lequel Linux commence à permuter. Il a un algorithme "flou". Il prend en compte de nombreux éléments, qui peuvent être décrits de la manière suivante: "quelle pression existe 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 la manière dont cette "pression" est calculée. Il est souvent représenté à tort comme un "pourcentage de RAM", mais ce n'est pas une valeur, mais simplement une valeur utilisée dans la formule. Des valeurs comprises entre 40 et 60 sont les valeurs recommandées, 60 étant la valeur par défaut de nos jours.

Permettre à votre système d’interchanger quand il le faut est globalement une très bonne chose, même si vous avez beaucoup de RAM. Si vous permutez votre système s'il le souhaite, vous aurez l'esprit tranquille: si vous rencontrez un problème de mémoire insuffisante, même temporairement (tout en exécutant un processus court utilisant beaucoup de mémoire), votre système a une seconde chance de tout faire fonctionner. Si vous allez jusqu'à désactiver complètement le swap, vous risquez d'être tué par des processus faute d'allocation de mémoire.

Que se passe-t-il lorsque le système est embourbé et que les échanges sont importants?

L’échange étant une opération lente et coûteuse, le système l’évite sauf s’il calcule que le compromis entre les performances du cache compensera globalement ou s’il est nécessaire d’éviter la destruction des processus.

Très souvent, les gens vont regarder leur système qui écrase énormément le disque et utilise beaucoup d’espace d’échange et de blâme pour les échanger. C'est la mauvaise approche à prendre. Si la permutation atteint un jour cette limite, cela signifie que la permutation est une tentative de votre système de gérer des problèmes de mémoire insuffisante, et non la cause du problème, et que, sans permutation, le processus en cours va simplement disparaître de manière aléatoire.

Qu'en est-il des systèmes de bureau? N'ont-ils pas besoin d'une approche différente?

Les utilisateurs d'un ordinateur de bureau s'attendent en effet à ce que le système "se sente réactif" en réponse à des actions initiées par l'utilisateur telles que l'ouverture d'une application, qui est le type d'action qui peut parfois déclencher un échange en raison de l'augmentation de la mémoire requise.

Certaines personnes tentent d’y remédier en réduisant le paramètre swappiness, ce qui peut augmenter la tolérance du système aux applications utilisant de la mémoire et disposant de peu d’espace en cache.

Cependant, il ne s'agit que de déplacer des buts. La première application peut maintenant se charger sans opération d'échange, mais elle laissera moins de mou pour l'application suivante à charger. Le même échange peut se produire ultérieurement, lorsque vous ouvrez une application à la place. Dans l’intervalle, les performances du système sont globalement inférieures en raison de la taille réduite du cache. Par conséquent, il peut être difficile de mesurer tout avantage lié au paramètre swappiness réduit, ce qui réduit parfois le délai de permutation, mais ralentit les performances à un autre moment. Réduire un peu la permutation peut être justifié si vous savez ce que vous faites, mais le ramener à 10% peut laisser le système tolérant pour des tailles de mémoire cache très faibles et le rendre plus susceptible de devoir basculer à court terme.

Vous devez éviter de désactiver complètement le swap car vous perdez la protection supplémentaire contre les conditions de manque de mémoire, qui peuvent provoquer le blocage ou la mort des processus.

Le remède le plus efficace est de loin d'installer plus de RAM si vous pouvez vous le permettre.

L'échange peut-il être désactivé sur un système disposant de beaucoup de RAM, de toute façon?

Si vous disposez de beaucoup plus de RAM que nécessaire pour les applications, vous aurez rarement besoin de permuter. Désactiver le swap ne fera probablement pas de différence la plupart du temps. Mais si vous avez beaucoup de RAM, laisser le swap activé ne sera pas pénalisé, car le système ne permutera pas quand cela ne sera pas nécessaire.

Les seules situations dans lesquelles cela ferait une différence seraient dans la situation improbable où le système se trouve à court de mémoire et, par conséquent, le système de cache est entravé et c'est dans ce type de situation que vous souhaiteriez le plus échanger. Vous pouvez donc laisser en toute sécurité les paramètres normaux d’échange pour une tranquillité d’esprit accrue, sans que cela ait un effet négatif lorsque vous avez beaucoup de mémoire.

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 il n’est pris que lorsque le noyau est pratiquement certain que l’avantage global résultant de la conservation d’une taille de cache raisonnable l'emportera sur cette éventualité.

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

Toute partie donnée de la mémoire sortira de l'échange dès qu'elle sera utilisée - lue ou écrite. Cependant, la mémoire échangée est généralement la mémoire qui n'a pas été utilisée depuis longtemps et qui ne devrait pas être nécessaire bientôt.

Transférer des données hors échange prend à peu près aussi longtemps que de les insérer. Votre noyau n'en supprimera pas les données s'il n'en a pas besoin. Bien que les données est en échange et non utilisé, il laisse plus de mémoire pour d' autres choses qui sont utilisés, et plus le cache du système.

Existe-t-il des cas où la réduction de la swappiness est appropriée?

Oui. Si vous exécutez un serveur dédié à une application serveur particulière ne bénéficiant pas du cache système. Certains serveurs de base de données, tels que le serveur Oracle, MySQL / MariaDB, recommandent dans certains cas de réduire la permutation de 1 à 10, car ces moteurs de base de données utilisent leur propre mise en cache.

Notez que cela n’est vrai que si votre système est dédié à cette tâche et dans le cas de MySQL / MariaDB que si vous utilisez uniquement InnoDB ou XtraDB, et non MyISAM ou Aria, etc.


Merci pour votre description détaillée. Je pense que dans mon cas (4 Go de RAM et 128 Go de disque SSD avec disque dur) et avec mon utilisation (développement Java EE et plusieurs autres disques), swappiness = 20 convient. Qu'est-ce que tu penses?
Saeed Zarinfam

Je pense que la valeur par défaut de 60 serait préférable, à mon avis.
thomasrutter

4
@BlancaHiggins avez-vous lu le message que vous avez commenté? Votre commentaire ne semble pas décrire ce que swapiness fait réellement.
thomasrutter

1
C'est une excellente réponse. Merci beaucoup pour une si bonne explication.
Dan Barron

2
Une partie de l'info selon laquelle SwapFaq est trompeuse à mon avis: le fixer à 100 changera de manière "agressive". Je pense qu'il est plus exact de dire que c'est un paramètre très prudent et proactif, en permutant au premier signe que la mémoire ou le cache disponible est en train de devenir un peu faible. Tandis que des valeurs faibles, telles que 10, sont plus risquées et vous évitent toute permutation jusqu'à ce que la mémoire disponible soit très basse et que le cache disparaisse complètement, ce qui laisse le système sans grande marge de manœuvre.
thomasrutter

14

Sur un poste de travail habituel, vous avez 4-5 tâches actives qui consomment 50 à 60% de la mémoire. Si vous définissez swappiness sur 60, environ 1 / 4-1 / 3 des pages de tâches ACTIVE seront remplacées. Cela signifie que pour chaque changement de tâche, pour chaque nouvel onglet que vous avez ouvert, pour chaque exécution de JS, il y aura un processus de permutation.

La solution consiste à définir swappiness sur 10. Les observations pratiques poussent le système à abandonner le cache disque io (qui joue peu ou pas de rôle sur le bureau, car le cache lecture / écriture n'est pratiquement pas utilisé du tout. Sauf si vous copiez constamment LARGE fichiers) au lieu de mettre quoi que ce soit dans swap. En pratique, cela signifie que le système refusera d’échanger des pages et de couper le cache io à la place, sauf s’il utilise 90% de mémoire utilisée. Et cela, à son tour, signifie une expérience de bureau fluide, sans coupure et rapide.

Sur le serveur de fichiers, toutefois, je définirais swappiness à 60 ou même plus, car le serveur ne comporte pas d’énormes tâches de premier plan actives qui doivent être conservées dans la mémoire, mais plutôt de nombreux processus plus petits qui fonctionnent ou sont en veille, et pas vraiment changer leur état immédiatement. Au lieu de cela, le serveur envoie souvent (pardon) exactement les mêmes données aux clients, ce qui rend les caches de disque io beaucoup plus précieux. Sur le serveur, il est donc préférable d’échanger les processus en veille, en libérant de l’espace mémoire pour les demandes de cache disque.

Sur les ordinateurs de bureau, cependant, ce paramètre exact entraîne l’échange de blocs de mémoire d’applications REAL, qui modifient ou accèdent en permanence à ces données.

Curieusement, les navigateurs réservent souvent de gros morceaux de mémoire qu'ils modifient constamment. Lorsque de tels morceaux sont échangés, cela prend un certain temps si on leur demande de revenir - et en même temps, le navigateur met à jour ses caches. Ce qui provoque des latences énormes. En pratique, vous attendez 2 minutes pour charger la page Web unique dans un nouvel onglet.

Desktop ne s'intéresse pas vraiment à disk io, car desktop lit et écrit rarement en répétant de grandes portions de données pouvant être mises en cache. Découper sur le disque dur uniquement pour éviter autant que possible le permutation est beaucoup plus avantageux pour les ordinateurs de bureau que 30% de la mémoire réservée au cache sur disque et que 30% de la RAM (contenant des blocs appartenant à des applications utilisées activement) soient remplacés.

Lancez simplement htop, ouvrez un navigateur, GIMP, LibreOffice - chargez quelques documents là-bas, puis naviguez pendant plusieurs heures. C'est vraiment aussi simple que ça.


3
+1 pour la description des différences entre le serveur et le bureau. Le cache disque du serveur peut être créé sur un champ de disque.
Dee

Si tel est le cas, pourquoi les versions de serveur et de bureau d’Ubuntu ont-elles une valeur par défaut de 60? Si ce que vous dites est vrai, il serait alors plus logique de fournir à la version de bureau une valeur par défaut de 20, voire 10, mais ce n’est pas le cas.
JAB

1
Référence pour l'implication que swappiness est un pourcentage direct de RAM qui est échangé? Je ne pense pas que ça marche comme ça.
Xen2050

1
Ce n'est pas. Swappiness n'est pas lié à un pourcentage de RAM. C'est un bouton qui ajuste un algorithme flou pour qu'il soit plus ou moins susceptible d'échanger dans une situation problématique donnée. Je pense également que la description des charges de travail entre serveur et ordinateur de bureau dans cette réponse fait un tas d’hypothèses qui ne tiennent pas toujours.
thomasrutter

9

Si vous utilisez un serveur Java sur votre système Linux, vous devriez vraiment envisager de réduire de beaucoup le swappiness par rapport à la valeur par défaut de 60. So 20 est donc un bon début. L’échange est un élément décisif pour un processus de collecte des déchets, car les collections doivent à chaque fois toucher de grandes parties de la mémoire du processus. Le système d'exploitation n'a pas les moyens de détecter de tels processus et de les résoudre correctement. Il est préférable d’éviter d’échanger le plus possible contre des serveurs d’applications productifs.


Il est vrai que si vous dédiez un serveur à une charge de travail spécialisée dont vous savez qu'il ne bénéficiera pas du cache système (comme un serveur de base de données), il pourrait alors être logique de réduire le swappiness. Je ne pense pas que la collecte des ordures soit un cas assez spécialisé cependant. Si la mémoire est fréquemment touchée, elle ne sera pas échangée, elle sera conservée dans la RAM physique. La seule fois où ce n'est pas le cas, c'est si vous avez une grave mémoire insuffisante et que la permutation n'est pas responsable.
thomasrutter

4

Je suggérerais de faire quelques expériences tout en laissant le système ouvert pour voir exactement la charge de votre machine. Je suis également équipé de 4 Go de mémoire et d’un disque SSD de 128 Go. En prime, la durée de vie du lecteur SSD augmentera également, car il souffrira moins d'écritures.

Pour un didacticiel vidéo simple expliquant comment faire ceci avec une explication complète, voir la vidéo YouTube ci-dessous

http://youtu.be/i6WihsFKJ7Q


1
Excellente vidéo que vous avez faite, mais la vidéo ne répond pas vraiment à la question directement, mais plutôt un guide pratique sur le changement de swappiness.
jmunsch

+1 pour l'indice de vie SSD, car SSD est préférable si le système est en lecture seule autant que possible, le repos doit rester en mémoire et aujourd'hui, la mémoire n'est généralement pas un gros problème sur les ordinateurs de bureau actuels.
Dee

3

Je souhaite ajouter la perspective d'un ingénieur Big Data Performance afin de donner aux autres davantage d'informations sur la technologie 2017.

Mon expérience personnelle est que bien que je permette généralement aux permutations d’échanger afin de garantir le fonctionnement maximal de mes systèmes, sur mon poste de travail, pour un problème spécifique, j’ai constaté que des permutations de 1 et 10 entraînaient des blocages (permanents) et de longues pauses. Un swappiness de 80 pour cette application particulière conduit à des performances bien meilleures et des pauses plus courtes que celles par défaut (60). Notez que j'avais 8 Go de RAM et 4x 256 Go de swap sauvegardé par 1 disque dur. Je ferais normalement état de statistiques précises figurant dans mes tests de performance et les spécifications matérielles complètes, mais je n’en ai pas encore fait. C’est un ordinateur de bureau bas de gamme récent qui n’est pas important ici.

De retour dans mon ancienne société, la raison pour laquelle nous n’avons pas activé Swappiness sur les serveurs Spark dotés de nœuds de [500 Go à 4 To] x [10-100] est que nous avons constaté que les performances médiocres étaient un signe de la nouvelle conception du pipeline de données et des structures de données. manière. Nous ne voulions pas non plus comparer les disques durs / SSD. De plus, pour échanger autant de RAM, il faudrait 10 à 30 disques par nœud avec des écritures parallèles afin de réduire le temps d'accès au disque.

Aujourd'hui, il y a 20 ans et 20 ans, il restera toujours le cas que certains problèmes sont trop importants pour la RAM. Avec un temps et de l'argent infinis, nous pouvons acheter / louer plus de matériel ou reconcevoir tout processus pour obtenir les performances souhaitées. L'échange n'est qu'un hack pour nous permettre d'ignorer le vrai problème (nous n'avons pas assez de bélier et nous ne voulons pas dépenser plus d'argent).

Pour ceux qui pensent qu'un swappiness plus élevé est un mauvais conseil, voici un petit aperçu. Dans le passé, les HD ne disposaient que de quelques ko de cache, le cas échéant. L'interface était IDE / Parallel ATA. Le bus du processeur était également beaucoup plus lent avec la RAM et beaucoup d'autres choses. En bref, les systèmes étaient très lents (par rapport à aujourd'hui) dans tous les sens. Il y a quelques années, les disques durs utilisaient SATA3. Aujourd'hui, ils utilisent le protocole NVMe, qui offre des améliorations significatives en matière de latence. Les HD ont beaucoup de Mo de cache. Et la partie la plus intéressante est lorsque vous utilisez un SSD moderne (endurance et performances en lecture / écriture bien plus stables) avec NVMe ou PCIe comme stockage de swap. C'est le meilleur compromis entre coût et performance. N'essayez pas ceci avec des SSD bon marché ou anciens.

Swap + SSD! Avec le stockage volatile hautes performances, je vous recommande fortement d’expérimenter une valeur de swappiness élevée. Cela dépend principalement des modèles d'accès à la mémoire (accès aléatoire à l'ensemble de la mémoire et rarement plus), de l'utilisation de la mémoire, si la bande passante du disque est déjà saturée, et du coût réel de la compression.


1

Il se peut que le comportement de swapping perçu au démarrage ou à l’ouverture de programmes soit dû à la lecture par Linux des fichiers de configuration, etc., à partir du disque. Il est donc peut-être préférable d’utiliser le programme de surveillance du système avant de supposer que l’accès au disque dur est dû à l’échange.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.