Que peut faire spécifiquement Linux quand il a un échange qu'il ne peut pas faire sans échange?
Pour cette question, je veux me concentrer sur la différence entre, par exemple, un PC Linux avec 32 Go RAM et aucun échange contre un PC Linux presque identique avec 16 Go RAM avec un échange de 16 Go. Remarque Je ne suis pas intéressé par le "oui, mais vous pourriez voir une amélioration X si vous ajoutez un échange au PC de 32 Go". C'est hors sujet pour cela question.
J'ai d'abord rencontré l'opinion que l'ajout de swap peut être meilleur que l'ajout de RAM dans les commentaires d'un problème précédent .
J'ai bien sûr lu ceci: Ai-je besoin d'espace de swap si j'ai plus qu'assez de RAM? et ...
mmap
, mais cela semble un risque très spécifique et obscur uniquement associé aux situations OOM et éventuellement seulement private mmap.L'échange est souvent considéré comme un moyen bon marché d'étendre la mémoire ou d'améliorer les performances. Mais lors de la production en masse de périphériques Linux embarqués, cela tourne la tête ...
... Dans ce cas, le swap portera de la mémoire flash, ce qui entraînera sa défaillance des années avant la fin de la garantie. Où doubler le RAM est un couple de dollars supplémentaires sur l'appareil.
Notez que c'est un flash eMMC PAS un SSD! . Généralement, le flash eMMC ne dispose pas de la technologie de nivellement, ce qui signifie qu'il porte BEAUCOUP plus rapidement que les SSD
Il semble y avoir beaucoup d'opinions très contestées à ce sujet. Je suis vraiment à la recherche de faits secs sur les capacités, pas d'opinions "devriez-vous/ne devriez-vous pas".
Que peut-on faire avec le swap qui ne se ferait pas aussi en ajoutant de la RAM?
Hibernation (ou suspension sur disque). La véritable hibernation éteint complètement le système, donc le contenu de RAM est perdu, et vous devez enregistrer l'état dans un stockage persistant. AKA Swap. Contrairement à Windows avec hiberfil.sys
et pagefile.sys
, Linux utilise l'espace de swap pour la mémoire surchargée et l'hibernation.
D'un autre côté, l'hibernation semble un peu capricieuse pour bien fonctionner sous Linux. Que vous "puissiez" hiberner réellement est une chose différente. ¯\_ (ツ) _/¯
Que peut-on faire avec le swap qui ne se ferait pas aussi en ajoutant de la RAM?
Cette question pourrait en fait être reformulée en Que peut-on faire avec non-volatile RAM qui ne serait pas également fait en ajoutant plus de RAM volatile?. Juste parce que vous dédier une partition pour la pagination (une manière dédiée d'interagir avec la RAM volatile), cela ne change pas le fait qu'elle fait toujours partie d'un support de stockage secondaire persistant. La partition de swap n'est pas non plus obligatoire pour mettre un système en veille prolongée, un "swap" "créé sur une partition préexistante peut également être utilisé.
En fin de compte, que vous utilisiez une partition de swap ou un fichier de swap, ce que vous stockerez sont des éléments à écrire sur ou à partir de la RAM. Si vous deviez retirer le cordon d'alimentation d'un système avec une partition de swap activée, cette partition de swap ne serait pas effacée comme par magie.
Bien que ces données d'échange ne soient pas lues lors de votre prochain démarrage (car le fichier d'échange aurait des entrées correspondant à des processus qui ne sont plus en cours d'exécution), et certaines distributions peuvent prendre des mesures délibérées pour les détruire lors d'un arrêt ou d'un redémarrage correct. , si quelqu'un devait retirer un cordon d'un système, il serait en mesure d'examiner cette partition d'échange de manière médico-légale.
En ce qui concerne le cas des périphériques intégrés que vous avez mentionnés, Flash, étant un type de stockage non volatile RAM (NVRAM ou EEPROM), s'use parce que sa capacité à prendre des hits d'E/S (Flash L'endurance cellulaire représentée en termes de nombre de cycles de programme/effacement) pâlit par rapport à celle de la RAM volatile. Vous rasez littéralement une couche d'oxyde chaque fois que vous effectuez une écriture à cet endroit, et finalement il n'y a tout simplement plus d'oxyde à autoriser pour le stockage persistant de la charge et elle fuit littéralement avant sa lecture ultérieure.
En revanche, la capacité de survie de la RAM volatile est pratiquement inexistante (de l'ordre de quelques minutes dans des conditions expérimentales idéales) par rapport au flash, si ou lorsque vous coupez sa source d'alimentation. Dans le cas de volatile RAM il n'y a rien pour arrêter la fuite de la charge et l'état correspondant de la bascule (entrées, détermination des sorties, qui redéterminent ensuite les entrées), aka feedback -loquets contrôlés.
32 Go RAM et pas d'échange contre 16 Go de RAM avec 16 Go d'échange).
Interrogé comme ça, le swap permet surtout d'économiser de l'argent, augmentant le rapport performance/dollar, peut-être aussi par watt.
Mais le swap est toujours plus que "une mémoire aussi lente qu'un disque". Il s'agit d'un stockage temporaire pour les pages mémoire, qui peut être directement (sale comme elles sont, pas de surcharge du système de fichiers) chargé dans RAM si nécessaire).
Bien sûr, beaucoup dépend de la charge (le type de la charge), et l'idée de permutation peut même se retourner. C'est pourquoi il y a le paramètre "swappiness", en plus de swapon
/swapoff
lui-même, et la discussion sur la bonne taille.
De wikipedia, j'ai reçu cette déclaration sur "swap" sous linux (dans l'article "paging")
Le noyau Linux prend en charge un nombre pratiquement illimité de backends de swap (périphériques ou fichiers ...
Si plusieurs backends de swap reçoivent la même priorité, ils sont utilisés de manière circulaire (ce qui est quelque peu similaire aux dispositions de stockage RAID 0), ...
Cela montre que vous pouvez transformer l'échange en quelque chose qui a plus de sens au niveau matériel: un "lecteur scratch" dédié donnerait à ces pages échangées un meilleur accueil. Idéalement, un lecteur de scratch devrait être (très) petit mais rapide et robuste.
Selon la "nouvelle" règle de taille (racine carrée de Giga), votre exemple devrait comparer:
16 GB RAM
+ 0 GB Swap+1000 GB Disk
16 GB RAM
+ 4 GB Swap+ 996 GB Disk
Parce que ce qui n'a vraiment aucun sens, c'est:
16 GB RAM+0 GB Swap
+ 1000 GB Disk
12 GB RAM+4 GB Swap
+ 1000 GB Disk
Ce serait une partition de swap sur un tmpfs ("ramdisk") - peut-être même pas trop dangereux, mais je ne vois aucun avantage ici. Vous ne pouvez même pas hiberner.
(voir ci-dessous pour zram et zswap, cependant, lorsque vous ajoutez compression à cela)
Pour comprendre l'échange Vous devez prendre en compte l'ensemble du système et la charge moyenne. Et parce que vm/mm (gestion de la mémoire virtuelle) est un système complexe, il est vraiment difficile de nommer un avantage clair. J'aime l'idée d'une transistion "en douceur" dans un système surchargé.
J'ai 8 Go RAM et pas de swap. Mais je défends quand même le concept, AFA je peux comprendre :-)
J'ai trouvé cette citation redhat dans l'un des liens OP. Le scénario est une demande de mémoire toujours croissante, sur 2 Go RAM + 2 Go Swap, si je me souviens bien:
... Dans notre cas [juste illustré], beaucoup de swap est disponible, donc le temps de mauvaise performance est long.
Mais l'alternative est OOM
encore plus tôt!
Le "temps de mauvaise performance" est long, oui, mais la performance ne se dégrade que proportionnellement à la charge. Je ne connais pas le contexte, peut-être qu'ils veulent juste mettre en garde contre une partition d'échange trop grande . Il sonne anti-swap, mais au deuxième regard ne l'est pas.
Là encore, pour la même raison, je n'ai aucun échange. Je veux savoir quand moi et mes applications atteindrons le plafond, puis je déciderai si je dois diminuer la charge, acheter plus RAM ou activer une partition pour swap (j'en ai une ou deux) petites partitions prêtes pour cela).
J'ai recherché cette zram, puis zswap chose: très intéressant ...:
En comparaison, zswap agit comme un cache RAM pour les périphériques d'échange. Cela fournit à zswap un mécanisme d'éviction pour les pages échangées moins utilisées, ce qui manque à zram.
D'un autre côté, zram
fonctionne sans aucun périphérique d'échange. Cela rend possible ce que j'ai dit n'a pas de sens, mais je n'ai pas pris en compte la compression.
Mon point est ce mécanisme d'éviction inhérent au "swap". Cela peut être très utile sous une charge élevée, que vous échangiez en échangeant ou en compressant.
Pour un total donné, il vaut toujours mieux l'avoir comme RAM que swap.
Il existe une différence de comportement entre un système noswap et un système d'échange, qui peut être utile ou non: la raclée. Au fur et à mesure que le système de swapping commence à manquer de mémoire virtuelle totale disponible, il devient de plus en plus bloqué lors du déplacement des pages entre le swap et la RAM. Cela ralentit le système. Dans certaines circonstances, cela peut permettre une intervention manuelle ou automatisée pour réduire la charge et récupérer le système.
Dans un système noswap, les performances restent relativement stables jusqu'à une utilisation très élevée de la mémoire, point auquel le système d'exploitation commence à décharger les pages en lecture seule des exécutables mappés en mémoire et a également très peu de place pour le cache disque. Il est probable que le tueur OOM sera déclenché à ce stade. Donc une panne soudaine plutôt qu'une lente dégradation.
Je suis d'accord que le swap n'a pas de sens pour les systèmes embarqués, en particulier dans les petits appareils Flash intégrés. Le monde est plein de petits routeurs grand public Linux, d'ampoules, etc. avec une utilisation de la mémoire assez fixe et aucun échange.
Le swap, contrairement à la RAM, peut être facilement désactivé, contraint, ralenti ou étendu - une fonctionnalité utile lors du développement d'une stratégie d'allocation de mémoire pour les applications.
Supposons que votre noyau voit 4G de RAM et 4G de swap, et que le système d'exploitation et les applications de développement (navigateur, IDE, etc.) consomment 3G. C'est 5G gratuit virtuel: 1G de réel et 4G de swap .
Vous développez votre nouvelle base de données ou votre nouveau jeu, ce qui veut dire que la 2G charge ses ressources chaudes. Donc ça continue, sbrk
et mmap
à plusieurs reprises, et avec swap on, obtient son 2G réel par la merveille du noyau = VM layer. Hourra, votre code fonctionne bien. (Et votre navigateur ou quoi que ce soit a été relégué sur la page pour échanger l'enfer.)
Maintenant, arrêtez votre programme. swapoff
et réexécutez votre programme. Cette fois, alors qu'il va de son rant sbrk
, il obtient un ENOMEM
et votre code doit faire face à un chemin malheureux. Comment réagit-il? Comment ça danse dans ce scénario?
Ou montez une clé USB, mkswap
et swapon
sur le support USB, et augmentez vm.min_free_kbytes
pour forcer le noyau à aller encore plus sur cette clé USB. Relancez votre programme. Comment se comporte votre application avec une machine virtuelle à malloculation lente?
Que diriez-vous de faire tout ce qui précède pendant que votre application est en cours d'exécution? Comment se comporte-t-il une fois qu'il est en cours d'exécution et commence à rencontrer des conditions de MOO?
Il n'y a pas de fin à la façon dont vous pouvez torturer un système faible en réel RAM en ajustant votre sous-système de swap en direct. Et contrairement aux cgroups ou rusage, vous n'avez pas à arrêter votre processus pour modifier le virtuel RAM à sa disposition.
Vous pouvez tester ce type d'abus de mémoire, en utilisant des simulations pour simuler ENOMEM
ou ralentir brk
, et c'est une chose appropriée à faire car il est stable. Mais rien ne vaut l'exercice de tir réel dans des environnements à faible mémoire pour extraire l'or des processus stochastiques. Swap permet à un testeur de modifier les ressources et les caractéristiques de la mémoire du noyau à la volée, facilement, d'une manière qui est convenablement similaire au monde réel de la mémoire faible. Ajouter ou supprimer RAM sticks ne fournit pas cette valeur.
Ceci est un peu un cas de niche, et certes, vous pouvez simplement ajouter plus de RAM, mais ...
Tout le monde semble supposer que l'échange signifie un stockage physique non volatile, comme un disque dur ou un lecteur flash. L'échange est plus un processus qu'un emplacement physique.
Considérez les manigances bizarres suivantes:
Une utilisation pour le swap (qui se trouve être en RAM), c'est plus que ce que vous obtenez de plain RAM (sans partition de swap dedans).
Alors, oui, vous pourriez techniquement simplement ajouter plus de RAM; ce genre de bizarrerie signifierait que peu importe la quantité de RAM que vous ajoutez, vous pouvez toujours vous débattre un peu plus d'espace (tant que vous connaissez vos données/tout ce qui convient).
Vous avez déjà la réponse, mais votre question montre que vous n'appréciez pas encore cette réponse.
La réponse simple est: "Soyez volumineux et bon marché (et peut-être flexible)". Vous le savez déjà, mais vous le rejetez aussi. Tu ne devrais pas.
La RAM n'est pas "quelques dollars supplémentaires". Gigabyte pour gigaoctet, par exemple, ECC RAM sur mon serveur coûte 130 £ pour 32 Go (RDIMM 2400 DDR4), soit environ 4 £/Go. Le SDD que j'utilise pour le swap coûte environ 100 à 130 £ par TERABYTE, soit environ 0,11 £/Go (Micron/Intel avec protection contre les pertes d'alimentation). Les batteries de serveurs peuvent prendre des centaines à des milliers (dans de nombreux cas) de Go par serveur, avec des centaines de serveurs.
La RAM est également plus gourmande en énergie - un processus inactif dans RAM nécessite RAM alimentation et rafraîchissement pendant que sur SSD la consommation d'énergie est beaucoup moins. Sur les petits appareils intégrés cela peut être un problème à part entière.
Le nivellement de l'usure est également moins un problème que vous ne le pensez sur la plupart des appareils. Les SSD durent plus longtemps que les gens ne le pensent, et les appareils de conception commerciale choisiront un SSD correspondant à leur utilisation prévue, et non les extrêmement pauvres de certaines cartes.
Enfin, Swap est plus flexible. Si votre tâche utilise normalement 32 Go mais brièvement et rarement un aspect de celle-ci a besoin de 64 Go, avec RAM vous devez fournir 64 quand même. Avec swap, cela fonctionne sur 32 et utilise brièvement, puis élimine, troc, pour les moments exceptionnels.
Tl; Dr - vous manquez complètement le point économique.
Que peut-on faire avec le swap qui ne se ferait pas aussi en ajoutant de la RAM?
L'hibernation nécessite un fichier d'échange, même si l'échange n'est pas utilisé autrement.
A part ça, rien. L'échange est un bon stopgap si
La RAM est vraiment chère ou limitée par rapport à l'espace disque
Le système est un système à usage général sous le contrôle d'un utilisateur qui peut essayer de temps à autre des logiciels et/ou des charges de travail imprévisibles.
Si des scénarios MOO sont possibles et que la pagination sur le disque est préférable à une panne pure et simple des programmes.
Qu'est-ce qui peut être échangé spécifiquement RAM ne peut pas
Deux choses:
A. Soyez là quand RAM est plein.
B. Maintenez les pages de mémoire qui ne sont pas réellement utilisées par les processus à un moment donné (car elles sont bloquées à certaines conditions) pour permettre à RAM d'être utilisé pour autre chose).
Si vous avez suffisamment de RAM pour satisfaire toute demande de mémoire de tous les processus qui s'exécuteront simultanément, ou si cela ne vous dérange pas les erreurs de MOO, A peut être ignoré.
Linux utilise gratuitement RAM pour mettre en cache les lectures et écritures des blocs-périphériques, mais ce n'est pas obligatoire. RAM est plus rapide que les périphériques par blocs. Autoriser Linux à consulter la page les choses que les processus n'utilisent pas pour permuter permettront d'utiliser plus de RAM pour mettre en cache les lectures de périphérique de bloc. Si vous ne vous souciez pas de la vitesse d'accès à votre périphérique de bloc, qui peut appliquer dans des environnements intégrés comme les routeurs, etc., B peut être ignoré (et dans ces situations, vous ne vous souciez pas de l'hibernation de toute façon).
Le swap n'est pas un cache disque - il est possible que les pages en swap ne soient pas associées à un fichier disque ou ne soient jamais destinées à être écrites sur le disque.
... Dans ce cas, le swap portera de la mémoire flash, ce qui entraînera sa défaillance des années avant la fin de la garantie. Où doubler le RAM est un couple de dollars supplémentaires sur l'appareil.
Je pense que vous trouverez que c'est faux. Tout d'abord, quelques dollars supplémentaires ne doubleront pas une quantité raisonnable de RAM. Deuxièmement, le flash est moins cher que la RAM. Troisièmement, l'échange est utilisé pour les données inactives. Si vous avez une situation dans laquelle la partition de swap est écrite en continu, vous avez trop peu RAM et sans swap, un processus important se serait écrasé.
De plus, les écritures aléatoires sur un SSD complet (qui provoquent leur échec précoce) sont lentes. Ils sont vraiment très, très lents. Votre SSD ne mourra pas prématurément si votre ordinateur n'est pas ralenti à une analyse par échange.
Il est de loin préférable que votre ordinateur ralentisse considérablement lorsqu'il manque de mémoire que certains processus importants se bloquent.
Maintenant, que pouvez-vous faire avec le swap que vous ne pouvez pas faire avec la RAM?
L'échange peut vous faire économiser de l'argent. RAM est plus cher que la quantité de disque correspondante. Le but est d'optimiser le rapport coût-performance. Bien sûr, RAM vaut toujours mieux que swap, mais cela vous coûtera plus cher et se perdra si vous ne l'utilisez pas tout.
L'utilité du swap dépend également beaucoup du type de charge de travail. Par exemple, si de nombreuses applications sont ouvertes, mais que vous n'en utilisez activement qu'une seule, alors le RAM utilisé par les programmes inactifs peut être libéré et utilisé à la place par le processus actif. d'autre part, en utilisant un seul programme gourmand en mémoire qui a besoin de plus de mémoire que la quantité disponible de RAM est une utilisation non optimale du swap.