D'après ce que je comprends, le but d'une partition de swap sous Linux est de libérer des informations "moins fréquemment consultées" de RAM et déplacez-le vers une partition spécifique sur votre disque dur (au prix de le rendre plus lent à lire ou à écrire), permettant essentiellement aux applications actives d'avoir plus de "mémoire haute vitesse".
Ceci est idéal lorsque vous êtes sur une machine avec une petite quantité de RAM et que vous ne voulez pas rencontrer de problèmes si vous en manquez. Cependant, si votre système a 16 Go ou 2 Go de RAM, et en supposant que vous n'exécutez pas une base de données MySQL pour StackExchange ou que vous n'éditez pas un film de pleine longueur 1080p sous Linux, faut-il utiliser une partition de swap?
Vous devriez très certainement toujours activer le swap, sauf s'il y a une raison très convaincante et interdite (comme, pas de disque du tout, ou seulement un disque réseau présent ). Devriez-vous avoir un échange de l'ordre des tailles ridicules souvent recommandées (comme, 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'y en a de physique RAM (en fait, dans ce cas, le swap est pas très utile du tout parce que cela affecte sérieusement les performances). De nos jours, la principale incitation au swap est pas pour transformer par magie 16 Go de RAM en 32 Gio, mais pour utiliser plus efficacement la RAM disponible et installée).
Sur un ordinateur moderne, RAM ne va pas inutilisé. Inutilisé RAM est quelque chose que vous pourriez tout aussi bien ne pas avoir acheté et économisé de l'argent à la place. Par conséquent, tout ce que vous chargez ou tout ce qui est autrement mappé en mémoire, tout ce qui pourrait peut-être être réutilisé par n'importe qui plus tard (limité par des contraintes de sécurité) est mis en cache. Très peu de temps après le démarrage de la machine, tout physique RAM aura été utilisé 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:
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 bientôt besoin. Cela a un impact négatif sur les performances.
L'option n ° 3 signifie que vous déplacez rapidement quelque chose dont vous n'avez (probablement) pas besoin sur un stockage lent. C'est bien parce que maintenant quelque chose dont vous avez besoin pouvez utiliser la RAM rapide.
En supprimant l'option # 3, vous avez effectivement limité le système d'exploitation à faire soit # 1 soit # 2. Recharger une page à partir du disque équivaut à la recharger à partir du swap, sauf que le rechargement à partir du swap est généralement moins probable (en raison des bonnes décisions de pagination).
En d'autres termes, en désactivant le swap, vous ne gagnez rien, mais vous limitez le nombre d'options utiles du système d'exploitation pour traiter une demande de mémoire. Quel peut-être pas, mais très probablement peut-être un inconvénient (et ne sera jamais un avantage).
Le lecteur attentif de mmap
page de manuel , en particulier la description de MAP_NORESERVE
, remarquera une autre bonne raison pour laquelle l'échange est quelque peu une nécessité même sur un système avec "assez" de mémoire physique:
"Lorsque l'espace d'échange n'est pas réservé, on peut obtenir SIGSEGV lors d'une écriture si aucune mémoire physique n'est disponible."
- Attendez un instant, qu'est-ce que cela signifie?
Si vous mappez un fichier, vous pouvez accéder directement au contenu du fichier comme si le fichier se trouvait en quelque sorte, par magie, dans l'espace d'adressage de votre programme. Pour un accès en lecture seule, le système d'exploitation n'a besoin en principe 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 bien sûr pas ce qui se fait, mais en principe, vous pouvez accéder à des téraoctets de données avec une seule page de mémoire physique). Et si vous aussi écrivez dans un mappage de fichier? Dans ce cas, le système d'exploitation doit avoir une page physique - ou un espace d'échange - prêt pour chaque page écrite. Il n'y a pas d'autre moyen de conserver les données tant que le processus d'écriture différée des pages sales n'a pas fait son travail (ce qui peut prendre plusieurs secondes). Pour cette raison, le système d'exploitation réserve (mais n'engage pas nécessairement) l'espace d'échange, donc au cas où vous écrivez sur un mappage alors qu'il se trouve qu'il n'y a pas de page physique inutilisée (c'est tout à fait possible et normal), vous ' re garanti que cela fonctionnera toujours.
Et maintenant s'il n'y a pas d'échange? Cela signifie qu'aucun échange ne peut être réservé (duh!), Et cela signifie que dès qu'il n'y a plus de pages physiques libres et que vous écrivez sur une page, vous obtenez une agréable surprise sous la forme de votre processus de réception une faille de segmentation, et probablement tuée.
Cependant, la recommandation traditionnelle de faire du swap deux fois la taille de RAM est absurde. Bien que l'espace disque soit bon marché, il n'est pas logique d'attribuer autant de swap. Gaspiller quelque chose qui est bon marché est toujours du gaspillage , et vous vous ne voulez absolument pas pour permuter continuellement des ensembles de travail de plusieurs centaines de mégaoctets (ou plus).
Il n'y a pas de taille d'échange "correcte" (il y a autant de tailles "correctes" qu'il y a d'utilisateurs et d'opinions). J'attribue généralement un 512 Mo fixe, quelle que soit la taille 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 se permettre de nos jours, même sur un petit disque. D'un autre côté, l'ajout de plusieurs gigaoctets de swap n'est pas mieux. Vous n'allez pas les utiliser, sauf en cas de problème grave.
Même sur un SSD, le swap est de plusieurs ordres de grandeur plus lent que RAM (en raison de la bande passante et de la latence du bus), et bien qu'il soit très acceptable pour déplacer quelque chose vers échange qui ne sera probablement plus nécessaire (c'est-à-dire que vous ne le ferez probablement pas à nouveau, donc votre pool de pages disponibles est effectivement agrandi gratuitement), si vous avez vraiment besoin des quantités considérables de swap (c'est-à-dire que vous avez une application qui utilise par exemple un ensemble de données de 50 Go), vous êtes à peu près perdu.
Une fois que votre ordinateur a commencé à échanger des gigaoctets et 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'échanges n'a donc aucun sens.
Je vais être en désaccord avec quelques-unes des 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 pour mes machines personnelles et mes machines virtuelles.
Ces jours-ci, je les mesure environ 1 à 1,5 fois la mémoire. 2 fois la mémoire était la règle de base. Le disque d'échange est "bon marché" en ce qu'il n'a pas besoin d'être sauvegardé ou protégé.
Si vous manquez de mémoire, votre espace d'échange vous donne un peu de temps et un coussin pour résoudre le problème.
Sachez que des choses comme/tmp peuvent résider dans l'espace de swap.
La zone de swap peut contenir un vidage partiel du noyau afin qu'il puisse être restauré au prochain redémarrage. Cela pourrait être bien pour une future urgence de débogage que vous êtes appelé à faire.
Peut-être:
J'ai beaucoup réfléchi à ce sujet et vu des opinions atterrir des deux côtés de l'argument plus de fois que je ne peux en compter. Mon approche était de développer un moyen de le découvrir.
Commencez avec une partition de swap active de ce que vous pensez être une taille suffisante.
Ensuite, ouvrez un terminal dans un espace de travail et exécutez la commande free -hs 1
qui signalera l'utilisation une fois par seconde.
Basculez éventuellement vers d'autres espaces de travail.
Faites tout ce que vous êtes susceptible de faire et encore 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 un véritable entraînement pour vous, cela pourrait signifier ré-encoder une demi-douzaine de vidéos tout en exécutant une opération de compilation et en vérifiant votre courrier électronique ou autre. Avouons-le, tout dépend de la façon dont Vous utilisez votre système.
Lorsque vous sentez que le système est sous une charge élevée (ou aussi élevée que possible, puis certains), regardez le terminal et examinez les résultats. ou mieux rediriger la sortie vers un fichier en ajoutant >output.txt
à la commande afin que vous puissiez examiner l'exécution complète. Si votre Swap utilisé ne dépasse jamais Mem gratuit, vous n'avez pas besoin de swap. Si c'est le cas, vous le faites.
Je n'ai pas besoin de swap. Peut-être que oui. Pourquoi ne pas le découvrir?
En ce qui concerne le changement de taille, les règles générales sont généralement surévaluées car il s'agit d'une question basée sur l'utilisation.
REMARQUE: 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!
J'ai rencontré des problèmes dans le passé avec un "appareil" que j'ai construit, fonctionnant sous Linux - fonctionnant sur un périphérique flash compact, je ne voulais pas porter mon CF en utilisant swap, et il y avait assez de mémoire pour l'application.
La plupart de ces appareils fonctionnaient bien, mais sur une boîte particulièrement occupée, j'ai rencontré un problème:
FRAGMENTATION DE LA MÉMOIRE
Sans espace de swap, la mémoire est progressivement devenue de plus en plus fragmentée, en particulier avec les processus longs (même si j'avais beaucoup de mémoire libre, tout était en très petits bits). J'ai mis un espace de swap dedans, et j'ai dit à Linux de ne pas l'utiliser à moins qu'il ne le soit; cela a résolu le problème complètement.
En plus de tout le reste, l'espace d'échange 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 de leur échange, ils sont effectivement défragmentés.
Consultez/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 est la moitié de la taille du bloc suivant, de 4 Mo à gauche, à 4 Ko à droite (c'est-à-dire 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é). 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 sur les colonnes - 1 bloc dans la colonne la plus à gauche, 1024 sur la colonne la plus à droite.
La mémoire est allouée à partir du pool le plus à droite possible; par exemple. si votre programme veut 12kb de mémoire (en une fois), il le prendra dans la colonne 16kb; le reste apparaîtra dans la colonne de 4 Ko. S'il n'y a pas de blocs de 16 ko, cela prendra des blocs de 32 ko, résultant en un 16 ko et un 4 ko, et ainsi de suite.
S'il n'y a pas de blocs de mémoire suffisamment grands ET QUE VOUS AVEZ UN ESPACE D'ÉCHANGE, alors par ex. si vous voulez 16 Ko de mémoire, il trouvera le bloc de 16 Ko le moins utilisé (qui pourrait, par exemple, contenir un bloc utilisé de 4 Ko, un bloc disponible de 4 Ko et 2 autres blocs de 4 Ko), déplacez les parties UTILISÉES uniquement pour permuter, et allouer 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 Ko et 8 Ko, et pas grand chose d'autre.
DANS LA mesure où je peux le dire (en passant par les machines tombées en panne!), Le noyau se déplacera de mémoire en échange et en mémoire, mais ne se déplacera jamais de mémoire en mémoire.
Une partition de swap a une valeur significative au-delà de simplement agir comme un extra RAM lorsque vous êtes à court.
D'une part, Linux utilise autant de mémoire que possible pour mettre en cache les fichiers et IO opérations, si vous avez un échange, vous pouvez trouver que plus de mémoire va dans la mise en cache IO et en le rendant plus rapide (en minimisant l'accès au disque et en réduisant également l'usure des SSD) au lieu de conserver les données qu'un programme a allouées mais n'utilise 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 par laquelle il permettra d'allouer nominalement les pages même s'il n'est pas sûr qu'il dispose d'une mémoire réelle pour les remplir. Ceci est plus efficace que de faire une vérification et une mappage correctes de chaque allocation et ne cause généralement aucun problème. Cependant, l'heuristique que le noyau utilise pour déterminer si autoriser une allocation est raisonnable inclut le niveau de swap disponible sur le système, donc les allocations peuvent être plus rapides si le système a beaucoup de swap, même s'il n'est pas beaucoup utilisé.
Ces facteurs réunis m'amènent à croire personnellement qu'il vaut mieux avoir un échange sur presque tous les systèmes normaux, mais pour les grandes tailles de RAM, j'ignore la règle RAM * 2 et plafonne simplement mon échange à 4-8 Go (en fonction de la taille du disque ).
Vous ne devriez jamais avoir un swap plus grand que la taille maximale que vous seriez en mesure de tolérer d'attendre que le noyau soit swap in/out; sinon, vous créez simplement un nouveau mode de défaillance pour votre système (vous vous enlisez irrémédiablement dans l'échange). Notez que, bien que les disques modernes soient capables de transférer de l'ordre de Go/sec, Linux ne peut généralement déplacer le swap à des taux plus proches de centaines de ko, ou au mieux de quelques Mo, par seconde. Un échange énorme peut donc rendre votre système inutilisable pendant des minutes, des heures, voire des jours.
Si vous avez suffisamment de mémoire physique pour ce que vous faites, la taille idéale pour le swap est de l'adapter à la quantité de processus de "données indésirables" conservés mais jamais utilisés. Ceci est probablement de l'ordre de quelques à quelques centaines de mégaoctets. Cette stratégie permet à toute votre mémoire physique d'être utilisée pour mettre en cache des informations utiles plutôt que comme stockage permanent de données qui ne seront probablement plus jamais utilisées.
Si vous ne disposez pas d'une mémoire physique suffisante, vous devez évaluer si vous pouvez tolérer un ralentissement sévère dû à un échange intense. Si c'est le cas, avoir jusqu'à 1-2 Go de swap peut-être est logique, et peut-être jusqu'à 4 Go si vous avez des disques extrêmement rapides. Mais plus que cela ne fera qu'aggraver les modes de défaillance de votre système, et vous devriez envisager d'acheter simplement plus RAM à la place.
Seulement si vous voulez être en mesure d'hiberner pour permuter (Cette fonctionnalité est également appelée "suspendre sur le disque" et implique d'enregistrer tout le contenu de RAM et coupure de l'alimentation). En règle générale, ce n'est que utilisé sur les ordinateurs portables et autres appareils mobiles, cela dépend donc.
Il n'y a pas de réponse universelle et claire car cela dépend d'une tâche que vous êtes sur le point d'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, quelle que soit la quantité de RAM dont vous disposez. Si vous avez un ordinateur de bureau ou un hôte à tâches mixtes et que vous avez 16+ Go de vitesse rapide RAM - jetez un œil ici: zRam
Il n'y a aucun moyen de savoir si vous avez besoin d'espace d'échange 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 le fait d'avoir un espace d'échange affecte négativement les performances du système. Ceci est une erreur. Tant que vous avez suffisamment de RAM, avoir une zone de swap quelle que soit sa taille ne nuit pas du tout aux performances. Ce qui affecte les performances est d'être court en RAM et d'utiliser efficacement l'espace de swap.
cas 1: Si vous n'avez pas d'espace de swap et que vous êtes en manque 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 êtes en manque de RAM, le noyau choisira les pages de mémoire moins 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 des parties ou tout mon travail parce que le noyau pense que mes applications valent la peine d'être tuées. De plus, la taille actuelle d'un disque moyen étant de l'ordre de TB, réserver quelques pour cent pour le swap ne devrait pas poser de problème.
Ma règle pour appliquer le swap dans n'importe quel système est d'avoir la réponse à cela:
Lorsque j'obtiens une réponse pour ces informations, je dimensionne le système en conséquence. Au cours des années précédentes, je faisais la règle générale de Sun Microsystem. Jusqu'à 16 Go deux fois plus RAM pour SWAP, à partir de 16 Go jusqu'à la même quantité. Mais d'un autre côté, si vous en avez assez RAM pour épargner) et vos applications n'utilisent pas SWAP de force, vous pouvez omettre l'échange. Si vous en avez besoin, il suffit de mettre un nouveau disque ou lun et de configurer le SWAP. la règle de Sun s'applique principalement parce que sur Solaris en cas de "panique du noyau", la mémoire serait entièrement vidée pour être échangée pour une analyse plus approfondie.
Oui, vous avez toujours besoin d'un échange , juste dans le cas peu probable où une application ne dérange même pas la cartographie de la mémoire mais mappe directement la mémoire virtuelle.
Définissez votre fichier d'échange sur:
RAM+round(sqrt(RAM))
si vous utilisez l'hibernationround(sqrt(RAM))
si vous ne le faites pasRéglez votre swappiness
sur 10 sur un bureau, mais pas sur un serveur!
La règle générale utilisée depuis 25 ans est un minimum de 1xRAM et un maximum de 2xRAM , c'est donc ce que vous verrez constamment cité .
Ce minimum a été reculé à l'âge de pierre quand j'étais adolescent et les dinosaures parcouraient encore la Terre et parce que RAM était tout simplement trop cher et vous aviez absolument besoin de cet espace d'échange pour pouvoir accomplir n'importe quoi.
Le maximum a été fixé à ce moment-là en raison de rendements décroissants: il est tout simplement trop lent d'avoir à échanger autant de mémoire car l'accès au disque dur est un facteur 1000 plus lent que la RAM: bon en cas d'urgence, mais pas vraiment bon pour un usage quotidien! À l'époque, lorsque vous manquiez d'espace de swap, il était temps d'ajouter plus de RAM! (ce qui est toujours vrai aujourd'hui).
Si vous n'utilisez pas l'hibernation et que votre mémoire dépasse 1 Go, la nouvelle règle de base est round(sqrt(RAM))
où RAM
est évidemment votre RAM taille en Go et sqrt
la racine carrée. : -)
Si vous utilisez l'hibernation, vous devez pouvoir échanger la totalité de la quantité de RAM + déjà échangée RAM sur le disque, ainsi la formule devient: RAM+round(sqrt(RAM))
La règle des rendements décroissants est toujours valable aujourd'hui, mais à moins que vous ne testiez votre utilisation réelle, la prise de 2xRAM n'est qu'un gaspillage d'espace disque , alors ne n'utilisez pas le maximum à moins que vous ne manquiez d'espace de swap en utilisant les autres méthodologies .
Tous ces éléments ensemble vous donnent le tableau suivant: (3 dernières colonnes indiquant l'espace d'échange)
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
2TB 46GB 2094GB 4TB
4TB 64GB 4160GB 8TB
8TB 91GB 8283GB 16TB
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 particulier est différent!
Astuce Pro: 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 SSD, peu importe où vous localisez la zone de swap car ils utilisent la tunnelisation quantique au lieu de déplacer les têtes et les SSD modernes utiliser toutes leurs cellules de mémoire (même l'espace non alloué) pour empêcher la dégradation quantique.
Exécutez simplement:
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 de swap 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 client de bureau/ordinateur portable (pas un serveur), vous voulez que votre interface graphique soit aussi réactive que possible et n'échangez que lorsque vous en avez vraiment besoin . Ubuntu a été optimisé pour permuter tôt pour l'utilisation du serveur, mais sur votre client, vous voulez éditer cette énorme image brute de 250 mégapixels dans gimp
pour être rapide , donc régler votre swappiness
sur 10 empêchera le noyau de s'échanger trop tôt, tout en s'assurant qu'il ne s'échange pas trop tard:
Si tu as un sysctl.conf
fichier,
Sudo nano /etc/sysctl.conf
Si tu as un sysctl.d
répertoire mais pas sysctl.conf
fichier, créez un nouveau fichier:
Sudo nano /etc/sysctl.d/35_swap.conf
et dans les deux cas 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+Enter en nano) et exécutez a:
sysctl --system
pour recharger le paramètre ou adopter l'approche Window $ et redémarrer ... : -)
L'échange sera nécessaire si vous n'avez pas assez de RAM pour exécuter tous vos programmes.
Vous dites que vous ne faites rien qui nécessite beaucoup de RAM. Donc, vous avez suffisamment de RAM.
Ensuite, vous n'avez pas besoin d'espace d'échange.
Mais, si vous pensez qu'à un moment donné, malgré ce que vous indiquez dans votre question, vos programmes utiliseront, disons plus de la moitié (ou les deux tiers) de votre RAM = (règle générale), veuillez lire les autres réponses "pro-swap". Vous n'aurez pas besoin de swap, mais cela pourrait améliorez les performances de votre système.