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"
Réponses:
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.
la source
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.
la source
files_struct
, thestruct signals
, thetask_struct
et 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. :)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.
la source
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.
la source
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:
la source
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
A
et que je découvre ensuite que je dois utiliser une applicationB
pour quelque chose (une sous-tâche ou une interruption), il est alors plus facile mentalement pour moi de laisserA
permuter sur le disque pendant que je travaille. dansB
que de fermerA
et puis n'oubliez pas de le redémarrer après.Cela est particulièrement vrai si
A
contient un état non sauvegardé qui ne serait pas restauré lors de son redémarrage.Qu'il soit plus rapide de pousser et de tirer
A
vers / 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.
la source
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.
la source
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):
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
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.
la source
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 )
la source
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 ...
la source