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 -s
pour déterminer les échanges qui étaient activés, j'ai utilisé swapoff -a
pour désactiver tous les échanges et à swapon -s
nouveau 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)?
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 laswapoff -a
cause de la «tempête» d'E / S?fstab
ligne sur le swap. Essayez si le comportement est le même.swapoff -a
devrait 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 faitswapoff -a
car le swap était de 0 à ce moment-là.swapoff -a
n'est pas permanent.Réponses:
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.
la source
cat /proc/meminfo
sur n'importe quelle boîte Linux typique après quelques heures de chargement.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
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.
la source
chromium
processus utilisant de petits morceaux de mémoire?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
swap
service 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/swap
pourrait donner un indice:Remarquez la partie sur l' impasse . Vous pouvez essayer de faire
umount -a -t tmpfs
vous-même avant de désactiver le swap.Modifier:
Probablement, vous pourriez également atteindre votre objectif en modifiant les
sysctl
paramètres (voir cette question ).la source
swap
dansinit.d
, et je ne l' ai surfstab
, mais j'ai/etc/init.d/mountoverflowtmp
que les montagestmpfs
pour les écritures de journal d'urgence. Le démon de swap est-iltmpfs
également utilisé ?grep -RF swap /etc/
si vous souhaitez le trouver. Mais pour désactiver un service, vous utiliseriez une commande commeservice
(IIRC; je n'utilise pas Debian moi-même).tmpfs
, cartmpfs
est un système de fichiers (RAM) en mémoire. Mais d'autres services / programmes qui utilisenttmpfs
peuvent 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 letmpfs
pilote revendique l'accès à l'espace de swap.swapoff
et viavm.swappiness=0
. Pourtantkswapd0
fonctionne toujours! Je me demande s'il s'agit d'une régression à partir des 2,4 jours…Il est préférable de commenter l'entrée de partition de swap
/etc/fstab
plutôt que de l'exécuterswapoff -a
après chaque démarrage.J'ai le même problème avec kswapd0 sur mon matériel.
Le
vm.swappiness
paramètre du système de réglage ne m'aide pas.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
kswapd0
désactivé.la source
kswapd0
devient fou et que vous n'avez pas activé le swap, vous n'avez plus de RAM. Vos choix sont OOM Killer oukswapd0
. Linux va de pairkswapd0
car 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.Sur mon système (debian sid 2016-11-15), j'ai fait ceci:
désactivez le swap maintenant:
commenter la ligne avec la partition de swap dans / etc / fstab
désactiver le montage de swap dans systemd:
Ce serait suffisant. Il y a une référence du
/etc/initramfs-tools/conf.d/resume
fichier 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;)).la source
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
echo 1 | sudo tee /proc/sys/vm/drop_caches
lorsqueActive(file):
(de / proc / meminfo) est supérieur à 2 Go (sur un système de RAM 16G) -il peut aller au maximum 4G