Comment désactiver complètement le swap?

30

J'utilise Debian Sid, disque dur formaté avec ext4, fonctionnant sous Linux 3.1

Je me souviens sur les versions précédentes de Linux (peut-être avant 3.0), si je manque de mémoire et que le swap n'est pas activé, les programmes plantent généralement. Ceci est parfait pour mon environnement: navigation Web simple sans opérations critiques. Autrement dit, si je tombe accidentellement sur un mauvais site Web qui utilise trop de mémoire, il se bloque simplement sans rendre mon terminal inutilisable.

Mais dans ma configuration actuelle, l'ordinateur se bloque avec un violent débit d'E / S en arrière-plan. iotop révèle que kswapd0 est le coupable, ce qui signifie qu'il est dû à un échange. Après avoir utilisé swapon -spour déterminer les échanges qui étaient activés, j'ai utilisé swapoff -apour désactiver tous les échanges et à swapon -snouveau pour confirmer que tous les échanges étaient désactivés.

J'ai ensuite essayé à nouveau d'optimiser mon utilisation de la mémoire. Hélas, le comportement auquel je m'attendais ne s'est pas produit. Au lieu de cela, kswapd0 essaie encore et encore d'échanger la RAM et échoue car il n'y a pas d'espace d'échange. Parce qu'il n'abandonne jamais, mon ordinateur est verrouillé dans un gel éternel d'E / S, mauvais pour la santé de mon disque.

Suis-je en train de faire quelque chose de mal en essayant de le faire swapoff -a? Pourquoi le comportement est-il différent de ce qu'il était (probablement avant la version 3.0)?

syockit
la source
Cela n'a pas vraiment de sens. Faire le swapoff -a lui - même , s'il y avait des trucs dans le swap, générera beaucoup d'E / S (et peut entraîner la mort des processus s'il n'y a pas assez de RAM réelle disponible). Êtes-vous sûr que ce n'est pas la swapoff -acause de la «tempête» d'E / S?
Mat
1
Je suppose qu'il suffit de commenter la fstabligne sur le swap. Essayez si le comportement est le même.
enzotib
@Mat swapoff -adevrait désactiver l'échange de façon permanente, ce qui signifie qu'il devrait rester désactivé après le prochain redémarrage. Je l'ai confirmé. Pourtant, une «tempête» d'E / S se produit toujours pendant la session après le prochain redémarrage. Pour mémoire, la "tempête" d'E / S ne s'est pas produite au moment où je l'ai fait swapoff -acar le swap était de 0 à ce moment-là.
syockit
9
@syockit: swapoff -an'est pas permanent.
Mat
1
le chargement de la base de données a atteint environ 15% en 14 heures. Désactivé l'échange, et à la prochaine tentative, il est passé à 40% en 4 heures. Certes, le serveur est sous-alimenté et faible en RAM, mais sans swap activé, OpenSuSE fonctionne beaucoup plus rapidement pour ce seul processus. L'opinion du système d'exploitation sur "mieux" et la mienne diffère considérablement lors d'une simple charge de base de données mysql. a commenté le lecteur de swap dans / etc / fstab et a redémarré.
TheSatinKnight

Réponses:

15

La désactivation du swap ne fera pas ce que vous voulez. Vous obtiendrez toujours un débit d'E / S violent, mais il s'agira de pages propres plutôt que de pages sales.

Sans échange, le système compressera le cache des pages propres (non modifiées) à près de zéro, car ce sont les seules pages qu'il peut expulser de la mémoire physique. Il ne peut expulser les pages sales (modifiées) de la mémoire qu'en les écrivant pour permuter, sans échange, il n'a aucun moyen d'expulser les pages sales.

Lorsque vous manquez de mémoire physique, chaque processus devra charger ses pages de codes à partir du disque car il évite les pages de codes de processus précédentes. Le résultat sera une raclée violente et un travail excessif effectué par le sous-système de swap.

C'est un cas particulier d'un principe très important: pour un système bien conçu, vous ne pouvez pas le faire mieux fonctionner en réduisant ses choix. Linux est un système bien conçu. Supprimer le swap lui donne juste moins de choix, il n'est donc pas surprenant qu'il se comporte pire.

David Schwartz
la source
1
Cela n'est vrai que si vous allouez juste peu de mémoire. Un processus de fuite tentera généralement d'allouer beaucoup plus, et il sera donc tué tôt, libérant cette mémoire, au lieu de continuer à échanger le système à mort en essayant de prendre en charge plus d'allocations.Par conséquent, la désactivation de l'échange peut être utile lorsque vous ne maximisez votre utilisation de RAM qu'à partir d'un processus d'emballement.
psusi
1
Juste à court de toute mémoire sera à peu près toujours allouée. Linux est spécifiquement réglé de cette façon. Faites un cat /proc/meminfosur n'importe quelle boîte Linux typique après quelques heures de chargement.
David Schwartz
2
@syockit Si vous désactivez la pagination, vous ne pouvez exécuter aucun programme. La pagination est le mécanisme par lequel les fichiers sont lus lorsqu'ils sont mappés en mémoire.
David Schwartz
2
@psusi: les pages propres ne seront pas réduites au minimum lorsque vous aurez échangé. Il remplacera à la place les pages sales et anonymes qui n'ont pas été récemment utilisées. Bien sûr, de toute façon, vous obtiendrez une raclée violente si le jeu de travail dépasse la mémoire physique. Le fait est que, avec ou sans échange, vous obtiendrez beaucoup de coups violents avant de manquer de mémoire. La différence est que, avec le swap, le thrashing violent sera le swapping (pages sales, écriture et lecture). Sans swap, le thrashing violent sera des erreurs de code (pages propres, lecture seule).
David Schwartz
2
@psusi: Vous avez raison si le problème est un processus galopant qui explose rapidement en consommation de mémoire. Mais ce n'est pas ce dont parle le PO, qui est un processus qui consomme une mémoire excessive, mais pas illimitée ou massivement excessive. Au fur et à mesure qu'il se développe à travers le grand sweet spot (où le cache est serré), il augmentera de plus en plus lentement au fur et à mesure que le système se bloque.
David Schwartz
13

Une meilleure solution que de désactiver le swap, qui entraînera au mieux la suppression de processus aléatoires lorsque la mémoire est insuffisante, consiste à définir la limite de segment de données par processus pour les processus qui retirent des éléments du réseau. De cette façon, un navigateur en fuite atteindra la limite et mourra, plutôt que de rendre l'ensemble du système inutilisable. Exemple, depuis le shell

(ulimit -d 400000; firefox) &

Le nombre après -d est en kilo-octets. Vous devez expérimenter cela sur votre système pour choisir la meilleure valeur pour vos habitudes de navigation. Les parenthèses provoquent la création d'un sous-shell; la commande ulimit affecte uniquement ce shell et ses enfants, isolant ses effets du shell parent.

Kyle Jones
la source
Est-ce que cela fonctionnera pour le chrome, par exemple, où nous avons un tas de chromiumprocessus utilisant de petits morceaux de mémoire?
jberryman
@jberryman Non, les limites de mémoire sont par processus plutôt que par utilisateur.
Kyle Jones
Existe-t-il un moyen de lui envoyer un signal spécifié (par exemple, SIGHUP) lorsqu'il atteint la limite de mémoire?
Geremia
1
@Geremia No. Les appels système brk et sbrk cessent de fonctionner, ce qui fait que la plupart des choses se recroquevillent et meurent.
Kyle Jones
Si vous souhaitez opter pour un réglage manuel, je suggère d'utiliser la mémoire cgroup au lieu de ulimit, car avec la mémoire cgroup, vous pouvez définir une limite pour l'ensemble du groupe de processus et configurer le processus d'allocation de mémoire pour qu'il s'arrête et votre processus de stratégie de mode utilisateur peut décider quoi faire (par exemple envoyer des signaux, sélectionner le processus à tuer, augmenter la limite de mémoire à la volée). Voir kernel.org/doc/Documentation/cgroup-v1/memory.txt et kernel.org/doc/Documentation/cgroup-v2.txt pour plus de détails.
Mikko Rantalainen
4

Pour vous assurer que l'échange n'est pas utilisé, vous feriez mieux d'empêcher l'ajout de tout échange au démarrage. Cela peut être fait, selon le système, en désactivant le swapservice de démarrage ou en commentant simplement l'entrée de swap /etc/fstab.

En ce qui concerne votre raccrochage, la stop()fonction dans /etc/init.d/swappourrait donner un indice:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Remarquez la partie sur l' impasse . Vous pouvez essayer de faire umount -a -t tmpfsvous-même avant de désactiver le swap.


Modifier:

Probablement, vous pourriez également atteindre votre objectif en modifiant les sysctlparamètres (voir cette question ).

rozcietrzewiacz
la source
Je n'ai pas swapdans init.d, et je ne l' ai sur fstab, mais j'ai /etc/init.d/mountoverflowtmpque les montages tmpfspour les écritures de journal d'urgence. Le démon de swap est-il tmpfségalement utilisé ?
syockit
Vous pourriez l'avoir activé ailleurs - faites-le grep -RF swap /etc/si vous souhaitez le trouver. Mais pour désactiver un service, vous utiliseriez une commande comme service(IIRC; je n'utilise pas Debian moi-même).
rozcietrzewiacz
1
Swap lui - même ne pas utiliser tmpfs , car tmpfsest un système de fichiers (RAM) en mémoire. Mais d'autres services / programmes qui utilisent tmpfspeuvent s'appuyer sur l'échange d'une manière spéciale. Je ne sais pas vraiment, mais cela pourrait avoir quelque chose à voir avec la mise en cache ou une manière spéciale dont le tmpfspilote revendique l'accès à l'espace de swap.
rozcietrzewiacz
Il y a quelque chose sur la façon dont Linux gère la mémoire virtuelle que je ne comprends pas. J'ai désactivé l'échange de la plupart des façons possibles: via swapoffet via vm.swappiness=0. Pourtant kswapd0fonctionne toujours! Je me demande s'il s'agit d'une régression à partir des 2,4 jours…
syockit
5
@syockit C'est le comportement attendu. Le système échange toujours des pages propres (pages contenant des copies de données de fichier). Il ne nécessite aucun espace d'échange pour échanger des pages propres, car elles peuvent être relues à partir de sources autres que l'échange.
David Schwartz
2

Il est préférable de commenter l'entrée de partition de swap /etc/fstabplutôt que de l'exécuter swapoff -aaprès chaque démarrage.

J'ai le même problème avec kswapd0 sur mon matériel.

Le vm.swappinessparamètre du système de réglage ne m'aide pas.

sysctl -w vm.swappiness=0

J'ai googlé et lu beaucoup de messages, de listes de diffusion, et maintenant je pense que c'est un bug du noyau.

Lorsqu'il n'y a pas de partition de swap active et que la mémoire libre devient inférieure à un certain seuil (environ 300 Mo dans mon cas), le système ne répond plus en raison de la folie kswapd0.

Il est probablement reproduit avec une configuration et des conditions spéciales.

Pour quelqu'un, il est résolu par la réinstallation du système avec re-partitionnement pour les autres en créant un noyau personnalisé avec kswapd0désactivé.

gumkins
la source
2
Si kswapd0devient fou et que vous n'avez pas activé le swap, vous n'avez plus de RAM. Vos choix sont OOM Killer ou kswapd0. Linux va de pair kswapd0car le noyau suppose qu'il est plus important de terminer lentement que d'abandonner le processus. Pour les humains occasionnels, le seuil où le noyau pense qu'il y a encore suffisamment de progrès en avant est déjà glacialement lent et presque tout le monde préfère sélectionner OOM Killer.
Mikko Rantalainen
1

Sur mon système (debian sid 2016-11-15), j'ai fait ceci:

  1. désactivez le swap maintenant:

    swapoff -a
    
  2. commenter la ligne avec la partition de swap dans / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. désactiver le montage de swap dans systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Ce serait suffisant. Il y a une référence du /etc/initramfs-tools/conf.d/resumefichier d' échange . Je ne sais pas à quoi ça sert. Peut-être que ce fichier sera un problème lors du prochain redémarrage (je n'essaye pas encore de redémarrer, mon temps de disponibilité est précieux;)).

homer242
la source
1

l'ordinateur se bloque avec un violent débit d'E / S en arrière-plan. iotop révèle que kswapd0 est le coupable

J'ai trouvé un moyen (jusqu'à présent) d'éviter cela. Si vous souhaitez le tester et voir comment il fonctionne sur votre système, consultez le correctif du noyau dans cette question . Fondamentalement, il n'efface pas les Active(file)pages (au moins) sous la pression de la mémoire, ainsi le thrashing du disque (lecture constante) est réduit à presque rien et OOM-killer est autorisé à se déclencher en 1 seconde, au lieu de geler le système d'exploitation pour ce qui semble comme en permanence (ou au moins pendant plusieurs minutes). J'espère que de vrais programmeurs (dont je ne suis pas) amélioreraient le patch et en feraient une solution réelle, maintenant qu'ils voient que ce qu'il fait fonctionne pour ces situations.


la source
ce correctif du noyau est-il déjà intégré?
humanityANDpeace
@humanityANDpeace probablement pas, car ce n'est pas si bon (comme je ne suis pas programmeur), mais j'ai rencontré des problèmes, tels que: parfois, en fonction de la charge de travail, avec ce patch, vous pouvez manquer de mémoire dans les cas dans lequel sans ce correctif, vous n'auriez pas et donc OOM-killer tuera Xorg et xfwm4, À MOINS QUE je n'exécute echo 1 | sudo tee /proc/sys/vm/drop_cacheslorsque Active(file):(de / proc / meminfo) est supérieur à 2 Go (sur un système de RAM 16G) -il peut aller au maximum 4G