Espace d'échange (swap)

L'espace d'échange, aussi appelé par son terme anglais swap space ou simplement swap, est une zone d'un disque dur faisant partie de la mémoire virtuelle1) de votre ordinateur. Il est utilisé pour décharger la mémoire vive physique (RAM) de votre ordinateur lorsque celle-ci arrive à saturation. L'espace d'échange, dans Ubuntu, se trouve généralement sous une forme de partition de disque dur – on parle alors de partition d'échange. Il peut aussi se présenter sous forme de fichier – on parle alors de fichier d'échange.

Par défaut, Ubuntu calcule et s'attribue automatiquement un espace d'échange suffisant ou recommandé lors de son installation. Il n'est pas nécessaire d'effectuer des tâches supplémentaires pour assigner un espace d'échange minimum à Ubuntu. Cependant, évaluer ses besoins en espace d'échange peut mieux rationaliser vos ressources.

Le présent document se veut être une présentation succincte de ce qu'est l'espace d'échange dans Ubuntu et des méthodes pour créer, modifier et supprimer cet espace d'échange.

Depuis la Ubuntu 17.04, la swap n'est plus une partition mais un fichier situé dans /swapfile

Qu'est-ce qu'un espace d'échange ?

La mémoire vive physique (RAM) de l'ordinateur est utilisée pour stocker des données en cours de traitement. Si celle-ci se remplit presque entièrement mais que votre ordinateur a tout de même besoin de ressources pour procéder à des traitements, votre système d'exploitation peut déplacer temporairement des pages mémoire vers l'espace d'échange défini dans votre disque dur afin de libérer des ressources mémoire. L'espace d'échange agit ainsi en tant qu'extension de votre mémoire vive physique : elle récupère, au besoin, des blocs mémoire en excès de votre mémoire vive physique.

Notez cependant que l'espace d'échange se situant dans votre disque dur, l'accès aux données contenues dans celui-ci est plus lent que celles contenues directement dans la RAM. De plus, l'utilisation de l'espace d'échange ralentit significativement le système et entraîne une activité permanente du disque dur (bruits de "grattements"), provoquant une usure prématurée du matériel. De ce fait, l'espace d'échange ne doit pas être considéré comme un remplacement de votre mémoire vive physique, mais plutôt comme un mécanisme d'appoint.

La plupart des systèmes d'exploitation – sinon tous – gèrent un espace d'échange. Avec les systèmes d'exploitation de type GNU/Linux, dont fait partie Ubuntu, cette zone d'échange se présente généralement sous la forme d'une partition de disque dur dédiée à cet effet. À titre comparatif, Microsoft® Windows® utilise un ou des fichiers dans chacun de ses volumes afin de jouer ce rôle. Il est aussi possible de créer et utiliser des fichiers assurant un espace d'échange.

Taille d'un espace d'échange

Il n'y a pas à proprement parler qu'une seule règle définissant la quantité d'espace à allouer à la zone d'échange, qu'elle soit sous forme de partitions ou de fichiers. Beaucoup de conditions entrent dans les facteurs influençant ce choix. Cependant, compte tenu des capacités des ordinateurs modernes, on peut relever des recommandations généralement acceptées :

  • Votre ordinateur dispose de 1 Gio de RAM ou plus ? Allouez un espace d'échange de 1× à 1,5× la taille de votre RAM ;
  • Votre ordinateur dispose de moins de 1 Gio de RAM ? Allouez un espace d'échange de 1,5× à 2× la taille de votre RAM.

Pourquoi ai-je besoin d'un espace d'échange ?

  • Utilisation de programmes exigeants en ressources : Parfois, des programmes exigent beaucoup de ressources dans votre ordinateur (comme la suite bureautique LibreOffice, des jeux tels AlienArena ou des logiciels de montage vidéo tels Cinelerra), ce qui amène votre ordinateur à nécessiter davantage de ressources que disponibles. Souvent, une partie de la mémoire vive utilisée au chargement de ces programmes n'est réellement exploitée que lors de leur initialisation et n'est plus utilisée par la suite. Le système peut libérer des ressources en déplaçant de telles pages mémoire vers un espace d'échange dans votre disque dur.
  • Hibernation (mise en veille prolongée) : La fonction d'hibernation conserve votre système en l'état actuel lors de la mise hors-tension de votre ordinateur, ce qui vous permet de reprendre plus rapidement votre travail là où vous l'avez laissé tout en ne consommant pas d'énergie de votre pile ou de votre alimentation secteur. Techniquement, il s'agit d'une copie de l'ensemble des informations contenues dans la mémoire vive de votre ordinateur vers l'espace d'échange de votre disque dur ; pour cette raison, une partition d'échange au moins aussi grande que la quantité de votre mémoire vive est requise pour profiter de cette fonctionnalité.2)
  • Circonstances imprévues : Des évènements imprévisibles peuvent survenir lors de l'utilisation de votre système (un programme ayant une fuite de mémoire, une action qui a besoin davantage de mémoire pour un court laps de temps ou une combinaison de ces évènements). Disposer d'un espace d'échange vous offre un sursis pour localiser le problème ou, à tout le moins, terminer votre travail en cours.
  • Cache mémoire : Puisque l'accès aux fichiers de votre disque dur est plus lent que ceux placés en mémoire vive, le noyau Linux place en cache dans la mémoire vive les fichiers ouverts. Ceci accélère grandement les traitements. Afin de conserver un maximum d'espace pour ce cache, une partie de la RAM réservée par les programmes mais non utilisée est déplacée dans l'espace d'échange.

Aller plus loin...

Cette section s'adresse aux utilisateurs avertis.
Les manipulations avancées ci-dessous permettent de mieux analyser et gérer les ressources système concernant l'espace d'échange. Une mauvaise utilisation des outils et des commandes ci-dessous peut corrompre votre système ou en diminuer les performances.

Partager une partition SWAP entre plusieurs systèmes

Il est possible d'utiliser la même partition SWAP pour plusieurs distributions Linux installées en multi-boot sur le même PC. Cependant dans ce cas, il ne sera pas possible d'hiberner plusieurs systèmes simultanément (la dernière hibernation écrasera les données de la précédentes).

Vérifier les espaces d'échange activés et leur niveau utilisation

Plus d'un espace d'échange peuvent être affectés à votre système Ubuntu. De plus, chacun de ces espaces peut être utilisé de manière inégale. Pour connaître les espaces d'échange actuellement activés dans votre système Ubuntu et leur niveau d'utilisation, utilisez la commande swapon de la façon suivante :

swapon -s

Le terminal vous affiche le résultat de cette commande sous forme de tableau. Ce tableau retourne les informations suivantes :

  • Filename : le nom du fichier ou de la partition utilisée en tant qu'espace d'échange ;
  • Type : le type d'espace d'échange (un fichier [file] ou une partition de disque dur [partition]) ;
  • Size : la taille réservée à cet espace d'échange, en octets ;
  • Used : la quantité d'espace utilisée dans cet espace d'échange, en octets ;
  • Priority : la priorité d'utilisation de cet espace d'échange. Un espace ayant une plus haute priorité sera utilisé en premier.

Voici un exemple du retour de cette commande :

utilisateur@Nomdel'Ordinateur:~$ swapon -s
Filename				Type		Size	Used	Priority
/dev/sda3                               partition	5241852	0	-1
/file.swap                              file		524284	0	-2


Créer un fichier d'échange

Afin d'ajouter davantage d'espace d'échange utilisable par votre système Ubuntu, nous vous recommandons la création de fichiers d'échange.

Les fichiers d'échange ont quelques avantages par rapport aux partitions d'échange. D'abord, leur ajout ou suppression n'a pas d'impact sur la table des partitions du disque dur, ce qui limite les possibles pertes de données liées au repartitionnement d'un disque dur. De cette facilité, il est aisé d'attribuer à la volée plus ou moins d'espace d'échange selon les besoins, qu'ils soient temporaires ou non. Enfin, même s'ils sont stockés dans un système de fichiers, les fichiers d'échange sont exploités directement par le noyau Linux; l'utilisation d'un espace d'échange, sous forme de partition ou de fichier, devrait être identique quant aux performances.

Cependant, un fichier d'échange ne peut pas être utilisé dans le cadre d'une mise en veille prolongée (hibernation). Pour cette utilisation, il vous faudra attribuer l'espace d'échange sous forme de partitions.

Pour créer un fichier d'échange :

  1. Depuis un compte d'administrateur, ouvrez un terminal ;
  2. Utilisez fallocate pour réserver un bloc d'espace disque à attribuer à votre espace d'échange :
    sudo fallocate -l <taille du fichier en octets> <nom du fichier>
    • Le paramètre -l indique la taille (length) en octets qui doit être réservée pour l'espace d'échange. fallocate reconnaît aussi quelques suffixes, tels m et g, pour préciser des tailles en mibi-octets ou gibioctets. Par exemple, pour réserver 512 Mio, indiquez 512m ; pour réservez 1 Gio, indiquer 1g ;
    • Le nom du fichier doit contenir le chemin absolu vers l'emplacement de celui-ci. Sinon, il sera créé dans le répertoire courant ;
    • Exemple : pour créer un fichier de 512 Mio nommé file.swap et situé à la racine d'Ubuntu, on utilisera la commande suivante :
      sudo fallocate -l 512m /file.swap

      Consultez le manuel de fallocate (man fallocate) pour plus d'informations.

  3. Modifiez les permissions sur cet espace afin qu'il ne soit directement lisible que par le système. Utilisez la commande chmod :
    sudo chmod 600 <nom du fichier>
    • Encore une fois, <nom du fichier> représente le nom du fichier qui vient d'être créé, avec son chemin absolu si nécessaire ;
    • Par exemple, pour changer les permissions sur le fichier file.swap situé à la racine d'Ubuntu, on utilisera la commande suivante :
      sudo chmod 600 /file.swap
  4. Définissez ce fichier en tant qu'espace d'échange. Pour ce faire, utilisez la commande mkswap :
    sudo mkswap <nom du fichier>
    • Par exemple, pour définir un espace d'échange sur le fichier file.swap situé à la racine d'Ubuntu, on utilisera la commande suivante :
      sudo mkswap /file.swap
  5. Activez la prise en charge de ce nouvel espace d'échange. Utilisez la commande swapon :
    sudo swapon <nom du fichier>
    • Par exemple, pour activer la prise en charge de l'espace d'échange sur le fichier file.swap situé à la racine d'Ubuntu, on utilisera la commande suivante :
      sudo swapon /file.swap
  6. Rendez disponible le fichier d'échange à chaque démarrage en éditant le fichier /etc/fstab et lui ajoutant :
    #Entry for /swapfile :
    /file.swap none swap defaults 0 0


Modifier la ou les partitions d'échange

Modifier les partitions après l'installation est toujours une opération risquée. Assurez-vous d'avoir sauvegardé toutes vos données sur un autre support au préalable.
Si vous avez besoin d'augmenter la taille de votre swap après avoir installé le système, vous prendrez beaucoup moins de risque en créant un fichier de swap plutôt qu'en modifiant le partitionnement de vos disques. LVM est aussi une alternative très souple.
Vous pouvez aussi installer zRam pour augmenter virtuellement la taille de votre swap en compressant la ram non utilisée. (Ne marche pas si vous voulez augmenter la taille du Swap pour permettre l'hibernation)

Outils avec interface graphique

Vous pouvez utiliser les outils de partitionnement en mode graphique fournis avec Ubuntu : Gparted (Qtparted pour Kubuntu) pour créer/modifier/redimensionner vos partitions, à condition que celles-ci ne soient pas en cours d'utilisation par le système.

Si vous avez besoin de modifier une partition utilisée par le système en permanence, utilisez un live-cd.

Le live-cd utilise la partition swap du système (si elle existe). Pour pouvoir la modifier (ou modifier la partition étendue parente), il vous faudra désactiver le swap (dans gparted : Menu Partition > désactiver le swap).

Outils en ligne de commande

Il existe plusieurs outils en ligne de commande pour gérer vos partitions, les plus connus étant fdisk et cfdisk. Ces outils s'utilisent avec les mêmes précautions et restrictions que celles indiquées ci-dessus pour gparted.

Activer/Désactiver l'utilisation du swap

Les commandes swapon/swapoff permettent respectivement d'activer ou désactiver le swap sans redémarrage du système. Exemple :

sudo swapoff /dev/sda6

désactivera la partition d'échange présente sur /dev/sda6

sudo swapon /dev/sda6

activera la partition d'échange présente sur /dev/sda6

Si votre swap est utilisé alors qu'il y a encore de la place dans la RAM, il est possible de le vider avec les deux commandes ci-dessous :
sudo swapoff -a
sudo swapon -a

Définir une partition comme partition d'échange

La commande mkswap permet de définir une partition ou un fichier comme espace d'échange. Exemple pour définir la partition /dev/sda6 comme partition d'échange :

sudo mkswap /dev/sda6

Vous pouvez ensuite activer la partition d'échange avec :

sudo swapon /dev/sda6

Pour rendre cette modification permanente vous devrez également modifier votre fichier /etc/fstab pour y modifier ou ajouter une ligne du type :

# /dev/sda6
UUID=db245df9-851d-695b-a3f7-d40f039a6cc6 none            swap    sw      0      0

Et afin que vos mises en veille et hibernations se produisent correctement, vous devrez de même modifier le fichier /etc/initramfs-tools/conf.d/resume pour y renseigner le bon UUID :

RESUME=UUID=db245df9-851d-695b-a3f7-d40f039a6cc6

et ensuite, le faire prendre en compte par le système :

sudo update-initramfs -u -k $(uname -r)

Il vaut mieux, après cela, redémarrer la machine.

L'UUID de la partition a dû être affiché par la commande mkswap, sinon vous pouvez l'obtenir avec la commande
sudo blkid /dev/sda6
L'UUID de la partition peut-être réécrite en employant la commande mkswap:
sudo mkswap -U <l'UUID desirée> /dev/<votre partition>
La page anglophone https://help.ubuntu.com/community/SwapFaq#How_do_I_add_more_swap.3F donne une version légèrement différente de la procédure pour définir une partition comme partition d'échange. En particulier, elle conseille de vérifier aussi le fichier de paramètres de grub (/etc/default/grub) pour qu'il contienne la ligne :
GRUB_CMDLINE_LINUX="resume=UUID=<votre_uuid>"

Sur mon système (11.04 32 bits) j'ai dû modifier cette ligne (ainsi que /etc/initramfs-tools/conf.d/resume) et actualiser grub (comme indiqué dans la doc citée), avant de réactualiser initramfs, pour que l'hibernation fonctionne. Petit détail cependant : mon deuxième sudo update-initramfs n'avait pas comme option -k $(uname -r), mais d'après man update-initramfs je pense que cela ne devrait pas être la source de la différence de comportement.

Optimiser son espace d'échange (avancé)

Puisque l'espace d'échange se trouve dans le disque dur, ceci peut causer quelques problèmes de performances dans un système l'utilisant massivement, car le système peut essayer de lire et écrire à la fois des pages mémoire dans l'espace d'échange et des fichiers situés ailleurs dans le disque dur. Une manière de réduire cet effet de compétition d'accès aux ressources du disque dur consiste à fractionner l'espace d'échange sur plusieurs disques durs physiques. Ainsi, l'espace d'échange étant partagé entre plusieurs périphériques, la compétition pour l'accès aux ressources est réduite – voire éliminée.

Optimiser son espace d'échange (avancé mais très simple) avec ZRAM

zRAM permet de compresser la RAM si besoin, afin d'éviter/retarder le swap disque (car le swap disque est de nos jours très lent par rapport à la vitesse de traitement en RAM, même sur les anciennes machines avec peu de RAM le bénéfice est généralement visible)

Régler le déclenchement du swap

Personnellement, pour ma vieille tour (1,4Ghz pour 512 Mio de RAM), j'ai réglé le déclenchement de la swap à 5% de RAM libre. La copie de la RAM vers la swap consomme des ressources. Plus cette copie se déclenchera tard moins les ressources seront utilisées.

Réglage permanent dans Ubuntu 14.04 et 16.04 ( Systemd )

Régler le déclenchement du swap dès que la mémoire est utilisée a 95%.

  • Remplacer le 5 dans la ligne de commande vm.swappiness=5 par 10 pour déclencher l'utilisation du swap des 90% d'utilisation de la mémoire.
  • vm.vfs_cache_pressure=50 permet de garder plus de liens vers les fichiers en mémoire, pour accélérer l’accès aux fichiers.
echo vm.swappiness=5 | sudo tee /etc/sysctl.d/99-swappiness.conf
echo vm.vfs_cache_pressure=50 | sudo tee -a /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf

Réglage dans Ubuntu 12.04

Par défaut, Ubuntu est réglé de cette façon : À partir de 40% d'utilisation de la RAM (donc 60% de libre), le noyau peut copier une partie de la ram dans la swap.

On peut le vérifier grâce à la commande :

cat /proc/sys/vm/swappiness

qui (par défaut, donc) répond "60".

Pour changer ce réglage, utilisez la commande ci-dessous :

(Dans cet exemple, le réglage passe à 20% de RAM inutilisée)

sudo sysctl vm.swappiness=20

Ensuite désactivez puis réactivez la swap pour que les changements deviennent actifs :

sudo swapoff -av

La réponse ressemble à :

swapoff sur /dev/ramzswap0
swapoff sur /dev/sda6

Puis

sudo swapon -av

La réponse ressemble à :

swapon sur /dev/sda6

Réglage permanent dans Ubuntu 12.04

Pour que ces changements deviennent permanents (à chaque démarrage), vous devez éditer le fichier /etc/sysctl.conf et y ajouter la ligne suivante :

vm.swappiness=20

ou en une seule fois en utilisant la commande:

echo vm.swappiness=20 | sudo tee -a /etc/sysctl.conf
Valeur de swappiness conseillée :
  • 2 à 3 Gio de RAM = 5 à 10
  • PC avec SSD rapides = 15 à 20
  • Anciennes machines, disques lents = 2 à 5.
Un swappiness à zéro, quoique possible, est déconseillé car il peut geler la machine dans certaines conditions de surcharge, cf. cette discussion.
Les SSD disposant d'un nombre limité de cycles d'écriture, il est déconseillé d'y loger une partition swap ou un fichier d'échange (voir ici) .

Voir aussi


Contributeurs : foustala, laurentb, krop, huit_six, claudiux, SeTtHe, fnx, les contributeurs de la documentation d'Ubuntu


1)
La mémoire virtuelle est composée de la mémoire vive physique (RAM) et de l'espace d'échange.
2)
L'implémentation actuelle de l'hibernation dans Ubuntu (swsusp) ne peut pas utiliser un espace d'échange d'un fichier d'échange situé dans un système de fichiers actif.
  • swap.txt
  • Dernière modification: Le 28/04/2018, 11:17
  • (modification externe)