Ai-je besoin d'espace de swap si j'ai assez de RAM?

91

D'après ce que j'ai compris, le but d'une partition swap sous Linux est de libérer de la mémoire RAM certaines informations "moins fréquemment utilisées" et de les déplacer vers une partition spécifique de votre disque dur (au prix d'un ralentissement de la lecture ou de l'écriture). à), permettant essentiellement aux applications actives de bénéficier davantage de la "mémoire haute vitesse".

C'est idéal lorsque vous êtes sur une machine avec une petite quantité de RAM et que vous ne voulez pas avoir de problèmes si vous en manquez. Toutefois, si votre système dispose de 16 ou 32 Go de RAM et si vous n'exécutez pas de base de données MySQL pour StackExchange ou n'éditez pas de film 1080p de longueur complète sous Linux, une partition de swap doit-elle être utilisée?

IQAndreas
la source
16
@ mikeserv Vous savez, j'aimerais bien accepter ces deux lettres comme une réponse juste pour un effet comique.
IQAndreas
3
@ Janis - ça coûte cher. Et vous auriez facilement pu le faire sans échange sur même la machine de 1 Go si vous aviez implémenté la gestion de la mémoire sonore. L'échange coûte de la performance - quand vous l'avez, le noyau l'utilisera inévitablement. Ainsi, sur un disque de 1 To ou de taille différente, la création d’une partition de swap est une invitation au noyau à placer des pages de mémoire sur le disque, plutôt que de les conserver dans la RAM ou de les supprimer complètement. Avec 16 Go, un utilisateur typique n’approche jamais en utilisant tout cela. J’ai une RAM de 24 Go avec 2 Go utilisée et une mémoire cache de 10 Go (parce que j’ai renvoyé un torrent à /tmp) après 3 jours de disponibilité.
mikeserv
5
@mikeserv, tu as tort, je le crains; J'ai constamment observé les métriques de disque affichées. Tant que la mémoire est libre, l’échange n’a pas été utilisé, mais uniquement lorsque la mémoire était pleine. Je pense que cela dépend de la façon dont vous utilisez votre ordinateur. un système de bureau qui est arrêté tous les soirs rencontrerait rarement des problèmes de mémoire, mon système fonctionnant depuis des mois, cependant. Oui, l'échange coûte de la performance, mais s'il ne reste plus de RAM, votre système peut continuer à fonctionner. Quelle est l'option que vous avez? Peut-être que vous pouvez développer l'argument de la gestion de la mémoire. J'utilise mon système Linux comme préconfiguré.
Janis
40
@mikeserv comment avez-vous posté un commentaire de moins de 15 caractères?
user253751
11
@immibis il y a 12 parties de longueur nulle à y
dave

Réponses:

98

Oui.

Vous devez absolument toujours activer le swap, sauf s’il existe une raison très convaincante et prohibitive (par exemple, aucun disque, ou seulement un disque réseau présent). Si vous avez un échange dans l'ordre des tailles ridicules souvent recommandées (telles que, deux fois la quantité de RAM)? Eh bien non .

La raison en est que le swap n’est pas seulement utile lorsque vos applications consomment plus de mémoire qu’il n’ya de RAM physique (en fait, dans ce cas, le swap n’est pas très utile car il affecte sérieusement les performances). L’incitation principale au swap de nos jours n’est pas de convertir par magie 16 Go de RAM en 32 Go, mais bien d’utiliser plus efficacement la mémoire RAM installée et disponible.

Sur un ordinateur moderne, la RAM ne reste pas inutilisée. La RAM inutilisée est quelque chose que vous pourriez tout aussi bien ne pas avoir acheté et économisé à la place. Par conséquent, tout ce que vous chargez ou ce qui est autrement mappé en mémoire, tout ce qui pourrait éventuellement être réutilisé par quelqu'un à tout moment (limité par des contraintes de sécurité) est mis en cache. Très vite après le démarrage de la machine, toute la RAM physique aura été utilisée pour quelque chose .

À chaque fois que vous demandez une nouvelle page mémoire au système d'exploitation, le gestionnaire de mémoire doit prendre une décision éclairée:

  1. Purger une page du cache tampon
  2. Purger une page d'un mappage (en réalité le même que le n ° 1, sur la plupart des systèmes)
  3. Déplacez une page qui n'a pas été consultée depuis longtemps - de préférence jamais - pour la permuter (ceci pourrait même se produire de manière proactive, pas nécessairement au tout dernier moment)
  4. Tuez votre processus ou tuez un processus aléatoire (MOO)
  5. Panique du noyau

Les options 4 et 5 sont très indésirables et ne se produiront que si le système d'exploitation n'a absolument pas d'autre choix. Les options 1 et 2 signifient que vous jetez quelque chose dont vous aurez peut-être besoin bientôt. Cela a un impact négatif sur les performances.

L'option 3 signifie que vous déplacez quelque chose dont vous n'avez (probablement) pas besoin bientôt sur un stockage lent. C'est bien parce que maintenant, quelque chose dont vous avez besoin peut utiliser la mémoire vive rapide.

En supprimant l'option n ° 3, vous avez effectivement limité le système d'exploitation aux opérations n ° 1 ou n ° 2. Recharger une page à partir d'un disque revient à le recharger à partir d'un échange, sauf que le rechargement à partir d'un échange est généralement moins probable (en raison de la prise de décisions de pagination appropriées).

En d'autres termes, si vous désactivez le swap, vous ne gagnez rien, mais vous limitez le nombre d'options utiles du système d'exploitation pour traiter une requête en mémoire. Ce qui pourrait ne pas être , mais très probablement pourrait être un désavantage (et ne sera jamais un avantage).

[MODIFIER]

Le lecteur attentif de la mmap page de manuel , en particulier la description de MAP_NORESERVE, remarquera une autre bonne raison pour laquelle l’échange est en quelque sorte une nécessité même sur un système disposant de "suffisamment" de mémoire physique:

"Lorsque l’espace de swap n’est pas réservé, il est possible d’obtenir SIGSEGV lors d’une écriture si aucune mémoire physique n’est disponible."

- Attends un instant, qu'est-ce que ça veut dire?

Si vous mappez un fichier, vous pouvez accéder directement au contenu de celui-ci comme si le fichier était, par magie, dans l'espace d'adressage de votre programme. Pour un accès en lecture seule, le système d'exploitation n'a en principe besoin que d'une seule page de mémoire physique qu'il peut repeupler avec des données différentes chaque fois que vous accédez à une page virtuelle différente (pour des raisons d'efficacité, ce n'est évidemment pas ce qui est fait, mais en principe, vous pouvez accéder à une valeur de téraoctets de données avec une seule page de mémoire physique). Et si vous aussiécrire dans un mappage de fichier? Dans ce cas, le système d’exploitation doit disposer d’une page physique - ou d’un espace d’échange - prêt pour chaque page écrite. Il n'y a pas d'autre moyen de conserver les données jusqu'à ce que le processus d'écriture différée de pages modifiées ait fonctionné (ce qui peut prendre plusieurs secondes). Pour cette raison, le système d’exploitation réserve (mais ne s'engage jamais nécessairement) l’espace de permutation. Ainsi, si vous écrivez sur un mappage alors qu’il n’ya aucune page physique inutilisée (c’est une condition tout à fait possible et normale), vous ' re garanti que cela fonctionnera toujours.

Maintenant, que se passe-t-il s'il n'y a pas d'échange? Cela signifie qu'aucun échange ne peut être réservé (duh!), Et dès lors qu'il ne reste plus de pages physiques libres et que vous écrivez sur une page, vous recevez une agréable surprise dans la forme de votre processus de réception une faute de segmentation, et probablement être tué.

[/MODIFIER]

Cependant, la recommandation traditionnelle de convertir deux fois la taille de la RAM est absurde. Bien que l’espace disque soit bon marché, il n’a pas de sens d’attribuer autant d’échange. Le gaspillage de quelque chose qui est bon marché est toujours une perte de temps, et vous ne voulez absolument pas être continuellement en train d'échanger des ensembles de travail de plusieurs centaines de mégaoctets (ou plus).

Il n’existe pas de taille de swap "correcte" unique (il existe autant de tailles de "correct" que d'utilisateurs et d'opinions). J'attribue généralement un 512 Mo fixe, quelle que soit la taille de la RAM, ce qui fonctionne très bien pour moi. Le raisonnement derrière cela est que 512 Mo est quelque chose que vous pouvez toujours vous permettre, même sur un petit disque. D'autre part, l'ajout de plusieurs gigaoctets de swap n'est pas mieux. Vous ne les utiliserez pas, sauf en cas de problème grave.

Même sur un disque SSD, l’échange est beaucoup plus lent que la RAM (en raison de la bande passante et de la latence du bus), et même s’il est très acceptable de déplacer un élément à échanger qui ne sera probablement plus nécessaire (c’est-à-dire que vous ne serez probablement plus nécessaire). en le remplaçant de nouveau pour que votre pool de pages disponibles soit effectivement élargi gratuitement), si vous avez vraiment besoin de quantités considérables d'échange (c'est-à-dire si vous avez une application qui utilise, par exemple, un jeu de données de 50 Go), vous êtes quasiment perdu.

Une fois que votre ordinateur commence à échanger des gigaoctets de pages, tout est analysé. Donc, pour la plupart des gens (y compris moi), ce n’est pas une option, et avoir autant d’échange n’a donc aucun sens.

Damon
la source
7
Complètement faux: cela pourrait être un avantage pour le noyau de ne pas utiliser le disque, surtout si vous avez configuré MOO selon vos spécifications. Si le tueur OOM est configuré pour gérer votre nettoyage, il est avantageux de le
mikeserv
22
Quelle est la différence entre 8 Go de RAM et 8 Go d'échange et 16 Go de RAM sans échange? Si votre ordinateur décide qu'il a besoin de 16,001 Go de mémoire, ne va-t-il pas commencer à purger / tuer les choses de la même manière (mais la performance cratera avant qu'elle ne commence à se produire)?
Nick T
5
@ NickT: L'échange ne nécessite pas plus de RAM, mais un drapeau rouge indiquant que quelque chose va être tué bientôt. J'aime avoir un drapeau rouge avant de tuer, plutôt que de voir un processus disparaître "au hasard" sous mes yeux.
Mooing Duck
10
-1 cette réponse n'a aucun sens. Pourquoi diable aurait une mémoire plus lente (swap) aurait une meilleure performance que la même quantité de mémoire plus rapide (RAM)? à un moment donné, vous devez reconnaître que suffisamment de RAM signifie qu'aucun échange n'est nécessaire ..
Mehrdad
14
@ Mehrdad: Cela a certainement du sens. Le ralentissement de la mémoire (swap) améliore les performances dans la mesure où le mot "lent" n'a pas d'importance pour les choses auxquelles vous accédez rarement ou jamais. L'échange augmente efficacement la quantité de mémoire disponible pour les données "chaudes" en déplaçant les données "froides" vers l'extérieur. Les démons qui exécutent quelque chose une fois par heure ou la mémoire allouée par un module du noyau chargé par défaut mais jamais utilisé en sont un exemple. Vous pouvez échanger sur ceux , ou vous pouvez déposer à la place des pages à partir du cache. Quel est le meilleur?
Damon
50

Je ne suis pas d'accord avec quelques opinions que je vois énoncées ici. Je créerais toujours une partition SWAP, en particulier dans un environnement de production. Je le fais aussi bien pour mes ordinateurs personnels que pour mes ordinateurs virtuels.

Ces jours-ci, je les taille environ 1 fois et demi de mémoire. 2 fois la mémoire était la règle de base. Le disque d'échange est "économique" en ce sens qu'il n'a pas besoin d'être sauvegardé ou protégé.

Si vous manquez de mémoire, votre espace de swap vous laisse un peu de temps pour vous attaquer au problème.

Réalisez que des éléments tels que / tmp peuvent résider dans l’espace de permutation.

La zone d'échange peut contenir un vidage partiel du noyau afin qu'il puisse être restauré au prochain redémarrage. Cela pourrait être intéressant pour une urgence de débogage future à laquelle vous êtes appelé.

mdpc
la source
16
+1 Avoir un échange signifie la différence entre une performance médiocre avec une mémoire insuffisante et un crash dur.
Davidmh
6
@ mikeserv, quelle que soit la configuration choisie, si votre programme tente d'allouer plus de mémoire qu'il n'en reste de disponible, un incident va survenir ou le système d'exploitation va commencer à les supprimer.
Davidmh
6
@ Davidmh: Par ce raisonnement, votre fichier d'échange doit être infiniment volumineux, sinon vos programmes continueront de planter lorsqu'ils épuiseront le fichier d'échange.
Mehrdad
6
@Mehrdad mais c'est aussi plus cher. Étant donné que vous avez X Go de RAM, car c’est tout ce que vous pouvez vous permettre, c’est bien pire que d’avoir X Go de RAM et Y d’échange, pour certaines valeurs raisonnables de Y (cela dépendra de votre utilisation et de la taille de votre disque dur). votre HD).
Davidmh
9
"votre espace d'échange vous laisse un peu de temps et du coussin pour résoudre le problème" - Cela signifie également que je dois rester encore plus longtemps devant une machine qui ne répond pas jusqu'à ce qu'une fuite de mémoire se "résorbe" d'elle-même.
Raphaël
23

Peut être:

J'ai beaucoup réfléchi à ce sujet et j'ai vu des opinions retomber plus souvent que je ne peux en juger. Mon approche était de développer un moyen de le savoir.

Commencez avec une partition de swap active de ce que vous jugez d'une taille suffisante.

Ensuite, ouvrez un terminal dans un espace de travail et lancez la commande free -hs 1qui signalera l’utilisation une fois par seconde.

Passez éventuellement à d'autres espaces de travail.

Faites tout ce que vous êtes susceptible de faire, puis un peu plus. Exécutez toutes vos applications courantes en même temps, parcourez plusieurs onglets et essayez désespérément de donner au système une véritable séance d’entraînement. Cela pourrait signifier de réencoder une demi-douzaine de vidéos tout en exécutant une opération de compilation et en vérifiant votre courrier électronique. Regardons les faits en face, tout dépend de la façon dont vous utilisez votre système.

Lorsque vous estimez que le système est soumis à une charge élevée (ou aussi élevée que vous êtes susceptible de l’être, puis à certains), examinez le terminal et examinez les résultats. ou mieux encore, redirigez la sortie vers un fichier en ajoutant >output.txtà la commande afin que vous puissiez examiner le cycle complet. Si votre échange utilisé ne dépasse jamais Mem free, vous n'avez pas besoin d'échange. Si c'est le cas, vous le faites. free.png

Je n'ai pas besoin d'échange. Peut-être que vous faites. Pourquoi ne pas découvrir?

En ce qui concerne l'échange de dimensionnement, les règles empiriques sont généralement surestimées car il s'agit d'une question basée sur l'utilisation.

Elder Geek
la source
2
Alors, dites-vous que l’échange n’est utilisé que lorsque votre système en a absolument besoin? Dans quel cas existe-t-il une pénalité pour avoir la permutation permise - juste au cas où? D'autres commentaires semblent suggérer que même la présence de swap peut être préjudiciable à la performance?
MrWhite
3
@ w3d Non, je ne dis pas ça. Comme vous pouvez le voir dans mes résultats ci-dessus, le swap est utilisé même s'il n'est pas requis. ceci peut être ajusté quelque peu avec le facteur swappiness. Je parle de la nécessité d'avoir swap ou non.
Elder Geek
Pouvez - vous ce script pour incrémenter échange vers le haut tout temps swappasse au- dessus free?
JFA
@JFA Je n'ai pas vu cela fait. Personnellement, j’ai du mal à retenir le concept de réserver une quantité indéterminée d’espace de swap à cette fin. Théoriquement tout est possible. C'est la phase de mise en œuvre qui devient intéressante.
Elder Geek
17

NOTE: Cela m'est arrivé dans une situation particulière et inhabituelle. Si vous résolvez un problème, cela peut être utile. Je ne veux pas dire que TOUTES les machines DOIVENT avoir un échange.

PEUT ÊTRE!

Dans le passé, j’ai rencontré des problèmes avec une «appliance» que j’ai construite et qui fonctionnait sous Linux - fonctionnant sur un périphérique compact flash, je ne voulais pas porter ma CF par swap, et il y avait suffisamment de mémoire pour l’application.

La plupart de ces appareils fonctionnaient bien, mais sur un boîtier particulièrement occupé, j'ai rencontré un problème:

FRAGMENTATION DE MEMOIRE

Sans espace d'échange, la mémoire est progressivement devenue de plus en plus fragmentée, en particulier avec des processus longs (même si j'avais beaucoup de mémoire libre, tout était très petit). J'ai mis un peu d'espace swap dedans et ai dit à Linux de ne pas l'utiliser sauf si c'était nécessaire; cela a complètement résolu le problème.

En plus de tout le reste, l’espace de permutation permet de déplacer la mémoire et de la défragmenter. Si vous avez une mémoire fragmentée et que vous avez besoin d'un seul gros morceau, les fragments seront échangés. au fur et à mesure qu'ils sont échangés, ils sont effectivement défragmentés.

Vérifiez / proc / buddyinfo - le mien ressemble à ceci en ce moment:

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

Les nombres représentent des blocs de différentes tailles; chaque taille correspond à la moitié de la taille du bloc suivant, de 4 Mo à gauche à 4 Ko à droite (soit 4 Mo, 2 Mo, 1 Mo, etc.). Une machine nouvellement démarrée devrait avoir tous les blocs à gauche, très peu à droite (= non fragmentés). Rappelez-vous également que la même quantité de mémoire (par exemple 4 Mo) sera représentée sous la forme de nombres différents dans les colonnes - 1 bloc dans la colonne la plus à gauche et 1024 dans la colonne la plus à droite.

La mémoire est allouée à partir du pool le plus à droite possible; Par exemple, si votre programme veut 12 Ko de mémoire (en une fois), il le prendra à partir de la colonne 16 Ko; le reste apparaîtra dans la colonne de 4ko. S'il n'y a pas de blocs de 16kb, les blocs de 32kb seront utilisés, ce qui laissera un reste de 4kb et 16kb, et ainsi de suite.

S'il n'y a pas assez de blocs de mémoire ET QUE VOUS AVEZ SWAP SPACE, par exemple, si vous voulez 16 Ko de mémoire, il trouvera le bloc de 16 Ko le moins utilisé (pouvant par exemple contenir un bloc utilisé de 4 Ko, un bloc disponible de 4 Ko, et 2 autres blocs de 4 Ko utilisés), déplacez les parties USED uniquement pour les permuter et allouez la mémoire libérée à la nouvelle application.

Dans la boîte qui s'est écrasée, j'avais des centaines de milliers de blocs de 4 et 8 Ko, et pas grand chose d'autre.

DÈS QUE JE PEUX DIRE (en passant par les machines plantées!), Le noyau se déplacera de mémoire en permutation, et en mémoire, mais ne se déplacera jamais de mémoire en mémoire.

AMADANON Inc.
la source
3
Votre cas ressemble à un bon cas pour l'allocation / mise en œuvre d'énormes pages. Cela éviterait les problèmes de fragmentation (car une page immense d'une certaine taille, une fois allouée, ne sera désormais allouée à jamais que pour cette taille) .
mikeserv
2
C'est la meilleure raison pour laquelle j'ai jamais lu en faveur de l'utilisation d'une partition de swap. J'ai essayé une recherche rapide et trouvé aucune référence à ce sujet, je me demande pourquoi cette fonctionnalité n'est pas plus souvent documentée.
Vers SE SE
1
(non transparent) hugepages peut ne pas être utilisable par votre application. En règle générale, les applications nécessitant beaucoup de mémoire peuvent les utiliser. par exemple, les serveurs de base de données, java jvm. Ils doivent être explicitement activés et deviennent un pool de mémoire distinct qui ne peut pas être utilisé à d'autres fins. Cela peut être bon ou mauvais, selon votre situation. Découvrez également les pages immenses transparentes. Ces derniers tentent de déplacer les choses de sorte que vous utilisiez des pages gigantesques (pour améliorer leurs performances) même si vos applications ne savent pas comment. Si la mémoire est fragmentée, les choses peuvent aller plus au sud, car le balayeur de pages gigantesques a plus à faire.
Dan Pritts
1
Je ne doute pas de votre expérience avec votre appareil flash, je ne suis tout simplement pas convaincu que le cas d'utilisation unique que vous avez présenté équivaut probablement à un échange nécessaire et je ne suis toujours pas convaincu que la fragmentation de la mémoire est liée au fait d'avoir ou non un échange. Cela soulève une question intéressante qui pourrait facilement être testée et prouvée ou réfutée.
Elder Geek
1
Question de suivi . Qu'entendez-vous par «fragmentation de la mémoire»? La MMU ne se soucie pas de savoir si les pages physiques utilisées pour les pages consécutives dans un espace d'adressage virtuel sont consécutives ou non. Les pages physiques sont fragmentées, mais cela n'a pas d'importance (tant que nous parlons de mémoire d'application ordinaire sur une machine physique à cluster unique et non de pages de mémoire utilisées par un périphérique ou un hyperviseur). Lorsqu'un programme demande 16 Ko, il obtient quatre pages, qui peuvent être ou ne pas être proches l'une de l'autre dans la mémoire physique.
Gilles
15

Une partition de swap a une valeur significative qui va au-delà de la simple utilisation de RAM supplémentaire lorsque vous en manquez.

D'une part, Linux utilise autant de mémoire que possible pour mettre en cache les fichiers et les opérations d'E / S. Si vous effectuez un échange, vous constaterez peut-être que davantage de mémoire est utilisée pour la mise en cache d'E / S, ce qui accélère le processus (en réduisant au minimum l'accès au disque et en réduisant l'usure des disques SSD). conserver des données qu'un programme a allouées mais qu’elles n’utilisent qu’une fois toutes les 12 heures, ce qui peut être le cas pour certains démons.

De plus, Linux utilise une stratégie d’allocation de mémoire optimiste selon laquelle il permettra aux pages d’être attribuées nominalement, même s’il n’est pas certain de disposer de la mémoire réelle pour les remplir. Cela est plus efficace que de faire une vérification appropriée et de cartographier chaque allocation et ne pose généralement aucun problème. Cependant, les heuristiques utilisées par le noyau pour déterminer si autoriser une allocation est judicieuse incluent le niveau de swap disponible sur le système. Par conséquent, les allocations peuvent être plus rapides si le système dispose de suffisamment de swap, même s'il est peu utilisé.

Ces facteurs réunis m'amènent à croire personnellement qu'il est préférable d'effectuer un échange sur presque tous les systèmes normaux. Cependant, pour les tailles de bélier de grande taille, j'ignore la règle de ram * 2 et je limite simplement mon échange à 4-8 Go ​​(en fonction de la taille du disque). ).

Vality
la source
9
Même 4 Go est trop gros pour un ordinateur de bureau. Je préférerais que le tueur OOM s'active avant d'attendre que le swap se remplisse si quelque chose se passait mal. (Si je rencontrais un cas dans lequel j'avais besoin de plus, je pouvais dd et mkswap un FILE d'échange avant d'exécuter tout travail énorme qui nécessitait plus de mémoire virtuelle que ma machine n'avait ...)
Peter Cordes
@ PeterCordes Cela dépend probablement du type de tâches que vous effectuez, je comprends tout à fait. Personnellement, je trouve que je tire profit de niveaux d’échange élevés, étant donné que j’ai souvent recours à des compilations longues et de faible priorité en arrière-plan lors de l’utilisation de ma machine. en tous cas). Néanmoins, je conviens que c'est une charge de travail très personnelle, il faut toujours penser à son propre usage avant de décider.
Vality
1
Drôle d’histoire: rien qu’aujourd’hui, sur mon ordinateur portable doté de 4 Go de RAM, un échange de 0,5 G (SSD), firefox a déclenché le tueur de MOO (qui a choisi firefox). Cela ne m'était pas arrivé auparavant. (Bien que j'utilisais mon ordinateur portable plus que d'habitude). Pratiquement rien d'autre ne fonctionnait (juste gnome-terminal dans xfce). Donc, je pense que ça me va, car firefox devrait savoir mieux que d’attacher autant de RAM. J'ai vu quelqu'un dire il y a quelque temps que "les navigateurs Web existent pour tester le sous-système de mémoire virtuelle", ou quelque chose du genre. Firefox est assez mal à libérer des caches pour les onglets qui n'ont pas été utilisés pendant des jours, etc.
Peter Cordes
3
Un cas où Linux considère l’espace de swap disponible lorsqu’un processus volumineux tente de lancer un enfant: les appels système fork () + exec () commencent par dupliquer approximativement l’allocation du parent - le noyau ne peut pas garantir que le nouvel enfant sera plus petit. que le parent. L'espace de permutation n'est généralement pas utilisé, mais si elle n'est pas disponible, fork () peut échouer. Un exemple typique sur un client est un navigateur démarrant un plug-in ou un serveur lorsqu'un conteneur d'application volumineux appelle un programme d'assistance. 1/2 ou 1 Gi de swap est généralement suffisant pour résoudre le problème. Google "java exec ne peut pas allouer de mémoire"
James
13

Vous ne devriez jamais avoir une taille d'échange supérieure à la taille maximale tolérée dans l'attente de la permutation du noyau; sinon, vous créez simplement un nouveau mode de défaillance pour votre système (vous vous retrouvez avec un enlisement irrécupérable). Notez que, bien que les disques modernes puissent transférer de l’ordre de Go / s, Linux n’est généralement capable de transférer les échanges qu’à des débits de plusieurs centaines de Ko, ou au mieux quelques Mo par seconde. Un échange si important peut rendre votre système inutilisable pendant des minutes, des heures ou même des jours.

Si vous avez suffisamment de mémoire physique pour ce que vous faites, la taille idéale pour le swap est de la faire correspondre à la quantité de «données indésirables» que les processus conservent sans jamais utiliser. Ceci est probablement de l'ordre de quelques centaines à quelques centaines de mégaoctets. Cette stratégie permet d'utiliser toute votre mémoire physique pour mettre en cache des informations utiles plutôt que comme stockage permanent pour des données qui ne seront probablement plus jamais utilisées.

Si vous ne disposez pas de suffisamment de mémoire physique, vous devez évaluer si vous pouvez tolérer un ralentissement important dû à un échange important. Si tel est le cas, l'utilisation de 1 à 2 Go d'échange peut sembler logique, et peut-être jusqu'à 4 Go si vous avez des disques extrêmement rapides. Mais pas plus que cela ne fera qu'empirer les modes de défaillance de votre système et vous devriez envisager d'acheter plus de RAM à la place.

R ..
la source
2
Je pense que c'est la meilleure réponse. Si vous avez trop d'espace d'échange, la machine risque de ne plus répondre du fait de tous les échanges. Cela signifie que vous ne pouvez pas tuer le processus incriminé. Si vous réduisez l'espace de permutation, le tueur de MOO fera automatiquement votre travail pour vous. Les arguments dans d'autres réponses concernant la mise en cache du tampon de fichier ne sont absolument pas convaincants. Vous devez avoir swap pour que le noyau puisse déplacer les tampons de fichiers vers swap ... qui se trouve sur le disque? S'il vous plaît.
Timmmm
Le seul argument contre l’espace de permutation que je puisse trouver est le suivant: "certains programmes perdent de la mémoire". Et? Si le tueur OOM tue une chose importante que vous n'avez pas sauvée, vous avez effectivement perdu votre travail. Ce qui signifie que cet argument devient complètement inutile, je peux simplement forcer l’arrêt de ma machine à avoir exactement le même effet tout en conservant un espace d’échange élevé pour les tâches à faible priorité qui utilisent beaucoup de mémoire et sont souvent permutées. Si votre machine est bloquée dans un tel état, c'est de votre faute. La seule fois où cela m'est arrivé, c'est quand j'ai moi-même écrit un programme pour remplir toute la mémoire de travail.
Sahsahae
11

Seulement si vous voulez pouvoir passer en veille prolongée pour permuter (cette fonction s'appelle également "suspendre sur le disque" et implique la sauvegarde de tout le contenu de la RAM et la mise hors tension). Généralement, cela n’est utilisé que sur les ordinateurs portables et autres appareils mobiles, donc cela dépend.

hanetzer
la source
6

Il n'y a pas de réponse claire et universelle car cela dépend de la tâche que vous allez effectuer. Si vous êtes sur le point d’exécuter un serveur de base de données, HTTP, de virtualisation ou de cache, vous ne devez jamais activer aucun type de swap, quel que soit le montant de votre RAM. Si vous avez un ordinateur de bureau ou un hôte multitâche et que vous avez plus de 16 Go de RAM rapide, consultez la page suivante: zRam

Alexey Vesnin
la source
zRam est un excellent choix. Je l'ai utilisé en conjonction avec de minuscules systèmes de lecteur flash.
Elder Geek
1
@ ElderGeek Je l'ai également utilisé dans un environnement sans disque, par exemple un démarrage réseau. Excellent travail, mais il y a quelques réserves: premièrement, vous n'avez pas besoin de plus de mémoire vive, vous avez besoin d'un serveur FAST. Des modules de mémoire lents et bon marché, qui vous enchaîneraient probablement dans un cas classique, peuvent poser problème. Il faut également prendre en compte le bus frontal-CPU: même dans le cas où vous pouvez avoir une fréquence de processeur plus lente mais une fréquence de FSB plus rapide améliorera considérablement vos performances. La deuxième préoccupation concerne un certain nombre de partitions zRam swap. Essayez les nombres de 1 à votre nombre de cœurs de processeur. Ne pas utiliser sur des systèmes simple cœur!
Alexey Vesnin
Bons points valables tous. Comme je suis un geek de la performance et que je conçois et construis toujours mes propres systèmes, je ne suis pas personnellement préoccupé par de telles préoccupations
Elder Geek
@ ElderGeek moi aussi :) ravi de vous rencontrer! De plus, j'ai remarqué une chose étrange dans le comportement de zRam. Il apparaît et disparaît dans différentes versions et configurations du noyau, mais il est hautement reproductible sur les noyaux HZ 100 et 1000. zRam fonctionne bien pour les 1,2,4 - mais pas plus de partitions. Même sur 8 et 16 cœurs physiques sur le meilleur matériel pour des tâches presque inactives. Alors gardez cela à l'esprit en jouant avec les réglages! Salutations de Russie!
Alexey Vesnin
Je ne suis pas d’accord avec "si vous utilisez une base de données, ... vous ne devez jamais activer aucun type d’échange, quel que soit le type de montage que vous possédez". L'échange est généralement préférable à un tueur OOM tuant des processus aléatoires. Oui, vous devez disposer de suffisamment de mémoire pour les applications que vous exécutez et, effectivement, l’utilisation de grandes quantités d’échange peut ralentir votre système. Je vous envie de vivre dans un monde idéal.
AMADANON Inc.
5

Il n'y a aucun moyen de savoir si vous avez besoin d'espace de swap ou non si le seul paramètre que nous connaissons est la quantité de RAM installée.

Dans tous les cas, il existe une idée fausse commune selon laquelle disposer d'un espace d'échange affecte négativement les performances du système. Ceci est une erreur. Tant que vous avez assez de RAM, le fait d'avoir une zone d'échange, quelle que soit sa taille, ne nuit pas du tout aux performances. Ce qui affecte les performances est la pénurie de RAM et l'utilisation efficace de l'espace de permutation.

  • cas 1: Si vous n'avez pas d'espace d'échange et que vous n'avez plus de RAM, le noyau Linux choisira un ou plusieurs processus qu'il pense être de bons candidats et les tuera.

  • cas 2: si vous avez un espace de swap et que vous n'avez plus de RAM, le noyau choisira moins de pages de mémoire utilisées et les placera sur la zone de swap pour libérer de la RAM. Cela ralentira le système mais vos applications ne seront pas affectées autrement.

Je préfère toujours le cas 2, car je me sens mal à l'aise de perdre certaines parties ou la totalité de mon travail car le noyau pense que mes applications valent la peine d'être éliminées. De plus, avec la taille actuelle d'un disque moyen se situant dans la plage de la tuberculose, réserver quelques pour cent au swap ne devrait pas poser de problème.

jlliagre
la source
6
Je préfère le cas 1, car le seul moment où je manque de RAM, c’est quand j’ai un programme qui s’emballe. Le tueur OOM est généralement assez doué pour identifier les fugueurs, et je préférerais qu'il soit tué immédiatement après quelques heures de lourds échanges.
Mark
1
@ Mark, c'est un point valable. J'essaie toujours d'éviter de déléguer à un algorithme le tournage en premier, pensez ensuite à l'approche.
jeudi
2
le cas 2 n'est valide que si vous avez un message qui vous avertit de cette situation et avez suffisamment de temps pour "faire quelque chose" manuellement avant que le système ne soit à court d'échange. Mais vous pouvez plutôt surveiller le pourcentage de RAM utilisée pour les mêmes résultats.
Totor
1
Selon votre raisonnement, surveiller l’utilisation de la RAM est suffisant .
Totor
1
@Totor Je préfère ne pas être réveillé au milieu de la nuit par mon application de surveillance pour ordinateur portable car j'ai lancé un lot qui traite un tas de fichiers et a épuisé la mémoire vive. Je préfère que le travail soit terminé, même si cela prend quelques heures de plus à cause du sous-dimensionnement de la RAM, que d'interrompre tout le travail.
jlliagre
3

Ma règle d'appliquer swap dans n'importe quel système est d'avoir la réponse à cela:

  • Quel est le but du système?
  • Combien de mémoire les applications consomment-elles?
  • Est-ce un système critique?
  • Ai-je besoin d'un espace disque temporaire pour les transferts de fichiers?
  • Taux de croissance prévu des applications?

Lorsque je reçois une réponse pour cette information, je redimensionne le système en conséquence. Les années précédentes, je faisais la règle de Sun Microsystem. Jusqu'à 16 Go, deux fois plus de RAM pour SWAP, à partir de 16 Go, le même montant. Par contre, si vous disposez de suffisamment de RAM et que vos applications n'utilisent pas SWAP de force, vous pouvez omettre le swap. Si vous avez besoin, il vous suffit de mettre un nouveau disque ou un nouveau disque et de configurer le SWAP. la règle de Sun s’appliquait principalement parce que sous Solaris, en cas de "panique du noyau", la mémoire serait entièrement vidée afin d’être remplacée par une analyse ultérieure.

BitsOfNix
la source
1

Un échange sera nécessaire si vous ne disposez pas de suffisamment de RAM pour exécuter tous vos programmes.

Vous dites que vous ne faites rien qui nécessite beaucoup de RAM. Donc, vous avez assez de RAM.

Ensuite, vous n'avez pas besoin d' espace d'échange.

Mais , si vous pensez qu'à un moment donné, malgré ce que vous sous-entendez dans votre question, vos programmes utiliseront, disons plus de la moitié (ou deux tiers) de votre RAM (règle empirique), alors veuillez lire l'autre "échange pro" " réponses. Vous n'aurez pas besoin d' échange, mais cela pourrait améliorer les performances de votre système.

Totor
la source
L'utilisation de swap peut aider à éviter un crash catastrophique, mais n'améliorera jamais la performance, pas plus qu'un parachute ne permettra d'accélérer une ferrari. ;-)
Elder Geek
@ElderGeek Cela pourrait être un cas marginal, mais un échange peut vous aider. Il arrive que vous ayez juste assez de RAM pour tout, mais des programmes inactifs peuvent être remplacés pour une meilleure utilisation de la RAM (par exemple un cache disque utile). Je voyais beaucoup cela à la fin des années 90. Je vois cela parfois maintenant quand j'ai <1 Go de RAM libre (cache de disque compris), sans avoir réellement besoin d'espace d'échange.
jbo5112
@ jbo5112 Je n'excluerai pas cette possibilité si vous le dites, mon expérience a montré le contraire jusqu'à présent. Cela n’a rien d’étonnant, car il s’agit d’une utilisation plus féroce du système que d’une règle absolue (que tout le monde semble chercher).
Elder Geek
@ElderGeek Je ne le vois peut-être que maintenant parce que mes disques ont 10 ans et ont désespérément besoin de cache. Habituellement, un problème supplémentaire vient du fait que le swappiness est réglé de manière beaucoup trop élevée dans presque tous les cas, ce qui entraîne une utilisation trop agressive de l’espace de swap. Réduire la valeur de 60 à 10 semble être une recommandation commune. Vous pouvez aller encore plus bas, mais à un moment donné vous allez vider trop de cache disque, causant beaucoup d’E / S supplémentaires lors de l’échange.
Jbo5112
@ jbo5112 Bon point. C'est toujours un équilibre entre les différents sous-systèmes. Je me souviens avoir ajusté des contraintes telles que l’entrelacement des disques durs et le taux de rafraîchissement de la RAM afin d’optimiser les performances maximales des systèmes 80286 dotés de disques Seagate ST225 et ST238. Nous devons toujours aborder les choses au cas par cas pour obtenir le maximum de performances et de fiabilité. Félicitations BTW! La dernière fois que j’ai réussi à tirer une décennie du disque, c’était un Micropolis qui totalisait 600 Mo.
Elder Geek
0

La réponse courte:

Oui, vous avez toujours besoin de permuter, juste au cas où une application ne se soucierait même pas de mapper la mémoire mais mapperait directement la mémoire virtuelle.

Définissez votre fichier d'échange sur:

  • RAM+round(sqrt(RAM)) si vous utilisez l'hibernation
  • round(sqrt(RAM)) si vous ne le faites pas

Réglez votre swappinessà 10 sur un bureau, mais pas sur un serveur!

La réponse longue:

Autrefois:

La règle empirique en vigueur au cours des 25 dernières années est un minimum de 1xRAM et un maximum de 2xRAM , c’est ce que vous verrez tout le temps.

Ce minimum a été mis en place à l'âge de pierre quand j'étais adolescent et que les dinosaures erraient toujours sur Terre et que la RAM était trop chère et que vous aviez absolument besoin de cet espace d'échange pour pouvoir accomplir n'importe quoi.

Le maximum a été défini à ce moment-là en raison de rendements décroissants: il est tout simplement trop lent pour échanger autant de mémoire, car l'accès au disque dur est 1000 fois plus lent que la mémoire vive: bon en cas d'urgence, mais pas vraiment pour un usage quotidien! À l'époque, lorsque vous manquiez d'espace d'échange, il était temps d'ajouter plus de RAM! (ce qui est encore vrai aujourd'hui).

Dans le présent:

  1. Si vous n'utilisez pas le mode hibernation et que votre mémoire est supérieure à 1 Go, la nouvelle règle empirique est la suivante: round(sqrt(RAM))RAMest évidemment la taille de votre RAM en Go?

  2. Si vous utilisez le mode hibernation, vous devez pouvoir échanger la quantité totale de RAM + RAM déjà échangée sur le disque. La formule devient alors: RAM+round(sqrt(RAM))

  3. La règle des rendements décroissants reste valable aujourd'hui pour le maximum, mais si vous ne testez pas votre utilisation réelle, l'utilisation de 2xRAM n'est qu'un gaspillage d'espace disque. N'utilisez donc pas le maximum, à moins que vous n'ayez plus d'espace d'échange (swap) à l'aide des autres méthodes .

Tous ces éléments réunis vous donnent le tableau suivant: (3 dernières colonnes indiquant l’espace de permutation)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB

Ce qui précède est juste une règle de base; ce n'est pas la loi de la gravité!
Vous pouvez enfreindre cette règle (contrairement à la loi de la gravité) si votre cas d'utilisation est différent!

Astuce: allouez toujours SWAP au début d’un disque dur, car les têtes doivent se déplacer moins à l’intérieur du disque.
Oui: sur les disques SSD, l'emplacement de la zone d'échange importe peu car ils utilisent le tunnel quantique au lieu de têtes mobiles et que les disques SSD modernes utilisent toutes leurs cellules mémoire (même l'espace non alloué) pour empêcher la dégradation quantique.

Comment tester si votre utilisation du swap est différente de la règle "générique":

Il suffit d'exécuter:

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

qui vous donnera une liste de tous les programmes en cours qui sont échangés (avec celui qui utilise le plus d'espace d'échange en haut)

Si vous utilisez plus de quelques Ko: redimensionnez à plus que le minimum, sinon, ne vous embêtez pas ...

Si vous êtes sur un serveur, arrêtez de lire maintenant: vous êtes prêt!


Si vous utilisez un client de bureau / ordinateur portable (pas un serveur), vous voulez que votre interface graphique soit aussi réactive que possible et permute uniquement lorsque vous en avez vraiment besoin . Ubuntu a été optimisé pour un échange précoce pour une utilisation sur serveur, mais sur votre client, vous souhaitez modifier gimprapidement cette image brute de 250 mégapixels . Par conséquent, définir votre valeur swappinesssur 10 empêchera le noyau de procéder à une permutation trop tôt, tout en garantissant qu'il ne le sera pas. t swap trop tard:

sudo nano /etc/sysctl.conf

et ajouter:

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

à la fin du fichier, enregistrez le fichier ( Ctrl+ XY+ Enteren nano) et exécutez la commande:

sysctl --system

pour recharger le paramètre ou juste pour l'amour du passé, utilisez l'approche Window $ et redémarrez ... :-)

Fabby
la source
-1

Réponse de compromis: cela dépend de la signification de "devrait".

Avez-vous besoin d’ une partition d’échange en ce sens que quelque chose de grave se produira si vous n’en avez pas dans les conditions de fonctionnement que vous décrivez? Non.

Il est sage d'avoir une partition d'échange juste au cas où vous engendriez une armée de porcs à mémoire de façon accidentelle pour avoir une chance de les tuer avant que le tueur de MOO n'intervienne? Oui.

Si votre RAM physique dépasse "considérablement" l'utilisation de la mémoire de données de tous les programmes que vous exécuterez simultanément, il n'y a aucun avantage en termes de performances à effectuer un échange. S'il dépasse, mais pas "beaucoup", il peut y avoir un avantage en termes de performances si le système d'exploitation est capable d'échanger de la mémoire rarement utilisée pour conserver en mémoire la quantité de données de fichiers fréquemment utilisée.

En résumé, c'est génial d'avoir 16 Go de RAM. Mais, si vous avez également un disque de 1 To, ne pouvez-vous pas en réserver 16 Go à permuter? Ce n'est que 1,5% du disque.

Atsby
la source