Est-ce une mauvaise idée de créer un script cron qui vide le swap toutes les heures?


26

Depuis des années, j'ai le même problème avec mes petites configurations Ubuntu: l'espace de swap utilisé augmente avec le temps. J'ai l'impression que cela est principalement dû au fait que la mémoire allouée ne revient jamais en RAM même s'il y a suffisamment d'espace pour cela, sauf dans le cas d'une action de l'utilisateur comme la désactivation du swap.

J'ai fait une courte croncommande pour automatiser cela, et j'ai de bons résultats:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

Mais parce que c'est plus une astuce qu'une vraie solution à ce problème, je me demande quelles sont les raisons potentielles pour lesquelles ce pourrait être une mauvaise idée, ou comment pourrais-je améliorer ce script pour le rendre un peu plus intelligent?


29
Pardonnez mon ignorance, mais que voulez-vous dire exactement en disant que l'espace SWAP augmente avec le temps et le vidage dans la RAM de la mémoire allouée ? Normalement, vous allouez de l’espace au système et n’en entendez plus jamais parler. Qui se soucie de la quantité de swap réellement prise? Quel est le problème?
dessert

5
Pourquoi voulez-vous même faire ça? Pourquoi pensez-vous qu'une utilisation de swap est une mauvaise chose? De combien d'utilisation de swap parlons-nous?
marcelm

25
Je suis un peu perplexe. Vous continuez à parler d'un "problème" mais ne décrivez en fait aucun effet négatif d'aucune sorte. Pourquoi considérez-vous cela comme un problème?
David Schwartz

17
Si quelque chose entre dans l'échange et y reste, c'est parce que rien ne l'utilise. Et si rien ne l'utilise, il est préférable de laisser la RAM utilisée pour quelque chose auquel on accède, comme le cache, que de rééchanger les données.
Hobbs

12
Comment est-ce mieux que de simplement laisser swap off?
user253751

Réponses:


51

L'utiliser comme ça: oui, mauvais. Vous devez vraiment vérifier s'il y a suffisamment de mémoire disponible avant de désactiver le swap. Voir /ubuntu//a/90399/15811 pour une meilleure version.

Aussi: en êtes-vous sûr? Le swap alloué ne signifie pas que le swap est utilisé. La commande vmstat, colonnes si(swap in) et so(swap out). Si ceux-ci restent 0, vous avez un autre problème. D'après mon expérience, le swap est à peine utilisé, et vous ne l'utilisez peut-être pas en pensant qu'il ne le vide pas mais qu'il n'y a rien à vider.


3
Attends quoi? S'il n'y a pas assez de mémoire pour que le swapoff réussisse, le swapoff est d'abord tué par le tueur OOM. Oui, ils l'ont codé en dur (il vérifie par appel système).
Joshua

@ Joshua bien sûr, mais il veut que cela fonctionne de manière automatisée. Pas d'erreur.
Rinzwind

4
Pour élaborer sans entrer dans la rédaction de ma propre réponse, l'utilisation croissante du swap au fil du temps n'est pas du tout une mauvaise chose . Ce que cela signifie, c'est que le noyau découvre lentement quels fichiers indésirables qui consomment de la mémoire ne sont jamais utilisés et les déplace pour les échanger afin que la mémoire puisse être utilisée pour des choses qui vous aident réellement (comme être en mesure de conserver plus de données fs en cache afin il n'a pas besoin de continuer à le jeter et à le relire à partir du disque).
R ..

@Rinzwind cron fonctionne très bien avec les travaux qui génèrent des erreurs, et le script lié n'utilise pas non vmstatplus.
jpaugh

41

Je dirais que c'est une mauvaise idée. Si vous pensez que vous avez de la mémoire libre et qu'un processus actif n'est pas déplacé du swap vers la RAM, alors soit vous n'avez pas autant de mémoire libre que vous le pensez, soit le processus n'est pas aussi actif que vous le pensez. est.

Si un processus actif continue à être échangé, vous devez corriger tout ce qui cause une pression sur la mémoire. Si ce n'est pas un processus actif, quel est le problème?


1
+1: Quel est le problème? Ne changez jamais un système en cours d'exécution , je ne pense pas que l'on devrait jouer avec les fonctions de base du système comme ça, surtout pas sans besoin.
dessert

3
J'ai parfois des problèmes où je tue un processus avec une fuite de mémoire (qui a forcé tout le reste à swap), me laissant avec ~ 10% de RAM utilisée ... mais tous les programmes en cours sont en swap jusqu'à ce que j'y accède à nouveau. Donc, chaque fois que vous touchez quelque chose, il y a un délai de deux secondes. Je peux voir d'où vient OP, et ce serait bien que cela se fasse automatiquement, mais ce n'est pas la bonne façon.
Quelqu'un Quelque part

1
@SomeoneSomewhere Mais ce n'est pas ainsi que cela fonctionne, de toute façon. Si le processus perd de la mémoire, par définition, il n'utilise pas activement cette mémoire (il ne la lit pas et ne l'écrit pas); il vient de lui être alloué, par accident. S'il y a d'autres processus actifs, la mémoire perdue sera échangée et ce sera votre échange plein de déchets, pas votre RAM physique.
David Richerby

@DavidRicherby Si vous avez un programme ouvert en arrière-plan, alors ce programme est toujours moins actif que la fuite de mémoire - et lorsque vous allez y revenir, il doit sortir du swap.
Quelqu'un Quelque part

@SomeoneSomewhere Vous semblez avoir mal compris le fonctionnement du système de mémoire. Vous n'avez pas besoin d'avoir l'ensemble d'un processus en RAM physique: le swap est géré à la granularité des pages individuelles. Toute page qui n'a pas été utilisée depuis un certain temps est susceptible d'être échangée, et une page entièrement constituée de mémoire perdue ne sera plus jamais utilisée, elle ne sera donc jamais permutée après avoir été échangée.
David Richerby

34

C'est une mauvaise idée.

Le noyau commence à copier (ne pas déplacer) les données à échanger bien avant que la mémoire physique soit proche d'être pleine, car si un processus nécessite jamais beaucoup de mémoire, toute page qui a déjà une copie valide dans l'échange peut être réutilisée immédiatement sans nécessiter une autre écriture sur le disque.

En général, cela se produit principalement pour les pages qui n'ont pas été consultées depuis longtemps, ce qui est un bon indicateur qu'il est peu probable qu'elles y soient bientôt accessibles.

Si vous supprimez explicitement les copies, cela n'apporte aucun avantage, car les données existent toujours dans la RAM, mais peuvent vous coûter de la vitesse lorsqu'un processus souhaite allouer beaucoup de mémoire et qu'un échange devient nécessaire.

Le noyau utilisera également toujours l'espace de swap dès que la mémoire physique est pleine à plus de 50%, donc ces nombres seront différents de zéro même si vous avez suffisamment de mémoire installée.


4
toujours : je pense que vous supposez qu'il /proc/sys/vm/swappinessest laissé à sa valeur par défaut de 70, ce qui est bon pour les serveurs et affiche de manière assez agressive les pages sales des processus qui ne les ont pas touchées depuis un moment pour faire de la place pour plus de pagecache. C'est souvent mauvais pour les ordinateurs de bureau car alt-tab peut devenir lent.
Peter Cordes

@PeterCordes, si les pages ont été effectivement expulsées, les caches ont vu plus d'accès que les pages d'application en question, il y a donc eu un avantage net à les utiliser comme caches de disque. Je peux voir comment les performances Alt-Tab sont plus visibles pour l'utilisateur que par exemple le temps de compilation pour un grand projet, mais j'ai du mal à formuler une politique qui garantit une réponse instantanée sans sacrifier trop de performances.
Simon Richter

1
Autrement dit: le noyau est réglé pour le débit ( swappiness=70), mais la latence est plus importante pour l'expérience utilisateur sur un bureau. C'est un compromis. Si vous compilez régulièrement des choses légèrement trop grandes pour rester dans la pagecache, alors bien sûr, laissez swappinessun peu plus haut, comme 20 ou 30 au lieu de 5 ou 10. Voir aussi akitaonrails.com/2017/01/17/optimizing-linux-for -ordinateurs lents . Une valeur vm.vfs_cache_pressureinférieure à 100 favorise également la mise en cache des métadonnées inode / répertoire sur les pages de données, ce qui est également intéressant pour la réactivité de l'interface utilisateur.
Peter Cordes

1
Autres paramètres ajustables: seuils de réécriture lonesysadmin.net/2013/12/22/… . Celles-ci contrôlent la vitesse à laquelle Linux commence à écrire sur le disque après que quelque chose a été écrit dans des fichiers, et combien de pages sales sont autorisées. (c.-à-d. combien de mémoire peut être dépensée pour la mise en cache d'écriture)
Peter Cordes

21

C'est une mauvaise idée. Si cela était utile, le noyau Linux l'implémenterait de cette façon. Je ne pense pas qu'il y ait une raison de changer plus que quelques paramètres de réglage, car un script shell aussi simple n'est probablement pas plus intelligent que les algorithmes des développeurs du noyau.

Vous avez essentiellement deux cas:

  • Les processus dans l'espace de swap ne sont pas utilisés de toute façon. Pourquoi voulez-vous les retirer dans la RAM?
  • Il y a peu de RAM, ils sont donc échangés et vous les ramenez dans la RAM. Ensuite, votre système les remettra en place dès que possible.

Il y a donc deux points principaux:

  1. Tout d'abord, votre système sera lent lorsqu'il n'y aura pas assez de RAM pour exécuter tous vos programmes à la fois. Swap vous aidera à exécuter plus de programmes, mais pas à passer rapidement à un programme rarement utilisé, qui peut être échangé. Aucun échange ne peut tuer celui qui est rarement utilisé ou envoyer à celui qui est actuellement utilisé une exception de mémoire insuffisante.
  2. Deuxièmement, le swap est une bonne chose, tout comme le swap, car vous avez de la mémoire RAM gratuite au prix de programmes que vous n'utilisez pas actuellement.

Bien qu'il n'y ait pas de problèmes de mémoire insuffisante avec trop de programmes, certains programmes peuvent allouer de la mémoire en fonction de la mémoire RAM actuellement disponible (peut-être que votre navigateur utilisera plus de mémoire cache et vous pourrez naviguer plus rapidement) et le noyau peut utiliser de la mémoire RAM libre pour la mise en cache du disque et optimisations similaires. Lorsque vous forcez votre échange à être vide, le noyau supprimera son cache de lecture et, par exemple, le démarrage d'une nouvelle instance de Firefox prendra plus de temps que lorsque Firefox est toujours dans le cache de disque.

Si vous souhaitez régler le comportement du noyau, consultez le paramètre swappiness .

Deux ressources supplémentaires contribuent par @ peter-cordes:

Si vous voulez vraiment avoir un échange vide, vous pouvez désactiver l'échange de façon permanente. Je ne vois pas pourquoi l'avoir allumé pendant une heure puis le vider a des avantages par rapport à ne pas avoir d'échange.


1
Voir également akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computers et lonesysadmin.net/2013/12/22/… pour plus de suggestions / détails de réglage.
Peter Cordes

5

Vous pouvez obtenir les mêmes résultats en disant au noyau de libérer les caches:

echo 3 > /proc/sys/vm/drop_caches

De cette façon, vous évitez le bref instant de famine possible et laissez le noyau décider de ce qui est nécessaire et de ce qui peut être rejeté.


0

Contrairement à l'idée commune SWAP en soi n'est pas mauvais .
Ce qui ralentit réellement votre système est l'activité du noyau qui déplace les données de la RAM vers le SWAP et les remet dans la RAM, le swappiness.
Le système le fait automatiquement car il est configuré avec le swappiness.
Cela fait que la mémoire des processus inactifs est transférée vers la partition d'échange de disque dur.
J'ai moi-même travaillé pendant des années avec une machine qui n'avait pas autant de mémoire RAM et j'ai toujours utilisé de la mémoire SWAP. Ma machine fonctionnait toujours bien jusqu'à ce que vous commenciez à replacer la mémoire dans la RAM, peut-être en essayant de fermer une application ouverte. Ensuite, la charge de travail a commencé à augmenter.

  • Ainsi, en nettoyant constamment votre mémoire SWAP, la charge de travail sur votre machine augmentera considérablement.
  • Les applications en cours d'exécution qui ont leur mémoire sur la partition SWAP peuvent endommager leur exécution.

Je vous suggère plutôt d'étudier de près l'application qui utilise votre mémoire sur la ligne de commande avec l' htopapplication et de décider de fermer une application. Le gnome-system-monitorpeut également vous donner un bon aperçu, dans son onglet Processus.
Si vous avez de grandes applications qui utilisent beaucoup de RAM. Ne les exécutez pas tous en même temps.

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.