Rsync et swap

Bonjour à tous,

Voilà j’ai commencé à utiliser depuis peu rsync pour faire des backups de mon système, et jusqu’à présent ma Swap était désactivée donc je n’avais pas noté de problèmes.
Maintenant que j’ai activé la Swap, j’ai effectué une sauvegarde hier soir et là mon système est devenu tout à coup très lent : vous pensez bien, je me suis rendu compte que rsync se met à utiliser l’espace de Swap, alors que j’ai encore plus de 50% de RAM libre, et que j’ai passé l’option “swapiness=1” dans le fichier sysctl.conf.

J’aimerai donc savoir si ce comportement est normal, et s’il y a eventuellement moyen d’agir sur rsync pour l’empêcher d’utiliser la Swap.

C’est vm.swappiness. Vérifie que la valeur est bien prise en compte avec
sysctl vm.swappiness
ou
cat /proc/sys/vm/swappiness

Une application n’utilise pas de swap, c’est le noyau qui décide de swapper.
En cas de pression sur la mémoire, le noyau doit arbitrer entre swapper des pages allouées à des processus (de préférence inactives) ou supprimer des pages du cache disque (copie de fichiers lus ou écrits encore en mémoire).

Le paramètre vm.swappiness règle le curseur entre les deux. Il arrive qu’avec la valeur par défaut de 60 qui favorise plutôt le cache, lors d’opération mettant en oeuvre un gros volume de lecture ou d’écriture de fichiers (comme une sauvegarde avec rsync) le noyau choisisse de swapper exagérément pour faire grossir le cache. Une valeur de 1 devrait éviter au maximum de swapper, au détriment du cache.

1 J'aime

Oui oui c’est “vm.swapiness” mais je n’ai pas écrit l’expression entière, c’était simplement pour notifier que j’avais mis la valeur à 1. Mais bon malgré cette valeur quand je lance mon script de sauvegarde avec rsync (swap activée bien sûr) eh bien ça swappe (de l’ordre de qq Mo à plus de 600 voire 800Mo en fonction de la sauvegarde)… Même s’il me reste plus de 50% de RAM libre… Alors quand t’as un HDD qui tourne à 5400 RPM, le système devient rapidement inutilisable :smiley:

J’avais même baissé “vm.vfs_cache_pressure = 50”, il était à 100 par défaut.

pas de problème pour la prise en compte du swapiness et du cache_pressure.

Tu devrais plutôt l’augmenter si tu veux que la mémoire occupée par le cache de dentries (entrées de répertoire) et d’inodes soit plus facilement réclamée.

Note : Le cache de dentries et d’inodes grossit quand on parcourt l’arborescence, par exemple avec ls -R et est distinct du cache de page dont la taille figure dans la colonne “cache” de la sortie de la commandefree, qui grossit quand on accède au contenu des fichiers.

As-tu essayé avec vm.swappiness=0 ?

Alors dans ce cas là, lorsque j’execute mon script avec rsync, est ce que c’est le cache de dentries et inodes où bien l’autre qui grossit?
Je ne saisis pas parfaitement ces spécificités et pour être même plus clair je n’y comprends pas grand chose…

Je vais faire un essai avec swapiness à 0 pour voir.

Je viens d’essayer, malheureusement ça ne change rien.

Il y a quelque chose dans rsync qui se sert de la swap, rsync active la swap, où alors j’ai loupé un épisode…

J’ai essayé le test suivant :

  • j’ai desactivé d’abord la swap à l’aide de la commande “swapoff -a”
  • j’ai lancé mon script…

Eh bien au lancement du script la swap se réactive… Je ne copmprends pas.

Bonjour à vous,

Rsync ne serait-il pas entrain d’essayer d’utiliser le cache mémoire ? Ce qui, lorsque la mémoire est faible, peut engendrer l’utilisation du swap disque.

Car c’est bien ce qui se passe lors des transferts de gros volumes (je parle d’expérience avec les tranferts réseau. Jamais regardé de disque à disque) : il y a transfert vers le cache mémoire RAM puis ce volume de données transférées est ensuite routé vers l’interface réseau.

De quelle option dispose le noyau pour prioriser la RAM plutôt que le cache à part vm.swappiness ?
Fait-il la différence et est-il apte à mesurer l’impact de ses choix sur la performance du système ?

Sinon, autre piste, si tu mets un dièse devant ta partition swap dans /etc/fstab. Elle se réactive toujours ?

Haha :wink: ça j’ai déjà essayé, et redémarré, eh bien la swap est réactivée, donc apparemment pas besoin de ligne pour la swap dans fstab… Je ne savais pas.

Pour le reste de ton message j’en ai aucune idée.

C’est intéressant. Comment faites vous pour tester que la swap est réactivée, je suppose avec une commande du genre

fp2x@drhpcmsa:/tmp$ free -m
             total       used       free     shared    buffers     cached
Mem:         11877       2674       9202        163        170       1711
-/+ buffers/cache:        793      11084
Swap:         3814          0       3814

D’une manière plus générale, j’aimerais en savoir un peu plus sur votre problème. Pourrait-on avoir les retours de

lsblk
df -iT SRC DEST
df -hT SRC DEST

où SRC et DEST sont les répertoires impliqués dans la synchronisation. Et quelles sont les options de la commandes rsync ?

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة

F. Petitjean
Ingénieur civil du Génie Maritime.

« Celui qui, parti de rien, n’est arrivé nulle part n’a de merci à dire à personne !! »
Pierre Dac

Je peux faire comme ça où plus souvent je me sers du moniteur de ressources qui m’indique directement si la Swap est activée ou pas.
Néanmoins je remarque un comportement bizarre… La ligne concernant la Swap est commentée dans /etc/fstab, je redémarre par exemple mon PC, et au démarrage je me rends compte que la Swap est malgré tout active.
Par contre suite à ça, si j’ouvre un terminal et que j’execute la commande

swapoff -a

la Swap devient evidemment inactive, mais après il est impossible de la réactiver avec

swapon -a

Je me demande bien ce qui active la Swap au redémarrage malgré le fait que la ligne correspondant à sa dénomination dans fstab soit commentée?
M’enfin bon, cette nouvelle question n’est pas en relation avec le sujet initial.

Je ne peux pas vous donner les retours sur les repértoires SOURCE et DESTINATION, car ils n’existent pas en permanence, dans le sens où lorsque j’execute mon script ceux-ci sont crées temporairement dans /mnt puis les partitions sont montées dedans, rsync fait son travail, ensuite les partitions sont démontées et enfin les dossiers sont supprimés.
J’ai choisi cette méthode car j’utilise parfois /mnt comme point de montage, et il m’arrive d’y créer des dossiers (pour les points de montage) que j’oublie parfois de supprimer après coup… Comme ça je suis sûr avec le script tel quel qu’il n’y aura pas d’ambiguité pour les sauvegardes.

Néanmoins je vous donne le script, il provient à l’origine d’un script de Ricardo que j’ai modifié à ma guise :

root@blablabla:/home/gogi# cat /usr/local/bin/backup-sys
#!/bin/bash

# Backup LUKS Header Files
#cryptsetup luksHeaderBackup /dev/sda4 --header-backup-file /root/headback_gogi



. /usr/local/etc/backup-sys.conf
#LOG_FILE=/home/gogi/sortie.log
#ERR_FILE=/home/gogi/erreurs.log
#exec 1>$LOG_FILE
#exec 2>$ERR_FILE

if [ "$(id -u)" != "0" ]; then
	echo "[Warning] : you must be logged as root to run this script, aborting process..."
	exit 1
fi

echo -e "Starting filesystem backup process...
"
sleep 1

if [ ! -e $TARGET_DEVICE ]; then
	echo -e "Checking destination device : device $TARGET_DEVICE ---> no such destination device, aborting process..."
	exit 1
  else
	echo -e "Checking destination device : device $TARGET_DEVICE found, proceed forward... [\033[32;1mOK\033[0m]"
fi

echo "
Checking source and destination temporary directories :"			
sleep 1

if [ ! -d $MOUNT_TARGET ]; then									
  	echo -e "-- Temporary destination directory : $MOUNT_TARGET doesn't exist, creating temporary destination directory... [\033[32;1mOK\033[0m]"
  	mkdir /mnt/target

  else
	echo -e "-- Temporary destination directory : $MOUNT_TARGET already exists..."
fi

if [ ! -d $MOUNT_SOURCE ]; then
	echo -e "-- Temporary source directory : $MOUNT_SOURCE doesn't exist, creating temporary source directory... [\033[32;1mOK\033[0m]"
	mkdir /mnt/source

  else
	echo -e "-- Temporary source directory : $MOUNT_SOURCE already exists..."
fi

mount -t btrfs $TARGET_DEVICE $MOUNT_TARGET &&									# montage partition cible --> point de montage cible
mount -t btrfs $SOURCE_DEVICE $MOUNT_SOURCE									# montage partition source --> point de montage source
		
if (("$?" > 0)); then											# si erreur au montage, abandon
	echo -e "Mounting devices on respective paths : an error occured while trying to mount partitions, aborting process..."
	exit 1
	
  else
	echo -e "Mounting devices on respective paths... [\033[32;1mOK\033[0m]

\033[4mStarting backup process, this may take a while...\033[0m
"									
	    
	rsync --numeric-ids --devices --specials -A -X -H -W -a --info=progress2 ${EXCLUDE_LIST[@]/#/--exclude=} --delete $MOUNT_SOURCE/ $MOUNT_TARGET/
fi

umount $MOUNT_TARGET $MOUNT_SOURCE
rmdir $MOUNT_TARGET $MOUNT_SOURCE
echo -e "
Backup successfully done, see log files for further informations... [\033[32;1mExit\033[0m]"

exit 0

P.S : cette mise en forme de code me fait chier… Tout ce qui est en gras sont en fait des lignes commentées.

Avec systemd, on peut définir des “unités” pour l’activation d’un swap ou le montage d’un système de fichiers indépendamment du contenu de /etc/fstab.
D’autre part, parmi ses diverses diableries, par défaut systemd active automatiquement les partitions de swap situées sur un disque partitionné au format GPT. Est-ce le cas de cette machine ?

Normal puisque la ligne du swap dans fstab est commentée.

Par contre, que rsync active le swap me surprend énormément.

En gros on pourrait se passer de fstab aussi pour monter les autres partitions (et/ou sous-volumes btrfs) à l’aide d’unités dans systemd?
Par contre la 2e phrase explique tout : je suis en GPT et sous systemd, d’où l’activation auto au démarrage…

Ça on est d’accord, ce qui me surprenait c’était l’activation de la Swap au démarrage malgré tout mais maintenant c’est clair…

Ça je ne comprends pas non plus… Je jure de désactiver le Swap à l’aide de la commande

swapon -a

et en lançant le script hop, la Swap se réactive, et ce même si la ligne est commentée dans fstab… Peut-être un forçage de systemd?

Néanmoins, j’ai finalement surtout l’impression que le problème vient du fait qu’un grand nombre de données sont écrites dans le buffer/cache et que c’est ce qui déclenche la mise en Swap même si en apparence il me reste de la RAM libre : si je me trompe corriges moi?

Par exemple en ce moment avec trois onglets ouverts dans Firefox, Icedove, une fenêtre pour le moniteur de ressources et une fenêtre pour Gnome- terminal ça donne ceci :

gogi@blablabla:~$ free -h
              total        used        free      shared  buff/cache   available
Mem:           3,8G        1,6G        943M         28M        1,2G        1,9G
Swap:          6,0G          0B        6,0G

Peut-être un début de réponse ici :slight_smile:
http://lea-linux.org/documentations/Systemd

4 Go de RAM devraient suffire à ce que rsync ne se précipite pas sur la swap. J’ai un serveur dans ce cas sur une Deb8.5 et il ne se comporte pas ainsi. Quel que soit le sens du rsync : à partir du serveur ou à partir d’un client.

Euh, non. Pardon. Il parle juste du swap dans le court paragraphe sur les unités mais ce n’est pas assez consistant pour apporter une solution à cette montée automatique du swap.

Merci pour le lien, mais cette question est déjà réglée :wink:
Il suffit de voir le retour de :

root@debtrfs:/etc/systemd/system# systemctl list-units | grep swap
sys-devices-pci0000:00-0000:00:1f.2-ata1-host0-target0:0:0-0:0:0:0-block-sda-sda3.device          loaded active plugged   SAMSUNG_HM500JI swap
dev-sda3.swap                                                                                     loaded active active    Swap Partition
swap.target                                                                                       loaded active active    Swap

pour comprendre qu’il y a bien une unité qui active le Swap :slight_smile: (merci Jacquie et Michel… :slight_smile: )

1 J'aime

C’est ce que j’ai cru comprendre de mes lectures sur le fonctionnement de system. En fait systemd crée dynamiquement des unités natives pour prendre en compte les fichiers de configuration traditionnels comme fstab, ou les scripts d’init (plus pour longtemps).

Si tu veux, on peut désactiver ce comportement par différents moyens :

  • supprimer ou neutraliser le fichier systemd-gpt-auto-generator qui fait ça
  • modifier le GUID de type (pas l’UUID du swap) de la partition de swap en autre chose que le GUID de swap) avec gparted
  • activer le flag “no-auto” (63) de la partition de swap
  • ne pas mettre le swap directement dans une partition mais dans un autre type de conteneur comme un volume logique LVM, un ensemble RAID logiciel (type linear), un volume chiffré…

Plus d’info :
https://www.freedesktop.org/software/systemd/man/systemd-gpt-auto-generator.html
https://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/

Peut-être une autre de ses diableries, mais ça m’étonnerait quand même qu’il aille aussi loin.

Oui d’ailleurs les scripts d’init vont être totalement remplacés terme par des services systemd non? C’est ce que j’ai cru comprendre…

Ça c’est pas un problème, au pire si je veux me débarrasser de cette partition Swap je la formatte en n’importe quoi d’autre et le problème est réglé… :smiley:
Mais ce que je voudrai régler surtout, c’est cette histoire d’activation et utilisation de Swap. Parce que franchement ça m’embêterait bien de supprimer la partition Swap ou la désactiver d’une quelconque manière juste parce qu’UN programme fout le bazar…

Je n’en ai aucune idée, ça fait deux problèmes à résoudre maintenant :slight_smile: