web-dev-qa-db-fra.com

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

Cela fait des années que je rencontre le même problème avec mes petites configurations Ubuntu: l’espace de swap utilisé augmente avec le temps. J'ai l'impression que c'est principalement parce que la mémoire allouée ne retourne jamais sur RAM alors qu'il y a suffisamment d'espace pour cette mémoire, sauf dans le cas d'une action de l'utilisateur telle que la désactivation de l'échange.

J'ai créé une courte commande cron pour automatiser cela, et j'ai de bons résultats:

#! /bin/sh

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

Mais comme il s’agit plus d’une astuce que d’une véritable solution à ce problème, je me pose des questions sur les raisons potentielles pour lesquelles ce pourrait être une mauvaise idée, ou comment puis-je améliorer ce script pour le rendre un peu plus intelligent?

26
Yvan Sraka

L'utiliser comme ça: oui, mauvais. Vous devez vraiment vérifier si la mémoire disponible est suffisante avant de désactiver le swap. Voir https://askubuntu.com/a/90399/15811 pour une meilleure version.

Aussi: êtes-vous sûr de cela? L'échange étant attribué ne signifie pas que l'échange est utilisé. La commande vmstat, les 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.

51
Rinzwind

Je dirais que c'est une mauvaise idée. Si vous pensez avoir de la mémoire libre et si un processus actif n'est pas déplacé de la permutation vers la RAM, vous n'avez pas autant de mémoire disponible que vous le pensez, ou le processus n'est pas aussi actif que vous le pensez est.

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

41
muru

C'est une mauvaise idée.

Le noyau commence à copier (sans déplacer) les données à échanger bien avant que la mémoire physique ne soit presque pleine, car si un processus nécessite une grande quantité de mémoire, toute page ayant 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 règle générale, cela se produit principalement pour les pages qui n'ont pas été consultées depuis longtemps, ce qui est un bon indicateur du fait qu'il est peu probable qu'elles le soient bientôt.

Si vous supprimez explicitement les copies, cela ne présente aucun avantage, car les données existent toujours dans la RAM, mais peuvent vous faire perdre du temps lorsque certains processus souhaitent allouer beaucoup de mémoire et que la permutation devient nécessaire.

Le noyau utilisera également toujours l’espace de permutation dès que la mémoire physique est saturée à plus de 50%. Par conséquent, ces nombres seront non nuls même si vous avez suffisamment de mémoire installée.

34
Simon Richter

C'est une mauvaise idée. Si cela était utile, le noyau Linux l'implémenterait de cette façon. Je ne crois pas qu'il y ait une raison de changer plus que quelques paramètres de réglage, puisqu'un tel script Shell 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 d'échange ne sont de toute façon pas utilisés. Pourquoi voulez-vous les ramener dans la RAM?
  • Il y a peu de RAM, ils sont donc remplacés et récupérés dans la RAM. Ensuite, votre système les mettra en swap à nouveau dès que possible.

Donc, il y a deux points principaux:

  1. Tout d'abord, votre système sera lent s'il n'y a pas assez de RAM pour exécuter tous vos programmes en même temps. 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 le système rarement utilisé ou envoyer une exception de mémoire insuffisante au système actuellement utilisé.
  2. Deuxièmement, le swap est une bonne chose et il en va de même pour le swap, car vous avez gratuitement RAM au coût des programmes que vous n'utilisez pas de toute façon.

Bien que trop de programmes ne génèrent pas de problèmes de manque de mémoire, certains programmes peuvent allouer de la mémoire sur la base du RAM actuellement libre (peut-être que votre navigateur utilisera plus de memcache et que vous pourrez naviguer plus rapidement) et que le noyau peut utiliser free RAM pour la mise en cache du disque et des optimisations similaires. Lorsque vous forcez le swap à être vide, le noyau supprime son cache de lecture, par exemple. le démarrage d'une nouvelle instance de Firefox prendra plus de temps que lorsque Firefox est toujours dans le cache du disque.

Si vous voulez ajuster le comportement du noyau, voyez le paramètre swappiness .

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

Si vous voulez vraiment avoir un échange vide, vous pouvez le désactiver de manière permanente. Je ne vois pas pourquoi le garder pendant une heure puis le vider présente des avantages par rapport au fait de ne pas avoir d'échange.

21
allo

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

echo 3 > /proc/sys/vm/drop_caches

De cette façon, vous éviterez le bref instant d'inanition possible de la mémoire et laisserez le noyau décider de ce qui est nécessaire et de ce qui peut être supprimé.

5
Alex C

Contrairement à l’idée courante, SWAP n’est pas mauvais .
En réalité ralentit votre système est l’activité du noyau qui déplace les données de la RAM vers le SWAP, puis dans la RAM, le swappinessname__.
Le système le fait automatiquement car il est configuré avec swappinessname__.
Cela fait que la mémoire des processus inactifs est transférée dans la partition de swap 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. Malgré tout, ma machine a bien fonctionné jusqu'à ce que vous commenciez à déplacer la mémoire dans la RAM, peut-être en essayant de fermer une application ouverte. Ensuite, la charge de travail a commencé à augmenter.

  • Donc, en nettoyant constamment votre mémoire SWAP, la charge de travail sur votre machine augmentera considérablement.
  • L'exécution d'applications dont la mémoire est située sur la partition SWAP peut altérer leur exécution.

Je vous suggérerais plutôt de regarder de près quelle application utilise votre mémoire sur la ligne de commande avec l’application htopet de décider de fermer une application. Le gnome-system-monitor peut également vous donner un bon aperçu dans son onglet Processus.
Si vous avez de grandes applications qui utilisent beaucoup de RAM. Ne les lancez pas tous en même temps.

0
Bodo Hugo Barwich