Linux: comment débloquer explicitement tout ce qui est possible?

59

J'ai lancé quelque chose qui a pris beaucoup de mémoire et maintenant, tout est en retard. Je suppose que la mémoire de toutes les applications est sur le point d'être échangée afin de libérer de l'espace pour le processus gourmand en mémoire, et que maintenant, tout revient lentement à la RAM lors de l'accès.

Existe-t-il un moyen de déplacer explicitement tout ce qui est possible du basculement vers la RAM? Ou peut-être pas tout, mais juste quelques données de processus particuliers?

Kolypto
la source

Réponses:

59

Je recommanderais d'autoriser l'échange de contrôle de mémoire Linux normal dans les éléments réellement utilisés, tels qu'ils sont utilisés.

La seule chose à laquelle je peux penser est de désactiver l'échange, puis de le réactiver

sudo swapoff -a
sudo swapon -a

Cela suppose que vous ayez assez de mémoire physique disponible pour tout contenir en swap ...

Douglas Leeder
la source
4
Cela fonctionne, très lentement cependant :) Merci! Mais je crois toujours qu'il existe une solution plus élégante :)
kolypto
7
Attention, avec cette solution, tout sera retiré du swap de force ... si cela ne rentre pas dans la mémoire physique, le noyau lancera le tueur mortel de MOO. Je ne connais pas de commande "essayez de tout déplacer vers la RAM, mais échouez gracieusement si ce n’est pas possible".
Juliano
1
J'ai essayé et découvert que cela fonctionne très lentement. Il est donc possible de surveiller la RAM libre et de tuer swapoffsi la mémoire est insuffisante: dans ce cas, l'espace d'échange restera fonctionnel :)
kolypto
2
Je ne suis pas sûr que tuer l'échange va réellement arrêter l'opération. Cela dépend de la façon dont cela est mis en œuvre.
Douglas Leeder
3
Il semble que la commande swapoff effectue quelque chose comme "ne pas autoriser l'échange de nouvelles écritures", alors que tout autre processus en cours (qui utilisait / utilise le swap) peut toujours "libérer le swap". C'est peut-être pourquoi il semble aller si lentement. Cela ne semble pas causer les MOO comme le disait une autre personne (j'utilise Ubuntu Bionic). Ce ne serait probablement le cas que si "des processus supplémentaires (ou existants) commencent à utiliser une nouvelle mémoire" (c'est-à-dire de vrais MOO). Le swapoff / swapon est donc une excellente solution, semble-t-il. Doux / stable. Cela suppose que vous n'initiez pas plus de mémoire à l'aide de processus (ni n'augmentez la consommation de ceux-ci en cours d'exécution).
Roel Van de Paar
13

Vous pouvez l'accorder avec un nombre compris entre 0 et 100 /proc/sys/vm/swappiness.

Ce contrôle est utilisé pour définir l'agressivité du noyau à échanger les pages de mémoire. Des valeurs plus élevées augmentent l'agressivité, des valeurs plus faibles diminuent la quantité d'échange . Une valeur de 0 indique au noyau de ne pas lancer de permutation tant que le nombre de pages libres et sauvegardées sur fichier est inférieur à la limite supérieure dans une zone.

La valeur par défaut est 60.

sntg
la source
13
N'utilisez pas directement / proc / sys, utilisez sysctlplutôt la commande. Dans ce cas, c'est sysctl vm.swappiness=x.
Juliano
7
Je ne pense pas que même un swappiness égal à zéro provoque la mise en mémoire explicite de pages déjà permutées dans la mémoire principale?
Douglas Leeder
1
@ Douglas a raison. vm.swappiness contrôlera principalement la décision de déplacer ou non des éléments à échanger ou de réduire le nombre de caches et de mémoires tampon lorsque la mémoire est demandée.
Juliano
@ Juliano, pourquoi / proc / sys ne devrait-il pas être utilisé?
James
@James Parce que / proc / sys est l'interface de niveau inférieur utilisée pour modifier et interroger la configuration du noyau (il s'agit du "détail de la mise en oeuvre"). Linux fournit la sysctlcommande de niveau supérieur pour l'interaction utilisateur. Le résultat final est identique, mais les interfaces de niveau supérieur sont généralement préférées pour une interaction directe de l'utilisateur. Un peu comme démarrer le moteur en court-circuitant les câbles d'allumage (niveau inférieur) au lieu de tourner la clé (niveau supérieur).
Juliano
5

Linux gère très bien la mémoire et vous ne devriez pas vous y opposer. Le paramètre vm.swappiness (mentionné précédemment) ne le gêne pas. Vous êtes plus susceptible de rencontrer des problèmes étranges lorsqu’il fait les choses autrement.

Qu'est-ce que vous avez lancé qui était si mémoire faim? Peut-il être réglé? S'il n'a pas ses propres directives de limite de mémoire, vous pouvez également consulter ulimit.

Carpe Noctem
la source
Dans mon cas c'était convert -density 200 file.pdf jpegs/file.jpg. Pour une raison quelconque, il utilise beaucoup de mémoire, mais vous avez raison: il peut être réglé. Quoi qu'il en soit, la situation est possible avec n'importe quelle application :)
kolypto Le
1
Je suis d’accord avec cette réponse - vous devriez probablement laisser les opérations normales sur la machine pour permuter ce qui est réellement nécessaire.
Douglas Leeder
converta pour -limitargument de contrôler l'utilisation de la mémoire par rapport à la mémoire, et vous devriez les consulter. Réglage -limit memory 512MBou similaire serait bien. Il serait également probablement utile de spécifier un MAGICK_TEMPORARY_PATH explicite et de le nettoyer une fois votre commande terminée.
Slacy
3

Si vous avez de la mémoire disponible pour toutes vos applications, vous pouvez régler le swappiness sur 0 pour que rien ne soit échangé. Par exemple, qemu-kvm est une cible importante pour que le VMM soit échangé, car il "semble" être inactif la plupart du temps. J'ai vu jusqu'à 80% de la mémoire d'une mémoire qemu-kvm écrite en swap. Les ordinateurs virtuels fonctionnant dans qemu-kvm deviendront presque insensibles car ils sont à court d'échange (bien que l'invité n'ait aucune idée de ce qui se passe). La machine virtuelle invitée pensera que ses performances sont excellentes, même si, en réalité, elle traîne terriblement. Lorsque de nombreuses machines virtuelles se «réveillent» et commencent à faire des choses, la charge peut atteindre une charge moyenne de plus de 30, même sur du matériel d'entreprise avec une mémoire et un disque suffisamment volumineux. J'imagine que c'est un échec dans la conception qemu-kvm prête à l'emploi.

J'espère que ça aide quelqu'un.

Gruic
la source
Je crains que ce ne soit pas tout à fait exact
Marc.2377
2

Je vous déconseille d'essayer de surpasser le sous-système de machine virtuelle dans le noyau. Il est EXTREMEMENT peu probable que vous disposiez de suffisamment d'informations pour prendre de meilleures décisions. Et si vous le forcez à faire quelque chose de mal, vous finirez par ralentir les choses.

Michael Kohne
la source
9
Il y a des cas où je veux faire ce que le PO veut. Si, accidentellement, je laisse un processus s’émeuder et reprends toute ma mémoire RAM + swap, je peux attendre 15 secondes à chaque fois que je change d’application pour que sa mémoire sorte de swap ou tout simplement forcer et que tout se déroule aussi vite que d’habitude.
Alex
Eh bien ... je veux que le "unswap" se produise pendant ma pause-café, pas à chaque fois que j'essaie de changer d'application. Est-il "dépassé le sous-système de la VM" quand je veux l'informer d'une pause-café?
Klaws
1

Si vous parvenez à redémarrer le système, vous devriez le faire (et prendre moins de temps que d’essayer une autre solution).

Maximus Minimus
la source
1

Pour copier une partie de ma réponse de cette question .

Pour que vous sachiez comment fonctionne le swappiness accordable. Cela fonctionne en indiquant au sous-système de machine virtuelle de rechercher les pages à permuter lorsque le% de mémoire mappée aux tables de pages de processus + valeur de swappiness est> 100. Ainsi, un paramètre de 60 fera en sorte que le système commence à paginer les pages obsolètes à partir du tableau de pages de processus. lorsqu'il utilise plus de 40% de la mémoire de votre système. Si vous souhaitez autoriser vos programmes à utiliser davantage de mémoire aux dépens du cache, vous souhaiterez réduire la valeur swappiness.

3fluence
la source
Je ne pense pas que la mémoire de programme par rapport au cache soit le problème ici. Je pense que c'est la mémoire d'application par rapport à la mémoire non utilisée. Et je ne pense pas que le swappiness affectera cela.
Douglas Leeder
0

Le processus est-il toujours en cours d'exécution? Ouvrez un terminal et voyez si vous pouvez repérer le ou les processus qui ont été lancés. (ps aux | grep nomprocess peut être un peu plus facile) Utilisez le PID kill -9 pour les tuer s'ils sont toujours en cours d'exécution. Faites attention à ce que vous tuez. Si vous ne connaissez pas le processus, ne le tuez pas! Aussi, postez la sortie de free -m afin que nous puissions voir si vous utilisez toujours beaucoup de swap.

Si les choses continuent à ralentir, il se peut que tout ce que vous avez lancé soit toujours en cours d'exécution. Je ne désactiverais jamais l'échange si vous ne savez pas vraiment ce que vous faites ou si vous aimez vivre à la limite. =)

Jdoss
la source
0

Je crois qu’il n’existe aucun moyen vraiment efficace de forcer les données de disque non échangées sous Linux à partir de la mémoire. Lorsque swapoff / swapon est une solution efficace, mais elle est sale et peut facilement rendre votre système instable. Dans les cas où il y a plus de données dans l'échange que dans la mémoire libre, il sera difficile d'imaginer une politique efficace que Linux puisse employer pour décider quelles données vont être stockées en mémoire et quelles pièces sont conservées sur le disque.

Résumé: Laissez simplement Linux restaurer progressivement ses performances de manière normale. Son sous-système de machine virtuelle est organisé de telle manière qu'il s'efforce et se déplace constamment vers un état d'équilibre idéal.

ZarathustrA
la source
-2

Vider le cache des tampons

Si vous souhaitez les vider, vous pouvez utiliser cette chaîne de commandes.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Vous pouvez indiquer au noyau Linux de supprimer divers aspects des éléments mis en cache en modifiant l'argument numérique de la commande ci-dessus.

REMARQUE: nettoyez la mémoire des objets inutiles (noyau 2.6.16 ou plus récent). Assurez-vous toujours de lancer d'abord la synchronisation pour vider les choses utiles du disque !!!

  • Pour libérer pagecache:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Pour libérer les dentiers et les inodes:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Pour libérer pagecache, dentries et inodes:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Ce qui précède est destiné à être exécuté en tant que root. Si vous essayez de les utiliser en utilisant sudo, vous devrez modifier légèrement la syntaxe pour obtenir un résultat similaire à celui-ci:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
slm
la source