Le swap est-il un anachronisme?

J'ai utilisé unix pendant un certain time, et ces deux dernières années, j'ai l'printing que le swap est un anachronisme, mais je serais curieux de savoir ce que les autres pensent.

Mon argument est grossièrement ceci (en supposant qu'aucun ulimit global ou twiddling des parameters 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 desortingment 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 à l'écoute de la performance, je pense que la compréhension des limites supérieures de son utilisation des ressources serait la key pour l'ajuster en premier lieu, auquel cas vous savez combien vous en avez besoin.

Je ne peux pas imaginer beaucoup de situations (certaines, mais pas beaucoup) où vous suspendiez un process en cours d'exécution et il pourrait s'échanger pour faire de la place pour d'autres choses, mais vous perdriez toujours vos sockets si vous le faisiez, forçant ainsi core-dump via gcc ou copyr la memory à la main serait fonctionnellement équivalent.

Je ne voudrais certainement pas échanger sur un système embarqué (même si il peut avoir un plus petit RAM disponible), si vous manquez de RAM, je préfèrerais mon process mourir que de déchirer une memory flash d'un million d'écriture par secteur rouler pendant un week-end en usant les secteurs jusqu'au niveau inférieur.

Toute barbe unix-barbie là-bas ont des raisons impérieuses de continuer à échanger?

UPDATE réponses && parsing:

  • CONFIRMÉ? – fork () requirejs la même quantité de memory pour le process enfant que le parent

    Modern fork () est une copy-sur-écriture pour les enfants sur POSIX (en général), mais Linux et FreeBSD spécifiquement, et je suppose OSX par extrapolation. Je considère cette partie du bagage anachronique que l'échange porte avec elle.

    Curieusement, cet article de Solaris affirme que même si Solaris utilise Copy-on-Write avec fork (), vous devriez avoir au less 2x (!) La taille du process parent en memory virtuelle libre pour que la fork () ne supprime pas milieu. Bien que l'élément Solaris supprime un 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 justifier comme swap. Depuis. Avouons-le. À ce stade, les personnes qui utilisent réellement Solaris ne sont probablement que des gars d'Oracle. Aucune infraction Solaris!

  • CONFIRMED – les files tmpfs / ramfs peuvent être échangés en convienence lorsque tmpfs / ramfs se remplit

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

  • PLAUSABLE – Avoir un petit échange 'juste au cas où'

    L'un de mes anciens patrons avait l'habitude de dire «tu ne sais pas ce que tu ne sais pas». Essentiellement, tu ne peux pas prendre une décision basée sur des informations que tu n'as pas encore. Ceci est un argument plausible pour l'échange, cependant – je soupçonne que les types de choses que vous feriez pour détecter si votre application est échangée ou non serait plus lourd que de vérifier si malloc () réussit ou attraper l'exception de un nouveau échec ().

    Cela peut être utile dans les cas où vous exécutez un ordinateur de bureau et avez un tas de choses randoms en cours, mais même encore – si quelque chose se déstring, je préférerais que ce soit moissonné que de plonger dans le swap-enfer. Ce n'est que moi.

  • BUSTED! – Sur Solaris , le swap est important pour plusieurs raisons

    tmpfs – states La quantité d'espace libre disponible pour tmpfs dépend de la quantité d'espace d'échange non alloué dans le système. La taille d'un système de files tmpfs augmente pour s'adapter aux files écrits, mais il existe des compromis inhérents pour les users lourds de tmpfs. Tmpfs partage les ressources avec datatables et emstack les segments d'exécution des programmes. L'exécution de très gros programmes peut être affectée si les filesystems tmpfs sont proches de leur taille maximale autorisée. Tmpfs est libre d'allouer tout sauf 4 Mo de l'espace d'échange du système.

    Faits et mythes de Solaris sur les états de swap La memory virtuelle aujourd'hui est constituée de la sum totale de RAM physique et d'espace de swap sur le disque. Solaris NE requirejs PAS d'espace de swap pour être configuré du tout. Si vous choisissez cette option, une fois que la RAM est pleine, vous ne pourrez plus démarrer de nouveaux process. .

    Je ne sais pas si cela signifie que la carte virtuelle maximale que vous pouvez créer est RAM + swap , ou si vous pouvez toujours faire quelque chose comme mmap () un file plus grand que ram et countr sur l'initialisation paresseuse de mmap (). peut probablement fonctionner Solaris ces jours-ci bien sans swap, il semble que c'est less convivial que les autres systèmes d'exploitation POSIXy.

  • BUSTED! Les outils d'hibernation populaires de Linux semblent reposer sur le swap

    Par défaut, TuxOnIce semble s'appuyer sur swap pour l'hibernation – bien que d'autres backends existent. Cependant, si vous n'utilisez pas une boîte qui doit hibernate, je restrais toujours derrière la déclaration que 'swap est anacronistic sur Linux'

Ne pas confondre le swap (en tant que zone disque) et le swap (comme méthode pour déplacer les pages memory de la RAM vers le disque et réciproquement).

L'échange excessif est quelque chose à éviter pour des raisons de performance, mais avoir une zone d'échange n'est pas nécessairement un problème.

Sur les systèmes, comme Linux, qui surchargent la memory, c'est-à-dire qui permettent aux process d'allouer plus de memory que disponible, manquer de RAM avec pas assez de swap pour gérer la situation triggersra le tueur du MOO. Vous devez faire confiance à l'algorithm utilisé pour sélectionner le «bon» process à tuer et accepter qu'un ou plusieurs de vos process soient tués sans avoir la possibilité de fermer correctement. Voici une analogie célèbre qui explique pourquoi le tueur OOM pourrait ne pas être une bonne idée du tout.

Sur des systèmes comme Solaris qui ne surchargent pas la memory, c'est-à-dire qui s'assurent qu'une réservation de memory est toujours sauvegardée par la memory virtuelle, que ce soit en RAM ou sur disque, une zone de permutation suffisante est absolument nécessaire perdu.

Je connais une raison pour continuer à échanger. J'ai une application qui prend autant de memory que je peux me permettre de configurer pour mon système. Il utilise Hadoop, qui à une partie du traitement fait une fork et exec pour exécuter une seule command unix (je pense "uname" ou "user" ou quelque chose pour lequel ils n'ont pas pu find un équivalent Java). Il semble que Java ne fasse pas un vfork avec la copy sur la sémantique d'écriture comme le ferait une application native. Si je démarre mon application en utilisant 4Gb de RAM, quand il fourche, la fourche utilise un autre 4Gb de RAM, mais ensuite le libère rapidement. Si je n'avais pas 4Gb de swap pour que Hadoop puisse les échanger, je devrais payer 8Gb de RAM juste pour avoir 4Go pour mon application.

Il y a une très belle application pour l'espace de swap: Extension de la RAM en mettant l'espace de swap sur le périphérique de stockage qui utilise la RAM, pour surmonter les limitations de la RAM du système installable

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

Je ne peux pas append à la discussion techniquement, mais je peux donner quelques exemples. Mon ancien portable (2GB RAM kunbuntu lucid) fonctionne généralement avec le swap à 0. Quand je lance la transmission (client bittorrent) avec un certain nombre de torrents qui peuvent collectivement utiliser 100 connections, mon swap peut aller très loin. Cela devient encore pire quand j'ai un XP vm en cours d'exécution qui utilise 1 Go de memory réelle.

J'ai vu d'autres commenter que des process intensifs en memory comme le rendu graphique peuvent aussi être utilisés dans le swap. Si vous ne faites qu'occasionnellement, alors ce n'est pas un problème.

En ce qui concerne les problèmes de MOO, le swap peut réellement être une bouée de sauvetage parce qu'il vous permet de gagner du time entre identifier le problème et les choses qui vont vers le sud. Beaucoup de choses utilisent presque toute ma memory, donc je ne fais pas attention à cela, mais quand swap commence à courir, je remarque cela et commence à chercher le problème – avant qu'il me morde.

Sur mon système, / tmp se renverse pour échanger s'il gagne trop de RAM.

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

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

Habituellement, lorsque le système n'a pas assez de memory physique, le kernel peut mettre en place des applications (en fait, certaines parties de la memory qui ne sont pas utilisées par les applications en cours d'exécution).

Plus tard, lorsque ces applications doivent faire quelque chose (par exemple, certaines données arrivent sur une socket ou un feu de timer) – le kernel va mettre une autre application à échanger.

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

Concernant les dispositifs embarqués, ils peuvent tous être divisés sur (au less) deux grands groupes:

  1. ils exécutent Linux / Windows ou similaire non-RTOS (OS time réel); ou
  2. ils exécutent un RTOS.

Bien sûr, il y a des périphériques qui ne fonctionnent qu'avec du code (une sorte de microcontroller), etc. Je ne les décrirais pas car de tels dispositifs n'ont pas de operating system, donc discuter de swap est insensé pour de tels dispositifs.

Le premier groupe de périphériques embarqués (exécutant un operating system) peut utiliser (et habituellement, ils utilisent) le swap. Et en général, de tels périphériques utilisent l'échange de la même manière que les ordinateurs de bureau et les servers.

Le deuxième groupe de périphériques (exécutant RTOS) n'utilise pas le swap du tout, car RTOS a une limite de time à répondre à l'événement et

  • la lecture de swap peut prendre un time imprévisible
  • les périphériques ont un nombre de tâches prédéfini (au moment de la compilation), 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
Windows utilise une approche similaire.

J'ai utilisé Linux et Windows sans swap (file de pagination, dans la nomenclature Windows), sur des ordinateurs portables avec 4 Go ou plus. Il y a quelques occasions où l'épuisement de la memory arrive, je m'occupe juste d'eux. Je sens que le système est plus rapide de cette façon, ce qui me préoccupe davantage. Aucune exigence particulière sur ma charge de travail cependant.

Ce que j'ai appris:

  • Windows "perd" la memory avec le time, dans environ 20-30 jours de disponibilité, j'arrive à un point où je préfère redémarrer. Je ne sais pas pourquoi cela arrive. Je suppose que c'est peut-être une fuite dans un pilote ou l'anti-virus. Lorsque vous avez un file de pagination, je pense qu'il peut mettre cette fuite de memory dans le file de pagination, il serait donc plus difficile de remarquer ce problème sur un système Windows normal.
  • Firefox traite bien mieux avec peu de memory que Chrome. Firefox vous avertit, et fonctionne toujours, Chrome se plante juste.

Quelques bonnes utilisations que j'ai vues sont des process qui utilisent beaucoup de memory, mais pas de performance critique. Un cas était un ancien Firefox qui avait une mauvaise fuite de memory. Il remplirait la RAM et se renverserait pour échanger sans effet néfaste. Un autre que nous avions était notre server DNS récursif (ceux-ci accumulent rapidement un énorme cache rarement utilisé).

L'autre explication que j'ai vue à propos de swap a été un peu plus loin: "On vous dit de toujours configurer SWAP = 2 * RAM, ce qui est complètement absurde, il n'y a pas de relation entre RAM et swap. , vous devez append suffisamment de memory afin que la plupart du time votre charge rentre dans la memory RAM.Si votre charge est stable, vous n'avez pas besoin d'échanger.Si votre charge est très variable, vous avez besoin d'un échange suffisant pour les pointes, et organiser de sorte que En résumé, puisque vous n'avez aucune idée de ce que sont vos pointes de charge et que le disque est beaucoup less cher que la RAM, configurez SWAP = 2 * RAM.

Certaines anciennes versions de Solaris ne pouvaient pas utiliser le swap à less qu'il y ait au less autant de swap que de RAM (je me souviens qu'il a alloué un espace de swap fixe pour sortir de la RAM ou quelque chose comme ça), donc 2 * RAM était vraiment autour du minimum sensible valeur. Mais c'était il y a quelques années, lorsque notre grande machine avait 64 MoB RAM et un disque de 1 GiB …

Je pense que vos arguments sont tout à fait valables pour un server , où la performance est importante, et savoir quelle application agira ensuite peut ne pas être prévisible.

Pour un bureau, cependant, je trouve swap utile quand je pousse et éclater des tâches.

Par exemple, si je travaille sur une tâche en utilisant l'application A et que je découvre alors que je dois utiliser l'application B pour quelque chose (une sous-tâche ou une interruption), il est mentalement plus facile pour moi de laisser A échange sur disque pendant que je travaille dans B que pour fermer A et puis me callbacker de le recommencer ensuite.

Cela est particulièrement vrai si A conserve un état non sauvegardé qui ne serait pas restauré lors du redémarrage.

Il est plus rapide de pousser et de tirer A vers / depuis le swap, ou de le fermer et de le redémarrer, selon l'application. (Certains parviennent à avoir un démarrage lent mais une petite taille résidentielle.)

Cependant, je suis d'accord qu'une meilleure solution pour améliorer la productivité serait d'installer de la RAM supplémentaire.

Il me semble que l'hibernation et le sumil hybride ont besoin d'espace d'échange sur Linux .

Je n'ai jamais utilisé d'espace / partition de swap sur Linux avant d'être obligé d'utiliser Hybrid Sleep – car le sumil sur le niveau de batterie critique n'était pas disponible sur mon système, comme l'a fait Upower, qui choisit seulement Shut-Down, Hibernate et Hybrid -dormir. (plus ici )