web-dev-qa-db-fra.com

Comment désactiver complètement l'échange?

J'utilise Debian sid, disque dur formaté avec ext4, en cours d'exécution sur Linux 3.1

Je me souviens des versions de Linux antérieures (peut-être avant 3.0), si je manque de mémoire et échange n'est pas activé, les programmes plantera. C'est parfait pour mon environnement: simple, navigation sur le Web sans opérations critiques. Autrement dit, si je lance accidentellement sur un mauvais site qui utilise trop de mémoire, il se bloque juste sans rendre mon terminal inutilisable.

Mais dans ma configuration actuelle, l'ordinateur se bloque avec un débit d'E/S violent en arrière-plan. iotop révèle kswapd0 être le coupable, ce qui signifie qu'il est dû à la permutation. Après avoir utilisé swapon -s Afin de déterminer les swaps qui ont été activés, je swapoff -a Pour désactiver tous les swaps et swapon -s Pour confirmer que tous les swaps ont été désactivés.

Alors j'ai essayé à nouveau maximiser mon utilisation de la mémoire. Hélas, le comportement que je pensais ne se produit pas. Au lieu de cela, kswapd0 tente à plusieurs reprises pour échanger sur le RAM et échoue car il n'y a pas d'espace d'échange. Parce qu'il ne donne jamais, mon ordinateur est verrouillé en gel lourd I/O éternelle, mauvais pour la santé de mon disque.

Ai-je fait quelque chose de mal à essayer de swapoff -a? Pourquoi est différent du comportement que ce qu'elle était (avant 3,0 fois probablement)?

30
syockit

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

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

Lorsque vous exécutez faible sur la mémoire physique, chaque processus devra charger ses pages de code à partir du disque, car elle expulse les pages de code de processus précédentes. Le résultat sera violent basculement et travail excessif effectué par le sous-système d'échange.

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

15
David Schwartz

Une meilleure solution que de désactiver le swap, ce qui entraînera au mieux des processus aléatoires à tuer lorsque la mémoire fonctionne bas, est de définir la limite de segment de données par traitement pour les processus qui tirent des trucs du net. De cette façon, un navigateur fuguelle va frapper la limite et mourir, plutôt que de provoquer une inutilisation de l'ensemble du système. Exemple, de la coquille

(ulimit -d 400000; firefox) &

Le nombre après-: est en kilo-octets. Vous devez expérimenter avec cela sur votre système pour choisir la meilleure valeur pour vos habitudes de navigation. Les parenthèses font la création d'un sous-(-shell; La commande Ulimit n'affecte que ce shell et ses enfants, isolant ses effets de la coque mère.

13
Kyle Jones

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

En ce qui concerne votre pincement, la fonction stop() fonction dans /etc/init.d/swap Peut 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
}

Notez la partie sur impression. Vous pouvez essayer de faire umount -a -t tmpfs Vous-même avant Tournage Swaper.


Edit:

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

4
rozcietrzewiacz

Il est préférable de commenter l'entrée de partition d'échange dans /etc/fstab que de courir swapoff -a après chaque démarrage.

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

Tuning vm.swappiness Paramètre système n'aide pas pour moi.

sysctl -w vm.swappiness=0

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

Lorsqu'il n'y a pas de partition d'échange actif et que la mémoire libre devient moins de seuil (environ 300 Mo dans mon cas), le système devient insensible à cause 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 d'autres en créant un noyau sur mesure avec kswapd0 désactivée.

2
gumkins

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

J'ai trouvé d'une manière (jusqu'à présent) pour éviter cela. Si vous souhaitez le tester et voir comment il se trouve sur votre système, voir le patch du noya Intérieur Cette question . Fondamentalement, il n'exprime pas Active(file) pages (au moins) lorsque sous pression de mémoire, la batterie de disque (lecture constante) est donc réduite à presque rien et oom-tueur est autorisée à déclencher dans une seconde. de geler le système d'exploitation pour ce qui semble être définitivement (ou au moins pendant de nombreuses minutes). J'espère que les programmeurs actuels (dont je ne suis pas) amélioreraient le patch et en font une solution réelle, maintenant qu'ils voient que ce qu'il fait fonctionne pour celles-ci situations.

1
user306023