Le swap est-il un anachronisme?


43

J'ai utilisé unix pendant un bon bout de temps, et ces deux dernières années, j'ai l'impression que l'échange est un anachronisme, mais j'aimerais savoir ce que les autres en pensent.

Mon argument est à peu près ceci (en supposant qu’aucun ulimit global ni aucun twiddling des paramètres de MOO):

There is little value in swap because if you need to swap out to disk, 
odds are it's going to be a vicious cycle where an app will continue 
to eat not only real memory, but swap as well until it gets OOM 
reaped (_if_ it gets OOM reaped). 

If you have swap enabled, it will only prolong this death march to 
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.

Without swap, it will probably get OOM reaped sooner (if at all)

Pour tout service dont les performances sont optimisées, je pense que la compréhension des limites supérieures de son utilisation des ressources serait la clé du réglage, auquel cas vous savez combien vous avez besoin.

Je ne peux pas imaginer beaucoup de situations (certaines, mais pas beaucoup) dans lesquelles vous suspendez un processus en cours et que celui-ci s'échange pour laisser la place à d'autres choses, mais vous perdriez quand même vos sockets si vous le faisiez. core-dump via gcc ou copier manuellement la mémoire serait fonctionnellement équivalent.

Je ne voudrais certainement pas échanger sur un système embarqué (même s'il dispose d'un RAM plus petit), si vous êtes à court de RAM, je préférerais que mon processus prenne fin plutôt que de déchirer une mémoire flash d'un million d'écrits par secteur. conduire sur un week-end en nivelant les secteurs à l'usure.

Y a-t-il des raisons impérieuses de garder swap autour de la barbe unix?

UPDATE réponses && analyse:

  • CONFIRMÉ? - fork () nécessite la même quantité de mémoire pour le processus enfant que le processus parent

    Modern fork () est une copie sur écriture pour les enfants sous POSIX (en général), mais Linux et FreeBSD en particulier, et j'assume OSX par extrapolation. Je considère cette partie du bagage anachronique que l’échange comporte.

    Curieusement, cet article de Solaris affirme que même si Solaris utilise la copie sur écriture avec fork (), vous devez avoir au moins 2x (!) La taille du processus parent en mémoire virtuelle libre pour que fork () ne soit pas soumis à la merde. milieu. Bien que l’élément Solaris masque quelque peu l’argument selon lequel le swap est un anachronisme - je pense que suffisamment de systèmes d’exploitation implémentent correctement CoW de telle sorte qu’il est plus important de dissiper le mythe que de le marquer comme une justification supplémentaire du swap. Puisque. Avouons-le. À ce stade, les personnes qui utilisent réellement Solaris ne sont probablement que des gars d'Oracle. Aucune infraction, Solaris!

  • CONFIRMED - Les fichiers tmpfs / ramfs peuvent être échangés en tant que conviction lorsque tmpfs / ramfs se remplit

    N'utilisez pas tmpfs / ramfs sans limite! Définissez toujours explicitement la quantité de RAM que vous souhaitez que tmpfs / ramfs utilise.

  • PLAUSABLE - Ayez un petit échange 'juste au cas où'

    Un de mes anciens patrons avait l'habitude de dire: "vous ne savez pas ce que vous ne savez pas" - vous ne pouvez pas prendre de décision en vous basant sur des informations que vous n'avez pas encore. C’est un argument plausible pour un échange pour moi, cependant - je suppose que le type de choses que vous feriez pour détecter si votre application est en cours de transfert serait plus lourd que de vérifier pour voir si malloc () réussit ou attraper l’exception de un nouveau () échoué.

    Cela peut être utile dans les cas où vous utilisez un ordinateur de bureau et que vous avez un tas de choses aléatoires, mais même si quelque chose se gâtait, je préférerais que ce soit une MOO récoltée plutôt que de plonger dans l'enfer. Ce n'est que moi.

  • BUSTED! - Sous Solaris , l’échange est important pour plusieurs raisons

    tmpfs - États La quantité d'espace libre disponible pour tmpfs dépend de la quantité d'espace de swap non alloué dans le système. La taille d'un système de fichiers tmpfs augmente pour accueillir les fichiers qui y sont écrits, mais il existe des compromis inhérents aux gros utilisateurs de tmpfs. Tmpfs partage les ressources avec les données et les segments de pile des programmes en cours d'exécution. L'exécution de très gros programmes peut être affectée si les systèmes de fichiers tmpfs sont proches de leur taille maximale autorisée. Tmpfs est libre d'allouer la totalité de l'espace de swap du système à l'exception de 4 Mo.

    Faits et mythes sur les états de swap de Solaris La mémoire virtuelle consiste aujourd'hui en la somme totale de la RAM physique et de l'espace de swap sur le disque. Solaris NE requiert aucune configuration d’espace de swap. Si vous choisissez cette option, une fois que la RAM est pleine, vous ne pourrez plus démarrer de nouveaux processus. .

    Je ne sais pas si cela signifie que la carte virtuelle maximale que vous pouvez créer est un échange + échange , ou si vous pouvez toujours faire quelque chose comme mmap (), un fichier plus grand que ram et vous fier à l'initialisation lente de mmap (). peut probablement exécuter Solaris ces derniers temps sans échange, il semble que cela soit moins convivial que d’autres systèmes d’exploitation POSIXy.

  • BUSTED! Les outils d'hibernation Linux les plus répandus semblent s'appuyer sur l'échange

    Par défaut, TuxOnIce semble s'appuyer sur l'échange pour l'hibernation - bien qu'il existe d'autres serveurs. Cependant, si vous n'utilisez pas une boîte qui doit hiberner, je maintiens quand même l'affirmation selon laquelle "swap est anacronistique sur linux"


Je n'ai pas beaucoup de * x barbe (quelques cheveux encore;), mais mes 2 centimes seraient que le fait d'avoir un "peu" d'échange donnerait à votre système une certaine robustesse. En tant que lieu directement de MOO, vous échangeriez plutôt si vous dépassez les limites de votre système. Bien sûr, si vous dépassez réellement les limites de votre système, celui-ci finira par planter / arrêter / se décomposer en nucléaire / tout ce que vous pouvez imaginer. Donc, donner un peu de corde pour jouer avec;)
Ouki

1
Le problème avec fork () est en fait vrai si vous configurez votre système pour ne jamais surcharger la RAM (ce n’est pas la valeur par défaut). Maintenant, pourquoi n’auriez-vous plus besoin de ce réglage, je n’ai aucune idée. Ce n'est pas utile pour le traitement en temps réel.
Josué

@Jushua: Le surengagement de la mémoire peut ne pas être la valeur par défaut, ni même possible selon le système d'exploitation.
Jlliagre

J'ai un serveur NAS avec 8 Go de RAM, il fonctionnera jusqu'à 2 ordinateurs virtuels. Je n'ai pas mis d'échange. S'il commence à échanger lourdement, il est de toute façon déjà mort. Donc, cela soutient parfaitement votre argument. D'autre part, j'utilise toujours mon ordinateur de bureau rouillé avec une limite de 1 Go de RAM et il me faut un échange pour gérer la mémoire clairsemée. Cela ralentit un peu la tâche mais aidez-moi à ouvrir simultanément Firefox et d'autres applications.
Huygens

Je trouve que le déclencheur tueur OOM est trop tardif, seulement après que toutes les caches ont été vidées et que le système est devenu lent. Pour garder mon système en forme, j'utilise earlyoom ou nohang pour faire le même travail mais plus tôt! Peut être utilisé avec ou sans échange.
joeytwiddle

Réponses:


28

Ne confondez pas (l'échange) (en tant que zone de disque) et (en) échange (en tant que méthode pour déplacer des pages de mémoire de la RAM vers le disque et réciproquement).

Les swaps excessifs sont à éviter pour des raisons de performances, mais le fait d’avoir une zone de swap n’est pas nécessairement un problème.

Sur les systèmes, tels que Linux, la mémoire surchargée, c’est-à-dire permettant aux processus d’allouer plus de mémoire que la quantité disponible, manque de mémoire vive sans suffisamment d’échange pour gérer la situation, ce qui déclenchera le tueur de MOO. Vous devez faire confiance à l'algorithme utilisé pour sélectionner le "bon" processus à tuer et accepter qu'un ou plusieurs de vos processus soient tués sans avoir la possibilité de s'arrêter correctement. Voici une analogie célèbre qui explique pourquoi le tueur de MOO pourrait ne pas être une bonne idée du tout.

Sur des systèmes comme Solaris, ne surchargez pas la mémoire, c’est-à-dire assurez-vous qu’une réservation de mémoire est toujours sauvegardée par de la mémoire virtuelle, qu’elle soit en RAM ou sur disque, il est absolument nécessaire d’avoir une zone de swap suffisante, sans quoi une partie potentiellement importante de la RAM sera nécessaire. perdu.


1
Etes-vous sûr que le point concernant Solaris est toujours vrai? blogs.oracle.com/jimlaurent/entry/solaris_faq_myths_and_facts états: La mémoire virtuelle est constituée de la somme totale de la RAM physique et de l'espace de swap sur disque. Solaris NE requiert aucune configuration d’espace de swap. Si vous choisissez cette option, une fois que la RAM est pleine, vous ne pourrez plus démarrer de nouveaux processus. Je pense que je vois ce que vous voulez dire: si vous vouliez utiliser un objet plus volumineux qu'un bélier physique sans échange, vous ne pourriez pas? (Peu importe que mmap soit un initialiseur paresseux).
synthesizerpatel

5
Oui, je suis sûr que mon propos à propos de Solaris est toujours vrai. Même si la citation de votre Jim Laurent est vraie, c’est-à-dire que Solaris ne demande pas d’échange, ne pas échanger signifie que toutes les réservations de mémoire (c.-à-d. Malloc) doivent être sauvegardées en RAM, même si une partie de la mémoire allouée n’est pas utilisée. Cela n’est pas lié aux grands mmap ou tmpfs, bien que tmpfs soit également une raison pour laquelle vous voudrez peut-être échanger avec Solaris (et Linux également).
Jlliagre

1
Mise à jour pour Linux: la surutilisation peut être désactivée, l'algorithme de MOO peut être modifié, vous pouvez même avoir votre propre gestionnaire de MOO avec cgroups.
Peter

1
@peterph Désactiver la surenchère sur Linux rend le swap encore moins anachronique. Si vous ne faites pas un surengagement, vous devez vous assurer que vous disposez d'une zone d'échange suffisamment grande pour que toutes les réservations puissent être sauvegardées.
Juin

1
La mémoire virtuelle réservée par un fork dépend de la taille du programme. Supposons que votre machine virtuelle Java utilise 2 Go de mémoire, elle nécessitera temporairement 2 Go de plus. Si cela se produit alors que vous avez moins de 2 Go disponibles ou plusieurs fois simultanément, une ou plusieurs fourchettes échoueront. Il s'agit d'une situation courante avec les systèmes d'exploitation non surchargés, et avec Linux également lorsque le dépassement est désactivé. Il peut être facilement corrigé en disposant d’une zone d’échange suffisamment grande, ce qui est à mon sens une solution bien meilleure que le surmenage de mémoire.
Juillet

3

Je connais une raison de continuer à échanger. J'ai une application qui utilise autant de mémoire que je peux me permettre de configurer pour mon système. Il utilise Hadoop, qui, à une étape du traitement, effectue un fork et un exec pour exécuter une seule commande unix (je pense "uname" ou "utilisateur" ou quelque chose pour lequel ils ne pouvaient pas trouver un équivalent Java). Il semble que Java ne fasse pas de vfork avec une copie sur la sémantique d'écriture comme le ferait une application native. Si je lance mon application avec 4 Go de RAM, la fork utilise 4 Go de RAM supplémentaires, mais la libère rapidement. Si je n'avais pas 4 Go d'espace d'échange contre Hadoop, je devrais payer 8 Go de mémoire vive pour disposer de 4 Go d'espace mémoire pour mon application.


C'est un bon point, mais pas le reflet de la méthode fork () moderne - Sous Linux et FreeBSD (et, apparemment, OSX?), Fork () est implémenté via l'utilisation de pages de copie sur écriture. La copie sur écriture (ou COW) est une technique permettant de retarder ou d'empêcher totalement la copie des données. Plutôt que de dupliquer l'espace d'adressage du processus, le parent et l'enfant peuvent partager une seule copie. Cependant, les données sont marquées de telle manière que, si elles sont écrites, un duplicata est créé et chaque processus reçoit une copie unique. Citations: forums.freebsd.org/showthread.php?t=26355 et page de manuel Linux pour fork ()
synthesizerpatel le

Bien que vrai, certaines pages ne peuvent pas être marquées COW. Par exemple, les pages utilisées pour la pile de noyau du nouveau processus enfant et les pages utilisées pour les structures de données internes (the files_struct, the struct signals, the task_structet autres). En outre, de nombreuses pages exécutables ne sont pas un code dépendant de la position (PIC). Par conséquent, les pages de code exécutable modifiées par le chargeur dynamique ( ld-linux.so) doivent avoir un espace de swap réservé pour elles, même si rien n’est écrit immédiatement. C'est pourquoi j'aime Linux. vous pouvez désactiver l'échange et le système fonctionne toujours. :)
Azhrei

3

Je ne peux pas ajouter techniquement à la discussion, mais je peux donner quelques exemples. Mon ancien ordinateur portable (2 Go de RAM kunbuntu lucid) fonctionne généralement avec un swap à 0. Lorsque je lance la transmission (client bittorrent) avec un certain nombre de torrents pouvant utiliser collectivement 100 connexions, mon swap peut monter en flèche. Cela devient encore pire quand j'ai un XP vm en cours d'exécution qui utilise 1 Go de mémoire réelle.

J'ai vu d'autres commenter que des processus gourmands en mémoire, tels que le rendu graphique, peuvent également basculer dans l'échange. Si vous ne le faites que de temps en temps, alors ce n'est pas un problème.

En ce qui concerne les problèmes de MOO, le swap peut réellement vous sauver la vie, car il vous permet de gagner du temps entre l'identification du problème et les problèmes qui se posent. Beaucoup de choses utilisent presque toute ma mémoire, alors je ne fais pas attention à cela, mais quand l'échange commence, je le remarque et commence à chercher le problème - avant qu'il ne me mordille.


Eh bien oui, les systèmes existants ne peuvent pas faire grand chose sans la permutation d'échange. J'ai toujours un ancien sous-carnet de notes avec 256 Mo de RAM, où swap est nécessaire pour démarrer à peu près n'importe quel programme. Je crois cependant que la question concerne les systèmes modernes.
Dmitry Grigoryev

3

Il existe une application très intéressante pour l’espace de swap: extension de la RAM en plaçant l’espace de swap sur un périphérique de stockage utilisant la RAM, afin de surmonter les limitations de la RAM système installable.

Jetez un oeil à ce gadget http://techreport.com/articles.x/16255 Il s'agit essentiellement d'une interface de S-ATA à DDR2-RAM. Vous pouvez y insérer jusqu'à 64 Go de RAM. En plaçant l’espace de swap sur l’un de ceux-ci, vous bénéficiez d’une importante RAM supplémentaire. Bien sûr, ce n'est pas aussi rapide que la RAM système normale. Mais cela transforme en quelque sorte la RAM système en une sorte de couche de cache supplémentaire.


1
Envisager son prix (549 $) ne serait pas plus efficace d'investir 100 $ dans une carte mère supportant 64 Go de RAM ?
Dmitry Grigoryev

1
@DmitryGrigoryev: Bien sûr. Mais parfois , vous êtes obligé d'utiliser ce type particulier de matériel (parce que pour des raisons de toux certification système médical toux ) , mais aussi de traiter des ensembles de données ridiculement grandes produites en très peu de temps (pensez scanners de tomographie, datarates> 3GiB / s).
datenwolf

Ne devriez-vous pas également certifier le lecteur de RAM en tant que dispositif médical? ;) Mais oui, j'ai compris le point.
Dmitry Grigoryev

1
@DmitryGrigoryev: En effet, vous devez le faire. Cependant, certifier un tel disque S-ATA est bien plus facile que de certifier toute une carte mère. Lorsque vous achetez des ordinateurs utilisés dans du matériel médical, vous achetez généralement le plus de composants possible certifiés. Pour les pièces où il n’existe aucune certification disponible, vous devez alors effectuer vous-même les tests et la certification nécessaires. En particulier lorsque vous travaillez dans la recherche, où l'accent est mis sur la sécurité des patients et où les données ne sont pas utilisées pour la planification du traitement, c'est la solution la plus rentable et la plus rapide. BT; DT.
datenwolf

3

J'utilise Linux et Windows sans échange (fichier d'échange, dans la nomenclature Windows), sur les ordinateurs portables / ordinateurs de bureau de 4 Go ou plus. Il y a quelques occasions où l'épuisement de la mémoire se produit, je viens de les traiter. Je pense que le système est plus vif de cette façon, ce qui me tient le plus à cœur. Aucune exigence particulière sur ma charge de travail cependant.

Choses que j'ai apprises:

  • Windows "perd" sa mémoire avec le temps. Après environ 20-30 jours de disponibilité, j'arrive à un moment où je préfère redémarrer. Je ne sais pas pourquoi cela se produit. J'imagine qu'il peut s'agir d'une fuite de certains pilotes ou de l'antivirus. Lorsque vous avez un fichier de pagination, je pense qu’il peut mettre cette fuite de mémoire dans le fichier de pagination. Il serait donc plus difficile de remarquer ce problème sur un système Windows classique.
  • Firefox traite beaucoup mieux avec peu de mémoire que Chrome. Firefox vous avertit et fonctionne toujours, Chrome se bloque.

2

Je pense que vos arguments sont tout à fait valables pour un serveur , dans lequel les performances sont importantes, et savoir quelle application agira ensuite peut ne pas être prévisible.

Pour un ordinateur de bureau cependant, je trouve que l’échange est utile lorsque j’applique et jaillit des tâches.

Par exemple, si je travaille sur une tâche en utilisant une application Aet que je découvre ensuite que je dois utiliser une application Bpour quelque chose (une sous-tâche ou une interruption), il est alors plus facile mentalement pour moi de laisser Apermuter sur le disque pendant que je travaille. dans Bque de fermer Aet puis n'oubliez pas de le redémarrer après.

Cela est particulièrement vrai si Acontient un état non sauvegardé qui ne serait pas restauré lors de son redémarrage.

Qu'il soit plus rapide de pousser et de tirer Avers / depuis le swap, ou de le fermer et de le redémarrer, dépend de l'application. (Certains parviennent à avoir un démarrage lent mais une petite taille résidentielle.)

Cependant, je conviendrais qu'une meilleure solution pour améliorer la productivité serait d'installer quelques RAM supplémentaires.


Mise à jour: Après avoir écrit cette réponse, je possédais un ordinateur portable avec beaucoup de RAM et un disque dur lent. Dans ce cas, mon conseil est inversé! Voici un résumé des avantages et des inconvénients .
joeytwiddle

1

Sur mon système, / tmp se déverse pour échanger s’il engloutit trop de RAM.

C'est beaucoup plus rapide que d'utiliser un vrai système de fichiers pour / tmp.


C'est assez dangereux - si j'ai besoin de ramfs, je spécifie dans fstab (ou options) de définir explicitement la taille. Il est tout aussi probable qu'un programme devienne fou de singe avec l'allocation de mémoire, car il commencera à créer des fichiers dans / tmp. L'échange serait un mauvais endroit pour que les fichiers ramfs apparaissent (surtout si vous comptez sur ramfs pour la vitesse)
synthesizerpatel

2
Je dépasse souvent la taille de la RAM. Les fichiers tmpfs sauvegardés par swap sont nettement plus rapides que ext2, même en cas de débordement.
Josué

Utile à savoir - et sera probablement un futur sujet de recherche à examiner - je serais toujours préoccupé par une application remplissant mon bélier par proxy de tmpfs / ramfs dans / tmp. Cela me donne les heebie jeebies!
synthesizerpatel

Puis définissez la limite = taille du swap.
Josué

Incidemment, c'est la différence entre ramfs et tmpfs. Les tmpfs peuvent être échangés alors que ramfs ne le peut pas.
Joshua

1

Il y a beaucoup de raisons, quand swap est utilisé.

Habituellement, lorsque le système ne dispose pas de suffisamment de mémoire physique, le noyau peut échanger certaines applications (en fait, certaines parties de la mémoire utilisées par des applications non exécutées).

Plus tard, lorsque ces applications doivent faire quelque chose (par exemple, certaines données arrivent sur un socket ou une minuterie est déclenchée) - le noyau va échanger une autre application.

Un autre exemple d'utilisation de swap est suspendre sur disque.

En ce qui concerne les périphériques intégrés, ils peuvent tous être divisés en deux grands groupes (au moins):

  1. ils exécutent Linux / Windows ou des systèmes non-RTOS similaires (OS temps réel); ou
  2. ils courent un RTOS.

Bien sûr, il y a des périphériques qui n'exécutent que du code (une sorte de microcontrôleur), etc. Je ne les décrirais pas car ils ne possèdent pas de système d'exploitation. Par conséquent, discuter d'échange est insensé pour de tels périphériques.

Le premier groupe de périphériques intégrés (exécutant certains systèmes d'exploitation) peut utiliser (et généralement, ils utilisent) l'échange. Et en général, ces périphériques utilisent le swap de la même manière que les ordinateurs de bureau et les serveurs.

Le second groupe de périphériques (exécutant le RTOS) n’utilise pas du tout le swap, car le RTOS a une limite de temps pour répondre à un événement, et

  • lire à partir d'échange peut prendre un temps imprévisible
  • les périphériques ont un nombre prédéfini (à la compilation) de tâches qu'il n'est pas nécessaire d'échanger

BTW, il y a beaucoup de description de la façon dont linux utilise le swap, l’un d’eux est http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page
Utilisation de Windows une approche similaire.


De plus, swap est nécessaire pour l'hibernation (suspension sur disque), sauf si vous utilisez quelque chose comme TuxOnIce.
Renan

1

Il me semble que l'hibernation et le sommeil hybride ont tous deux besoin d'espace d'échange sous Linux .

Je n’utilisais jamais l’espace / partition de swap sous Linux avant d’être confronté à la nécessité d’utiliser Hybrid Sleep. En effet, le système ne me permettait pas de dormir sur un niveau de batterie critique, car il était géré par Upower, qui ne faisait que choisir entre Shut-Down, Hibernate et Hybrid. -sommeil. (plus ici )


0

Quelques utilisations intéressantes que j'ai vues sont des processus qui utilisent beaucoup de mémoire, mais pas de performances critiques. Un cas était un ancien Firefox qui avait une mauvaise fuite de mémoire. Cela remplirait la RAM et déboucherait sur un échange sans effet néfaste. Nous en avons eu un autre: notre serveur DNS récursif (ceux-ci constituent rapidement un énorme cache qui est rarement utilisé).

L’autre explication que j’ai vue au sujet de l’échange se situe un peu dans les lignes: «On vous dit de toujours configurer SWAP = 2 * RAM. C’est absurde, il n’ya aucune relation entre la RAM et l’échange. L’échange consiste à gérer les pics d’utilisation de la mémoire. , vous devez ajouter assez de mémoire pour que la plupart du temps votre charge soit dans la RAM. Si votre charge est stable, vous n’avez pas besoin d’échange. Si votre charge est très variable, vous devez avoir suffisamment d’échange pour les pointes, et arrangez-vous swap est utilisé assez rarement pour ne pas avoir un impact significatif sur les performances globales. Pour résumer, comme vous n’avez aucune idée de ce que sont vos pics de charge, et comme le disque est beaucoup moins cher que la RAM, configurez SWAP = 2 * RAM. "

Certaines anciennes versions de Solaris ne pouvaient pas utiliser le swap du tout à moins qu'il y ait au moins autant de swap que de RAM (je me souviens qu'il allouait un espace de swap fixe pour sortir de la RAM ou quelque chose du genre), donc 2 * RAM était vraiment proche du minimum raisonnable valeur. Mais c'était il y a bien longtemps, lorsque notre grande machine disposait de 64 Mo de RAM et d'un disque de 1 Go ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.