Question compression des vidéos et fichiers média en général

What app is this about, and its version: Borg 1.4.3~ynh1
What YunoHost version are you running: 12.1.39 (stable)
What type of hardware are you using: Raspberry Pi 3, 4+

Describe your issue

Bonjour,

Ceci n’est pas une issue, mais une question.

Je m’apprête à adopter Borg pour mes backups.

Mes données sont principalement composées de vidéos (en volume) et je vois que dans les script backup_method, le borg create n’utilise pas le tag --compression auto, lz4 (lz4 est le type de compression par défaut, mais d’autres sont possibles).

Le tag auto dans --compression semble très important pour les fichiers incompressibles car sans cela, Borg perd énormément de temps à compresser des fichiers incompressibles (exemple : discuss: remove “auto” compression mode in borg2?).

Si je ne fais pas de mauvaise interprétation, il semble intéressant de modifier le borg create (ou bien d’ouvrir le choix dans l’admin, mais c’est pas mal de boulot).

Merci.

Share relevant logs or error messages

.

1 Like

Salut CatsLover71,

Bonne question ! Par contre, je pense qu’il y a une petite confusion sur le rôle du mode auto (enfin si moi-même, j’ai bien compris :slight_smile: ).

Le script borg_ynh n’utilise effectivement aucun flag --compression (source : backup_method), ce qui fait que Borg utilise lz4 par défaut (doc Borg).

Or le mode auto a été conçu pour protéger contre les “compresseurs coûteux” (lzma, zlib…) sur des données incompressibles. Comme l’explique le mainteneur de Borg dans l’issue #7054 que tu cites :

The “auto” compression mode was added to avoid that bad compressors cause a lot of cpu load when trying to compress incompressible data, like: borg create --compression auto,lzma,6

Concrètement auto fonctionne ainsi :

  1. Il teste d’abord avec lz4 si le chunk est compressible (< 97% de la taille originale)
  2. Si oui → il applique le compresseur coûteux spécifié
  3. Si non → il stocke en lz4 ou sans compression

Du coup --compression auto,lz4 ne changerait rien : ça reviendrait à tester la compressibilité avec lz4… pour ensuite compresser avec lz4. C’est redondant.

Et comme lz4 est déjà ultra-rapide, l’overhead sur tes vidéos (incompressibles) reste négligeable, même sur un Raspberry Pi.

Si tu veux vraiment optimiser pour ton cas d’usage (beaucoup de vidéos sur RPi), deux pistes :

  • --compression none → supprime tout overhead de compression (gain marginal vs lz4 mais ça peut compter sur un RPi)
  • --compression auto,zstd,3 → bonne compression sur les fichiers compressibles (configs, BDD…) tout en évitant l’overhead sur les vidéos

Bref, le mieux reste encore de faire des tests ! (j’ai hâte de voir)

3 Likes

Il me semble que Zstandard a aussi des heuristiques pour abandonner la compression si le fichier est détecté comme non compressible.

1 Like

Bonne remarque ! J’ai creusé un peu le sujet et c’est effectivement vrai, mais avec une nuance importante.

Depuis zstd 1.5.1, les match finders de zstd augmentent leur pas de recherche tous les 256 octets traités sans trouver de correspondance (PR #3552). Concrètement, sur des données incompressibles, l’algorithme accélère progressivement et passe dessus beaucoup plus vite.

Mais c’est une optimisation de vitesse interne à l’algorithme : zstd tentera quand même la compression sur chaque chunk. Le mode auto de Borg, lui, agit en amont : il teste d’abord avec lz4 si le chunk est compressible (< 97 % de la taille originale), et sinon, il saute complètement le compresseur coûteux.

Du coup les deux mécanismes sont “complémentaires” :

  • auto → filtre les chunks incompressibles avant même d’appeler zstd
  • zstd → accélère en interne si malgré tout, il tombe sur des données incompressibles

Sur un Raspberry Pi avec beaucoup de vidéos, --compression auto,zstd,3 cumulerait donc les deux protections.

Il faudrait vraiment voir des tests :wink:

Ben, je veux bien essayer de tester ça, mais je n’ai que mon serveur de “prod” capable de recevoir les (un peu moins de) 300Go de vidéos plus tout le reste.

Alors des tests sur la prod, pourquoi pas, mais ça me fait un peu transpirer.

Je peux toutefois installer Borg sur cette machine, faire des tests et désinstaller (ou désactiver) en attendant d’être prêt complètement avec mon co-admin en site distant.

L’idée des tests serait de faire un backup initial de tout avec option de base (par défaut).
Désinstaller tout.
Refaire un test complet le lendemain avec --compression auto,zstd,3 (Question bête, il n’y a pas d’espace entre auto, zstd et 3 ?)

Si je désinstalle avec -–purge, il ne restera plus rien de Borg sur le serveur ?

Salut CatsLover71,

Pour répondre à tes questions pratiques :

Syntaxe : Oui, c’est bien --compression auto,zstd,3 tout attaché avec des virgules, sans espaces (borg create — Borg - Deduplicating Archiver 1.4.3 documentation).

Concernant la désinstallation : Attention, yunohost app remove borg --purge ne supprimera pas ton dépôt Borg (ni local, ni distant). J’ai vérifié le borg_ynh/scripts/remove at master · YunoHost-Apps/borg_ynh · GitHub : il ne gère pas YNH_APP_PURGE et se contente de supprimer les configs système (timer systemd, sudoers, hooks de backup, logrotate). Tes données de backup resteront intactes. C’est probablement un choix de sécurité du package.

Par contre, le répertoire d’installation de l’app et ses clés SSH seront bien supprimés à la désinstallation. Donc si tu désinstalles puis réinstalles, il faudra reconfigurer l’accès au dépôt distant.

Pour tes tests, puisque tu n’as que ta prod, une approche prudente :

  1. Installe Borg normalement (config par défaut = lz4)
  2. Lance un premier backup complet → note le temps et la taille du dépôt
  3. Pour le second test avec --compression auto,zstd,3, il faudrait modifier le fichier /etc/yunohost/hooks.d/backup_method/05-borg_app (c’est le hook généré depuis conf/backup_method) pour ajouter le flag --compression auto,zstd,3 à la ligne borg create. Attention, ce fichier sera écrasé à chaque mise à jour de l’app.
  4. Supprime le dépôt manuellement, puis relance un backup complet → compare

Ça évite le cycle install/désinstall et c’est moins risqué pour ta prod.

Ceci dit, tester en prod n’est jamais idéal, mais ici le risque est limité : le backup Borg est une opération en lecture seule sur tes données, le pire qui puisse arriver c’est un backup raté ou un peu de charge CPU/IO sur ton RPi.

Merci de la recherche.
J’en comprends que si l’on cherche une compression rapide mais significative, mais pas trop coûteuse en ressources CPU, auto+zstd est un très bon combo.

1 Like

Pour gagner du temps, peut-être que réduire le nombre de vidéos sauvegardées est pertinent.
Si par exemple il y a 20Go de données “autres” + 20Go de vidéo (quasi-incompressibles) dans le test, ça me semble déjà très raisonnable pour un résultat significatif, sans traiter et copier 280Go de plus :slight_smile:

1 Like

Oui, je vais construire un environnement dans un CT PVE dont je dispose. Comme cela, j’aurai des données de test cohérentes et je ne risquerai pas de flinguer quoi que ce soit.
Vais faire un peu un mix backup apps Yunohost + Borg et backup Borg to court.
Pour les vidéos, j’essaierai de faire un dossier avec quelques grosses vidéos et un dossier avec plein de petites.

Par contre, il faut vraiment que je m’occupe d’un dossier administratif qui n’a que trop traîné parce que je trouve toujours plus intéressant à faire et en l’occurrence, ce test Borg est très intéressant. Je m’y colle dès que j’aurai mis ce tracas derrière moi.

1 Like

Bon, j’ai préparé mon environnement et un jeu de données? Je vais m’atteler à l’aspect exécution, mais si vous avez des remarques ou souhaits d’autres types de données, allez-y.

Benchmark de Borg backup sur Yunohost

Environnement matériel et logiciel

  • HP Proliant Microserver Gen 8

  • Intel(R) Xeon(R) CPU E3-1265L V2 @ 2.50GHz-3.50GHz (4C/8T)

  • 16Go RAM DDR3 1600 ECC

  • Proxmox VE 8.4.16

Tests réalisés dans un container PVE :

  • CT Debian 12 / Yunohost 12.1.39

  • 4T / 8 Go affectés au CT

  • Volume données sur pool ZFS SSD Sata3

  • Volume accueillant sauvegardes Pool ZFS HDD Sata 3

Jeu de données

Pour utiliser le processus de backup Yunohost hooké Borg, toutes les données ont été placées dans un Yunohost dans le container.

  1. Une sélection de vidéos ont été placées dans 2 applications webapp ;

    • webapp contient 20.1 GB de 1528 petites vidéos de moins de 60Mo (en fait des fragments de vidéos Peertube)
    • webapp__2 contient 20.4 GB de 7 vidéos de taille comprise entre 1.8GB et 7.2 GB
  2. Une application Funkwhale de 13 Go principalement constitué de fichiers mp3.

  3. Une application Calibre Web de 15 Go contenant principalement des ePub et PDF.

  4. Une application Mobilizon qui traînait par là pour un autre test de 2.9Go

  5. Un Peertube runner qui est exploité ici mais dont le service sera arrêté pour la durée des tests afin d’éviter qu’une vidéo 4k de 1h30 vienne exploser les tests.

Je compte utiliser time (version GNU) pour lancer les commandes. Je vais tâcher de time la partie yunohost backup create et modifier le hook pour time le borf create. Un Borg info à la fin de chaque itération.
Je procéderai application par application. d’abord avec les réglages de compression par défaut, puis je détruirai le repo et modifierai le borg create pour adopter la compression --compression auto,zstd,3

Voilà, vous tiens au courant et dites moi si vous voyez des trucs à changer.

2 Likes

Euh, le borg create ne suit pas les liens symboliques ?

Parce que n’ayant pas d’espace alloué sur le montage / de mon CT, j’ai mis les fichiers mp4 dans un répertoire /home/yunohost.app/my_webapp et créé un lien symbolique dans /var/www/my_webapp/ vers ce répertoire.
La sauvegarde a duré un quart de seconde et le contenu de la sauvegarde pour /var/ww/my_webapp est le lien symbolique, et pas les vidéos.

Je vais faire un essai en bind mount pour tester

1 Like

Salut,
Va falloir attendre encore un peu. Ce matin, mon PVE s’est dit “tient, il y a longtemps que je ne l’ai pas emmerdé celui-là”. Voilà, c’est fait. Et je dois dire que là, pour l’instant il est parti pour gagner la partie.
Je n’aime pas trop PVE (mais j’avoue mal maîtriser et ne pas avoir eu le goût de le faire).
Je n’aime pas trop tous ces systèmes qui mettent une surcouche de complexité sur des choses simples.
J’aime beaucoup Yunohost.
J’aime beaucoup les systèmes qui mettent une surcouche de simplicité sur des choses complexes.

1 Like

Salut,
ça y est, j’ai mené le test et je vous fait un spoiler alert…..Il n’y a pas de différence significative.

J’ai tout placé dans un repo github, parce qu’ici ce serait un peu lourdingue.

Yunohost-Borg Backup Compare compression

Un petit condensé tout de même :
Small videos :

                       Original size      Compressed size    Deduplicated size
This archive: lz4           21.65 GB             21.48 GB             21.46 GB
This archive: auto,zstd3    21.65 GB             21.45 GB             21.44 GB
This archive: zstd3         21.65 GB             21.34 GB             21.31 GB
This archive: none          21.65 GB             21.65 GB             21.63 GB

lz4 :        4 minutes 24.14 seconds    CPU : 88%
auto,zstd3 : 4 minutes 35.40 seconds    CPU : 87%
zstd3 :      5 minutes 28.90 seconds    CPU : 89%
none :       4 minutes 9.78 seconds     CPU : 88%

Big videos :

                       Original size      Compressed size    Deduplicated size
This archive lz4            21.92 GB             21.92 GB             21.92 GB
This archive auto,zstd3     21.92 GB             21.92 GB             21.92 GB
This archive zstd3          21.92 GB             21.91 GB             21.91 GB
This archive none           21.92 GB             21.92 GB             21.92 GB

lz4 :        4 minutes 21.99 seconds     CPU : 93%
auto,zstd3 : 4 minutes 14.54 seconds     CPU : 91%
zstd3 :      4 minutes 21.24 seconds     CPU : 92%
none :       4 minutes 7.41 seconds      CPU : 92%

Calibre web :

                       Original size      Compressed size    Deduplicated size
This archive lz4            15.97 GB             14.91 GB             14.42 GB
This archive auto,zstd3     15.97 GB             14.64 GB             14.15 GB
This archive zstd3          15.97 GB             14.52 GB             14.03 GB
This archive none           15.97 GB             15.97 GB             15.46 GB

lz4 :        3 minutes 42.47 seconds     CPU : 77%
auto,zstd3 : 3 minutes 39.72 seconds     CPU : 90%
zstd3 :      3 minutes 47.07 seconds     CPU : 89%
none :       3 minutes 9.36 seconds      CPU : 88%

Mobilizon

                       Original size      Compressed size    Deduplicated size
This archive lz4             2.92 GB              2.68 GB              2.67 GB
This archive auto,zstd3      2.92 GB              2.61 GB              2.61 GB
This archive zstd3           2.92 GB              2.61 GB              2.61 GB
This archive none            2.92 GB              2.92 GB              2.91 GB

lz4 :        53.72 seconds               CPU : 62%
auto,zstd3 : 59.46 seconds               CPU : 67%
zstd3 :      1 minutes 2.41 seconds      CPU : 64%
none :       54.98 seconds               CPU : 63%

Funkwhale

                       Original size      Compressed size    Deduplicated size
This archive lz4            13.27 GB             12.41 GB             12.16 GB
This archive auto,zstd3     13.27 GB             12.30 GB             12.06 GB
This archive zstd3          13.26 GB             12.28 GB             12.03 GB
This archive none           13.26 GB             13.26 GB             12.98 GB

lz4 :        2 minutes 50.16 seconds     CPU : 84%
auto,zstd3 : 3 minutes 12.62 seconds     CPU : 84%
zstd3 :      3 minutes 30.01 seconds     CPU : 84%
none :       2 minutes 48.06 seconds     CPU : 83%

Taille finale des repos

                       Original size      Compressed size    Deduplicated size
All archives lz4            75.74 GB             73.40 GB             72.64 GB 
All archives auto,zstd3     75.74 GB             72.93 GB             72.19 GB
All archives zstd3          75.72 GB             72.66 GB             71.89 GB
All archives none           75.72 GB             75.72 GB             74.93 GB
3 Likes

La conclusion est donc :

Si on utilise une autre compression que la compression par défaut alors il faut utiliser le flag auto en raison de ce test : discuss: remove “auto” compression mode in borg2

Si on utilise la compression par défaut (lz4) alors il est inutile d’utiliser auto,lz4.

2 Likes

Alors déjà, merci beaucoup @CatsLover71 d’avoir effectué tous ces tests et de mettre à disposition toutes les données sur un dépôt. :heart_suit:

J’ai pu m’amuser à récupérer les données et à faire quelques graphiques… :zany_face:

1. Comparaison des tailles : originale vs compressée

Les fichiers vidéo (BIG-VIDEOS et SMALL-VIDEOS) ne se compressent quasiment pas, quelle que soit la méthode utilisée. C’est attendu : les formats vidéo (MP4, MKV, etc.) utilisent déjà une compression interne très efficace, et aucun algorithme général ne peut les réduire davantage.

À l’inverse, CALIBREWEB et MOBILIZON montrent un gain visible. La méthode auto,zstd,3 compresse systématiquement un peu mieux que lz4, mais l’écart reste modeste.

EDIT : CALIBREWEB, FUNKWHALE et MOBILIZON montrent un gain visible. zstd,3 compresse autant, voire légèrement mieux que auto,zstd,3, qui reste devant lz4. none sert de référence et confirme l’absence de réduction pour les données déjà compressées.

2. Taux de compression

Ce graphique met en évidence le pourcentage de réduction par rapport à la taille originale.


3. Durée de sauvegarde

4. Efficacité : gain de compression vs temps

Ce graphique croise les deux dimensions principales : combien d’espace est économisé et combien de temps cela coûte. Le positionnement idéal est en haut à gauche (beaucoup de gain, peu de temps).

CALIBREWEB se distingue comme le jeu de données où la compression apporte le plus de valeur : un gain supérieur à 1 GB pour un temps raisonnable. FUNKWHALE suit, avec un gain proche de 1 GB.

Les fichiers vidéo (gros points en bas à droite) sont les pires : ils consomment le plus de temps tout en ne bénéficiant d’aucun gain de compression. C’est le cas d’usage typique où la compression est contre-productive.

EDIT : Les fichiers vidéo restent groupés en bas du graphique (gain quasi nul). Les points none (gris) montrent qu’en désactivant la compression, la durée diminue sans perte, confirmant que la compression est inutile pour ces données.


5. Utilisation des ressources système


6. Synthèse comparative

Conclusion

Encore merci d’avoir mis à disposition ce jeu de données ! Même si je ne suis pas certain que les graphiques servent à grand-chose, au moins, ça m’a fait passer une bonne soirée. Chacun ses vices :smiling_face_with_horns: ne me jugez pas. :rofl:

PS les graphiques ont été réalisés à l’aide du langage R via RStudio.

3 Likes

Merci pour les graphiques, ça présente beaucoup mieux.

Tu es un.e champion.ne des graphiques, dis donc.

1 Like

Merci beaucoup pour ces tests, résultats et analyses :slight_smile:

Et le gain de la compression est lui aussi très limité.
Pour Funkwhale comme Calibre, je parierais que c’est un “forfait” sur la partie logicielle, et que les données en elles-même (le volume qui varie d’une instance à l’autre) ne sont que peu impactées.

Conclusion personnelle : la différence de temps semble proche d’être négligeable, sauf en cas de forte contrainte en ressources systèmes (processeur peu performant, concurrence d’usages sur le serveur, chauffe, énergie…).

1 Like

Il faudrait également avoir une métrique sur la durée de sauvegarde sans compression pour trancher: peut-être est-ce long uniquement parce que ce sont de gros fichiers à copier (= temps limité par le support de stockage).
Si le surcoût en temps est marginal, peut-être que ce gain de compression marginal (ou de simplicité à ne pas devoir trier → c’est aussi du temps) n’est pas problématique.

1 Like

Si j’étais joueur, façon Yakafokon, je dirais qu’il serait intéressant d’avoir également un test avec zstd mais sans l’option auto (notamment en vidéo vs n’importe quel autre), pour voir s’il y a un coût important en temps “perdu” à peu compresser les données.
Facile à dire bien entendu :wink:

J’ai conservé le jeu de données au cas où.
Je dois pouvoir faire un run avec `–compression none`.
Je vois ça.

Peut-être aussi un run avec un gros algo de compression. Juste pour le fun. Si vous avez un algo à proposer, dites-le.