Projet

Général

Profil

Development #65485

Table snapshot très volumineuse (-> partitionner la table)

Ajouté par Pierre Ducroquet il y a presque 2 ans. Mis à jour il y a presque 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
20 mai 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Sur test.saas.entrouvert.org, j'observe que la base wcs_demarches_orleans_test_entrouvert_org est de loin la plus volumineuse (39GB). Or, tout l'espace est pris par la table snapshot et sa colonne "patch".

Est-ce-que ce comportement est connu et voulu, ou s'agit-il d'un bug ? Si c'est voulu, alors je ferai le patch nécessaire pour que la table soit partitionnée par timestamp afin qu'elle cesse d'être un seul bloc massif qui casse les différents outils capable de traiter des tables en parallèle (dump, backup, restore, vacuumdb...)


Fichiers

log-wcs-wf-178.txt (187 ko) log-wcs-wf-178.txt Pierre Ducroquet, 20 mai 2022 09:46
0001-sql-add-indexes-on-snapshots-table-65485.patch (2,06 ko) 0001-sql-add-indexes-on-snapshots-table-65485.patch Pierre Ducroquet, 23 mai 2022 16:35

Demandes liées

Lié à w.c.s. - Development #65497: moins attendre pour préférer un snapshot complet à un patchFermé20 mai 2022

Actions

Révisions associées

Révision 44bc83f0 (diff)
Ajouté par Pierre Ducroquet il y a presque 2 ans

sql: add indexes on snapshots table (#65485)

Historique

#1

Mis à jour par Frédéric Péters il y a presque 2 ans

Est-ce-que ce comportement est connu et voulu, ou s'agit-il d'un bug ?

Il faut regarder dans la table si quelque chose aurait l'air anormal.

Pour donner un contexte :

  • dans les workflows il peut y avoir des modèles de documents, qui peuvent être assez lourds,
  • historiquement il y avait une règle basique type "si ça fait plus d'1Mo, on n'enregistre pas de snapshot",
  • on a fait évoluer pour permettre de plutôt stocker la différence entre deux versions successives, dans l'idée qu'ainsi une modification sur un statut A peut se faire sans avoir à restocker le gros modèle de document du statut B,
  • et seulement quand le diff se trouvait plus gros que le workflow en lui-même, enregistrer la totalité, (#57299)

Quelque chose d'anormal ce serait le même workflow enregistré, à répétition, en totalité alors qu'a priori un diff aurait du être enregistré.

#2

Mis à jour par Pierre Ducroquet il y a presque 2 ans

wcs_demarches_orleans_test_entrouvert_org=# select pg_size_pretty(sum(coalesce(length(comment), 0))) as comments, pg_size_pretty(sum(coalesce(length(serialization), 0))) as serializations, pg_size_pretty(sum(coalesce(length(patch), 0))) as patchs from snapshots;
 comments | serializations | patchs 
----------+----------------+--------
 1946 kB  | 1539 MB        | 37 GB
(1 ligne)
wcs_demarches_orleans_test_entrouvert_org=# with foo as (select object_type, object_id, sum(coalesce(length(patch), 0)) from snapshots group by 1, 2 order by 3 desc limit 30) select foo.object_type, foo.object_id, pg_size_pretty(sum) from foo;
 object_type | object_id | pg_size_pretty 
-------------+-----------+----------------
 workflow    | 178       | 35 GB
 workflow    | 168       | 735 MB
 workflow    | 162       | 418 MB

Donc oui, y'a un workflow qui a un problème...

wcs_demarches_orleans_test_entrouvert_org=# select extract(week from timestamp), count(*) from snapshots where object_type = 'workflow' and object_id = '178' group by 1 order by 1;
 date_part | count 
-----------+-------
         5 |   792
         6 |   782
         7 |   821
         8 |    84
        13 |   183
        14 |   252
        15 |   241
        16 |   251
(8 lignes)

Plusieurs centaines de changements par semaine.

#3

Mis à jour par Frédéric Péters il y a presque 2 ans

Plusieurs centaines de changements par semaine.

Mais en soit ça ne devrait pas poser de problème, sauf si c'est à chaque fois "je remplace ce modèle de 20 Mo par un autre nouveau modèle de 20 Mo".

#4

Mis à jour par Pierre Ducroquet il y a presque 2 ans

En moyenne 8MB par patch, donc 2GB par semaine, sauf la semaine 6 où on avait 31MB par patch, 25GB sur la semaine.

#5

Mis à jour par Frédéric Péters il y a presque 2 ans

Si je prends les deux plus récentes modifications, je télécharge, et je diff,

--- snapshot-workflow-21301-20220424-1811.wcs   2022-05-20 09:33:15.837723115 +0200
+++ snapshot-workflow-21302-20220424-1812.wcs   2022-05-20 09:33:09.497675588 +0200
@@ -209977,7 +209977,7 @@
                 <prefill>
                   <locked>False</locked>
                   <type>string</type>
-                  <value>{{mairie_creation_8_var_mairie|default:""}}</value>
+                  <value>{% if form_name == "Demande de livret de famille suite &#224; erreur" %}{{form_var_remise_lf_orleans}}{% else %}{{mairie_creation_8_var_mairie|default:""}}{% endif %}</value>
                 </prefill>
                 <items>
                   <item>Mairie centrale</item>

mais dans la table il y a un diff qui est bien plus volumineux.

(...)

Ce qui est logique le diff est fait par rapport à la dernière version complète.

Tu peux produire pour le workflow 178 la liste des snapshots (order by id desc), avec en timestamp, comment + colonnes la taille des colonnes serialization et patch. ? Pour tenter d'imaginer un meilleur seuil.

#6

Mis à jour par Frédéric Péters il y a presque 2 ans

8MB

Deux approches pour faire évoluer :

            if len(obj.serialization) > len(patch):
                # serialization is bigger than patch, store patch

j'étais juste avant sur l'idée de faire un len(obj.serialization) / 10 et chercher ce facteur mais peut-être que c'est aussi à combiner avec un truc statique genre len(patch) > 1_000_000.

#7

Mis à jour par Pierre Ducroquet il y a presque 2 ans

Cf ci-joint pour les valeurs historiques du coup.
Et s'il est certain que l'on garde les données, je vais faire un patch pour qu'on partitionne la table. Si les données historiques sont froides, autant les garder dans des tables qui ne seront jamais modifiées.

#8

Mis à jour par Frédéric Péters il y a presque 2 ans

  • Lié à Development #65497: moins attendre pour préférer un snapshot complet à un patch ajouté
#9

Mis à jour par Frédéric Péters il y a presque 2 ans

  • Sujet changé de Table snapshot très volumineuse. à Table snapshot très volumineuse (-> partitionner la table)
  • Assigné à mis à Pierre Ducroquet
#10

Mis à jour par Pierre Ducroquet il y a presque 2 ans

En préliminaire, j'ai ce patch pour améliorer les performances...

#11

Mis à jour par Pierre Ducroquet il y a presque 2 ans

Étant donné qu'on a encore des personnes avec des instances en PostgreSQL 9.6 (plus supporté pourtant) et que le partitionnement déclaratif a été introduit dans PostgreSQL 10... je suppose qu'il vaut mieux attendre ?

#12

Mis à jour par Frédéric Péters il y a presque 2 ans

Oui. (mais ça doit se réduire)

#16

Mis à jour par Frédéric Péters il y a presque 2 ans

  • Statut changé de Solution proposée à Solution validée

En préliminaire, j'ai ce patch pour améliorer les performances...

Go.

#17

Mis à jour par Pierre Ducroquet il y a presque 2 ans

  • Statut changé de Solution validée à Résolu (à déployer)

Fait

commit 44bc83f0bff04de116d36a78519955b087effacc (HEAD -> main, origin/wip/65485/snapshots-table-partitionning, origin/main, origin/HEAD, wip/65485/snapshots-table-partitionning)
Author: Pierre Ducroquet <pducroquet@entrouvert.com>
Date:   Mon May 23 16:31:03 2022 +0200

    sql: add indexes on snapshots table (#65485)

Je vais faire un nouveau ticket pour le partitionnement, pour le jour où nous n'aurons plus de 9.6 ou équivalent dans les installations connues.

#18

Mis à jour par Transition automatique il y a presque 2 ans

  • Statut changé de Résolu (à déployer) à Solution déployée
#19

Mis à jour par Transition automatique il y a plus d'un an

Automatic expiration

Formats disponibles : Atom PDF