Swap (Français)
Cette page fournit une introduction à l'espace d'échange («swap») sur GNU/Linux. Elle couvre la création et l'activation des partitions swap et des fichiers swap.
Extrait de All about Linux swap space :
- Linux divise sa mémoire physique («RAM») en morceaux de mémoire appelés pages. «Swap»-er est le processus par lequel une page de mémoire est copiée dans l'espace préconfiguré sur le disque dur, appelé espace d'échange ou «swap», pour libérer cette page de mémoire. Les tailles combinées de la mémoire physique et de l'espace d'échange constituent la quantité de mémoire virtuelle disponible.
La prise en charge de l'espace d'échange est assurée par le noyau Linux et les utilitaires de l'espace utilisateur du paquet util-linux.
Espace de pagination
L'espace de pagination peut prendre la forme d'une partition de disque ou d'un fichier. Les utilisateurs peuvent créer un espace de pagination pendant l'installation ou à tout moment par la suite. L'espace d'échange peut être utilisé à deux fins, pour étendre la mémoire virtuelle au-delà de la mémoire physique installée (RAM), et aussi pour prendre en charge la suspension sur disque.
L'intérêt d'étendre la mémoire virtuelle avec le swap dépend de la quantité de mémoire physique installée. Si la quantité de mémoire physique est inférieure à la quantité de mémoire requise pour exécuter tous les programmes souhaités, alors il peut être bénéfique d'activer l'échange. Cela permet d'éviter le situations d'insuffisance de mémoire, où le mécanisme «OOM killer» du noyau Linux tentera automatiquement de libérer de la mémoire en tuant les processus. Pour augmenter la quantité de mémoire virtuelle à la quantité requise, ajoutez la différence nécessaire (ou plus) comme espace d'échange.
Le plus gros inconvénient de l'activation de l'espace d'échange est sa baisse de performance, consultez la section #Performance. Par conséquent, l'activation de l'espace de pagination est une question de préférence personnelle : certains préfèrent que les programmes soient tués plutôt que d'utiliser du «swap» et d'autres préfèrent utiliser la «swap» et un système plus lent lorsque la mémoire physique est épuisée.
Pour vérifier l'état du swap, utilisez :
$ swapon --show
Ou pour afficher la mémoire physique ainsi que l'utilisation de l'espace de pagination :
$ free -h
Partition de swap
Une partition de swap peut être créée avec la plupart des outils de partitionnement GNU/Linux. Les partitions de swap sont désignées comme étant de type 82
en MBR et 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
en GPT.
Pour configurer une partition comme «Linux swap», on utilise la commande mkswap(8). Par exemple :
# mkswap /dev/sdxy
Pour activer le périphérique pour la pagination :
# swapon /dev/sdxy
Pour activer cette partition swap au démarrage, ajoutez une entrée à /etc/fstab
:
UUID=device_UUID none swap defaults 0 0
où device_UUID
est l'UUID de l'espace d'échange.
Consultez fstab (Français) pour la syntaxe du fichier.
Activation par systemd
systemd active les partitions d'échange selon deux mécanismes différents. Tous deux sont des exécutables dans /usr/lib/systemd/system-generators
. Les générateurs sont exécutés au démarrage et créent des unités systemd natives pour les montages. Le premier, systemd-fstab-generator
, lit le fstab pour générer des unités, y compris une unité pour le swap. Le second, systemd-gpt-auto-generator
inspecte le disque racine pour générer des unités. Il fonctionne sur les disques GPT uniquement, et peut identifier les partitions d'échange par leur type GUID, consultez Systemd (Français)#Montage automatique d'une partition GPT pour plus d'informations.
Désactivation de la swap
Pour désactiver un espace d'échange spécifique :
# swapoff /dev/sdxy
Vous pouvez également utiliser le paramètre -a
pour désactiver tout l'espace d'échange.
Comme l'espace d'échange est géré par systemd, il sera réactivé au prochain démarrage du système. Pour désactiver définitivement l'activation automatique la swap détecté, exécutez systemctl --type swap
pour trouver l'unité .swap responsable et masquez-la.
Fichier d'échange
En tant qu'alternative à la création d'une partition entière, un fichier d'échange offre la possibilité de varier sa taille à la volée, et est plus facilement supprimé. Cela peut être particulièrement souhaitable si l'espace disque est limité (par exemple, un SSD de taille modeste).
Manuellement
Création de fichiers d'échange
Utilisez dd pour créer un fichier swap de la taille de votre choix. Par exemple, pour créer un fichier swap de 512 MiB :
# dd if=/dev/zero of=/swapfile bs=1M count=512 status=progress
Définissez les bonnes permissions (un fichier swap lisible par tous est une énorme vulnérabilité locale) :
# chmod 0600 /swapfile
Après avoir créé le fichier de taille correcte, formatez-le en swap :
# mkswap -U clear /swapfile
Activez le fichier d'échange :
# swapon /swapfile
Enfin, modifiez la configuration fstab pour ajouter une entrée pour le fichier d'échange :
/etc/fstab
/swapfile none swap defaults 0 0
Pour plus d'informations, consultez Fstab (Français)#Utilisation.
- Le fichier d'échange doit être spécifié par son emplacement sur le système de fichiers, et non par son UUID ou son LABEL.
- Lorsque vous utilisez Btrfs, n'oubliez pas d'ajouter également le sous-volume créé à la liste, et de supprimez les options
discard,autodefrag
du sous-volume monté en premier (qui contrôlera ces paramètres pour l'ensemble du FS). - La compression doit également être désactivée, mais l'attribut
No_COW
(précédemment défini avecchattr +C
) s'en charge.
Supprimer le fichier swap
Pour supprimer un fichier swap, il faut d'abord le désactiver, puis le supprimer :
# swapoff /swapfile # rm -f /swapfile
Enfin, supprimez l'entrée correspondante de /etc/fstab
.
Automatisé
systemd-swap
systemd-swap est un script permettant de créer un espace de pagination hybride à partir de ZRAM swap, de fichiers de pagination et de partitions de pagination. Il n'est pas affilié au projet systemd.
Installez le paquet systemd-swapAUR. Décommentez et définissez swapfc_enabled=1
dans la section Swap File Chunked de /etc/systemd/swap.conf
. Démarrez et activez le service systemd-swap
.
Visitez la page GitHub de l'auteur pour plus d'informations et pour mettre en place la configuration recommandée.
- Si le journal continue à afficher l'avertissement suivant
systemd-swap[...] : WARN : swapFC : ENOSPC
et qu'aucun fichier d'échange n'est créé, vous devez décommenter et définirswapfc_force_preallocated=1
dans/etc/systemd/swap.conf
. - Le fichier d'échange créé par systemd-swap ne peut pas être facilement utilisé pour l'hibernation. Consultez systemd-swap issue 85.
Chiffrement de la swap
Consultez Dm-crypt/Swap encryption.
Performance
Les opérations de swap sont généralement beaucoup plus lentes que l'accès direct aux données en RAM. Désactiver entièrement le swap pour améliorer les performances peut parfois conduire à une dégradation, car cela diminue la mémoire disponible pour les caches du système de fichier virtuel (VFS), entraînant des utilisations du disque plus fréquentes et plus coûteuses.
Les valeurs de swap peuvent être ajustées pour améliorer les performances :
Swappiness
Le paramètre sysctl swappiness représente la préférence (ou l'évitement) du noyau pour l'espace swap. Swappiness peut avoir une valeur entre 0 et 200 (max 100 si Linux < 5.8), la valeur par défaut est 60. Une valeur basse fait que le noyau évite le swapping, une valeur élevée fait que le noyau essaie d'utiliser l'espace de swap, et une valeur de 100 signifie que le coût d'E/S est supposé être égal. L'utilisation d'une valeur faible sur une mémoire suffisante est connue pour améliorer la réactivité sur de nombreux systèmes.
Pour vérifier la valeur actuelle de swapiness :
$ sysctl vm.swappiness
Alternativement, les fichiers /sys/fs/cgroup/memory/memory.swappiness
(spécifique aux cgroup v1) ou /proc/sys/vm/swappiness
peuvent être lus afin d'obtenir la valeur entière brute.
Pour définir temporairement la valeur de swappiness :
# sysctl -w vm.swappiness=10
Pour définir la valeur de permutation de manière permanente, créez un fichier de configuration sysctl.d(5). Par exemple :
/etc/sysctl.d/99-swappiness.conf
vm.swappiness=10
Pour que le chargeur d'amorçage définisse la «swappiness» lors du chargement du noyau, ajoutez un paramètre du noyau, par exemple sysctl.vm.swappiness=10
.
Pour tester et en savoir plus sur les raisons pour lesquelles cela peut fonctionner, jetez un œil à cet article.
Pression du cache VFS
Un autre paramètre sysctl qui affecte les performances de swap est vm.vfs_cache_pressure
, qui contrôle la tendance du noyau à récupérer la mémoire qui est utilisée pour la mise en cache des caches VFS, par rapport au pagecache et au swap. L'augmentation de cette valeur augmente la vitesse à laquelle les caches VFS sont récupérés [1]. Pour plus d'informations, consultez la documentation du noyau Linux.
Priorité
Si vous avez plus d'un fichier d'échange ou d'une partition d'échange, vous devriez envisager d'attribuer une valeur de priorité (0 à 32767) pour chaque zone d'échange. Le système utilisera les zones d'échange de priorité supérieure avant d'utiliser les zones d'échange de priorité inférieure. Par exemple, si vous avez un disque plus rapide (/dev/sda
) et un disque plus lent (/dev/sdb
), attribuez une priorité plus élevée à la zone d'échange située sur le périphérique le plus rapide. Les priorités peuvent être attribuées dans fstab via le paramètre pri
:
/dev/sda1 none swap defaults,pri=100 0 0 /dev/sdb2 none swap defaults,pri=10 0 0
Ou via le paramètre --priority
de swapon :
# swapon --priority 100 /dev/sda1
Si deux zones ou plus ont la même priorité, et qu'il s'agit de la plus haute priorité disponible, les pages sont allouées entre elles en alternance stricte.
Utilisation de zswap ou zram
Zswap est une fonctionnalité du noyau Linux qui fournit un cache en écriture compressé pour les pages échangées, ZRAM crée un bloc d'échange virtuel compressé en mémoire comme alternative à un fichier ou une partition d'échange sur le disque. Les deux approches augmentent les performances et diminue les opérations d'entrée/sortie sur disque.
Striping
Il n'est pas nécessaire d'utiliser RAID améliorer les performance du swap. Le noyau lui-même peut répartir le swap sur plusieurs périphériques, si vous leur donnez simplement la même priorité dans le fichier /etc/fstab
. Reportez-vous à The Software-RAID HOWTO pour plus de détails.