SWAP, pas SWAP, telle est la question

Bonjour tous,

Comment vous dimmensionnez votre partition SWAP ? (je parle pour un serveur). Je lis/entend tout et son contraire :

  • 2,5 x la RAM
  • 2,5 fois la RAM, c’était avant quand la SWAP ne se comptait pas en Go
  • Pas de SWAP, la SWAP c’est caca boudin

Perso j’ai tendance à en mettre à égal volume de la RAM, mais je ne sais pas d’où je sors ça… Et surveille les entrées sorties, si j’ai trop d’entrée sortie c’est que qu’il faut que j’ajuste ma consommation de RAM ou que j’augmente celle-ci…

Merci pour vos lumières,
David

1 « J'aime »

Salut,

Comme toi je met autant que la RAM, je préfère prévoir au cas où. C’est pas quelques Go qui vont me manquer.

Quand on a beaucoup de RAM, ça n’apporte vraiment plus rien. Mes serveurs étant bien fournis, j’alloue très peu (genre 1 ou 2Go).

C’est très dépendant de ce qui va tourner sur ton serveur. Quand tu as 320G de RAM, tu ne t’amuses pas à faire un ratio x2.5 :sweat_smile:

Tu as l’option de faire un swapfile, ça t’évitera de dédier une partition pour ça.

Si tu pouvais nous décrire plus précisément ton matériel et son contexte d’utilisation, il serait plus aisé de te donner des recommandations.

Tu as raisons, une illustration c’est bien, 2 exemple typique :

  • Une machine (vm) pour une application web dédier « apache/php/mysql » ~100 visiteurs / jours (sur dimensionné) à 4Go de RAM :

    root@xxxx:~# free -h
    total used free shared buff/cache available
    Mem: 4.0Gi 389Mi 2.8Gi 72Mi 790Mi 3.6Gi
    Swap: 4.0Gi 0.0Ki 4.0Gi

  • Une machine qui fait du mail (postfox/dovecot avec ispconfig - donc aussi avec un mysql) à raison de ~100 boîte mail, actuellement 4Go de RAM utilisé à ~60% :

    root@srvmail:~# free -h
    total used free shared buff/cache available
    Mem: 4,0G 2,1G 530M 432M 1,4G 1,9G
    Swap: 4,0G 604M 3,4G

Ma question était général, pas pour un cas dédier mais c’est intéressant !
Merci pour vos retours !

L’idéal, c’est que la machine ne swappe jamais. En effet, qui dit swap, dit ralentissements infernaux.
De nos jours, nous sommes en capacité d’allouer suffisamment de RAM aux machines (pm ou vm) pour qu’elles ne swappent pas du tout. Carrément, si une machine swappe, c’est qu’elle est mal dimensionnée.
Du coup, la swap est encore intéressante pour la gestion des incidents (processus qui part en vrille ou mauvais dimensionnement). En évitant un OOM KILL, ça permet une continuité de service et limite les risques d’incohérence de données.
Pour toutes ces raisons, je préconise 1 Go de swap seulement. Plus serait du gâchis…

À noter qu’il est possible de demander au système de ne swapper que s’il ne peut vraiment pas faire autrement, via la variable vm.swappiness=1. Très efficace. Mais attention, systemd a un petit problème et impose pour l’instant de propager cette valeur au cgroup 1 via des find après le boot…

Le professeur Jean-Marie Rifflet te dirait qu’algorithmiquement, c’est plus simple à coder/gérer. C’est l’astuce qu’il donnait pour le projet de gestionnaire de swap en licence à Paris 7, il y a longtemps :hugs:

2 « J'aime »

Je n’utilise pas de swap du tout parce que je préfère que OOM killer se déclenche plutot qu’utiliser le swap. De mon expérience le swap n’assure pas de continuité de service parce qu’il ralentit trop les services (ce n’est pas 100% vrai mais c’est vrai suffisament souvent pour que j’en arrive à cette conclusion). Et le problème d’un ralentissement soudain pour cause de swap c’est que d’une part c’est invisible (zero indice que quelque chose swap ou que ce soit) et que les effets de bord sont aussi divers que subtils. A contrario lorsque OOM killer se déclenche il y a un message très facile a detecter dans syslog, même après reboot de la machine: on sait donc immédiatement a quoi on a affaire.

Mes 2cts

1 « J'aime »

Pour ma part vm.swappiness=1 et un swap minimum 4GB au max sur des VMs qui ont en moyenne 16GB de RAM.

Je dirais 1Go max pour tes VMs de 4Go.

Hmmm, ça se monitore le taux de remplissage du swap, du coup la mise en place d’alertes est possible et lutte contre l’invisibilité éventuelle :smiley:
Clair qu’avec le choix du OOM Kill, il y a un truc en moins à gérer, ça se défend bien, et aussi une attention plus grande à bien paramétrer la mémoire :innocent:

2 « J'aime »

OOM killer c’est un peu la roulette russe… il ne tape pas toujours là où il faudrait !

2 « J'aime »

C’est un tueur psychotique et son choix de victimes me laisse souvent pantois :astonished:

2 « J'aime »

Malheureusement, on ne fait pas tous tourner nos CHATONS sur des machines dédiées :confused:

Dans notre cas nous avons un VPS de 4Go de RAM pour une dizaine de services, dans d’autres cas il pourrait s’agir d’une petite raspberry Pi…

L’état de notre prod en usage normal :

image

Lorsque le serveur est plus sollicité, il peut arriver que la swap se remplisse de moitié. Malgré cela, peu de ralentissements sont à constater à ma connaissance (le cache SSD installé par notre hébergeur doit probablement contribuer à cela… Oui, bon, c’est pas bien de faire de la swap avec un SSD, mais on fait ce qu’on peut !)

Chaque service est limité dans sa consommation de RAM, l’OOM-killer passe sur le service si cette limite est atteinte.

Faire tourner le serveur sans swap me semble assez dangereux compte tenu de notre installation.

Ajouter de la swap ne me semble pas nécessaire, je doute que le serveur pourra maintenir de bonnes performances si on plus d’un Go entier de swap utilisée… et de toute façon, ça ne devrait théoriquement pas arriver avec la limite de RAM sur chaque service.

Sans compter que nous avons seulement 40 Go d’espace disque total, allouer 1Go supplémentaire nous retire une part conséquente de notre espace disponible :sweat_smile:

Mais oui, si vous avez le luxe d’avoir plus de 16 Go de RAM sur votre machine, oubliez la swap :grin:

(Vivement qu’on installe notre nouveau serveur…)

~Neil

Bien d’accord avec l’ensemble des arguments pour l’utilisation d’une swap. Pour la taille, l’argument du « 2 fois la ram » ou « 2.5 la ram » vaut surtout pour pouvoir faire de la mise en veille et de l’hibernation (veille prolongée) donc ça ne s’applique pas vraiment aux serveurs.
Sur l’infra Liberta (64 Go de RAM), l’hyperviseur et chaucune des VM disposent tous d’une petite swap et il n’est pas rare d’en voir une petite partie qui a déjà été allouée.

On a en effet pas de grande prise sur le comportement des programmes et softs qu’on fait tourner, à moins d’avoir tout développé en interne, donc tel ou tel script ou appli peut très bien s’affoler sous certaines conditions, on peut avoir un pic de visites, une attaque, etc. Non, la SWAP c’est bien, mangez-en.

2 « J'aime »

Attention, pour l’impact sur les perfs, ce n’est pas la quantité de swap utilisé qui joue, mais la quantité de swap in/swap out à un moment donné, c’est-à-dire ce qui nécessite des I/O disque.

Avant de swapper sur disque, il y a la possibilité compresser certaines pages de données en RAM avec zram.

https://www.linuxtricks.fr/wiki/zram-compresser-la-ram-au-lieu-de-swapper-sur-linux

J’ai déjà utilisé ça sur des machines desktop avec très peu de RAM (genre eePC), mais jamais sur un serveur.

2 « J'aime »