J’ai fait quelques recherches pour essayer de comprendre comment le swap était utilisé pour l’hibernation. Il se peut néanmoins que la documentation du noyau et de uswsusp ne soit pas à jour.
Le principe consisterait à “geler” le système et à prendre un “instantané” (snapshot) du contenu de la mémoire à restaurer de façon atomique. Comme cet instantané sera initialement stocké en mémoire, sa taille ne peut excéder la moitié de la taille de la mémoire, de meme que la taille nécessaire dans le swap.
[There should be just one resume partition, for now. You’ll need at most 1/2
of your RAM of free space on it, but in some cases it may be smaller, too.
The s2disk tool may be configured to create quite small snapshot images but
then some contents of the RAM will have to be swapped out before suspend.
Il est possible de spécifier la taille maximum souhaitée de l’instantané. Cette valeur serait à 500 Mo par défaut, mais c’est à confirmer.
If you want to limit the suspend image size to N bytes, do
echo N > /sys/power/image_size
before suspend (it is limited to 500 MB by default).
Le système est ensuite “dégelé” et l’image est écrite dans le swap spécifié (qui peut a priori être distinct du swap actif). Au passage elle peut être compressée et/ou chiffrée.
A la reprise après hibernation, l’image est lue depuis le swap spécifié et restaurée dans la mémoire de façon atomique puis supprimée du swap, et le système va se retrouver dans l’état dans lequel il était lors de la création de l’image.
D’après le premier extrait, je comprends que si le volume des données en mémoire excède la taille maximum souhaitée de l’image, alors une partie de la mémoire va d’abord être swappée selon les mécanismes de swap classiques et ne fera pas partie de l’image d’hibernation, donc sans sa compression. Après la reprise, il est logique de penser que ces données restent dans le swap tant qu’elles ne sont pas demandées.
J’en déduis que le comportement que tu constates peut être causé par une taille d’image trop petite qui forcerait une mise en swap importante à l’hibernation même avec swappiness=0. Pour le vérifier, il faudrait regarder l’occupation du swap avant et après la première hibernation. Elle devrait être nulle avant et non négligeable après.
Si je ne me trompe pas, j’ai donc deux solutions possibles à proposer :
-
compresser le swap normal en activant zswap comme déjà proposé, ainsi les données non incluses dans l’image d’hibernation bénéficient aussi de la compression et prennent moins de place dans le swap.
-
augmenter la taille maximum souhaitée de l’image d’hibernation, dans la limite de la moitié de la RAM, afin de diminuer la taille de ce qui devra être swappé de façon classique. Pour s2disk de uswsusp, cela se configure en ligne de commande avec l’option --image_size
ou dans le fichier /etc/uswsusp.conf avec le paramètre image size
. Par contre cela augmentera probablement le temps de reprise après hibernation.