Geotrek-admin icon indicating copy to clipboard operation
Geotrek-admin copied to clipboard

Performances de chargement et de navigation

Open camillemonchicourt opened this issue 3 years ago • 7 comments

Dans le cadre du groupement de commandes 2019-2021 a travail a été initié pour améliorer les performances de chargement des objets dans l'interface de Geotrek-admin et donc de navigation dans l'outil.

Le projet a été détaillé ici : https://github.com/GeotrekCE/Geotrek-admin/projects/2 Et les développements réalisés : https://github.com/GeotrekCE/Geotrek-admin/pull/2387

Les développements ne sont pas terminés et une nouvelle phase de développement a été lancée pour pouvoir aboutir à des premières améliorations de ces performances.

Pour cela une analyse technique a été réalisée par @submarcos : MakinaCorpus Perfs Retour 2j jpo 20220210.pdf

Les actions envisagées sont :

  1. Mettre en place la pagination côté serveur sur les listes de données
  2. Utiliser Django-RestFramework-GIS pour générer les GeoJSON
  • premier pas vers le tuilage qui améliorera les performances, car la génération du GeoJSON se fera en un coup côté Base de données PostGIS, et pas élément par élément dans le code Python
  1. Séparer les tronçons ‘brouillon’ dans une nouvelle sous-liste du module tronçon (nouveau modèle de données)
  2. Mettre à jour les bibliothèques Leaflet (cette étape est déjà initiée et peut se dérouler en parallèle des premières étapes, du moins sur la partie des bibliothèques en elle- même et pas de leur utilisation dans Geotrek)
  3. Mettre en place le tuilage des données cartographiques (en fonction de la faisabilité rapide, GeoJSON ou MVT)

camillemonchicourt avatar Feb 16 '22 18:02 camillemonchicourt

Quelques précisions suites au début des développements :

  • Contrairement à ce que j'ai indiqué dans le document, le cache ne s'invalide pas au bout de 8jours, mais au bout de 8h. Il faudrait surement augmenter sensiblement cette valeur (30j ?) en attendant d'ameliorer la gestion globale de ce cache
  • Il est surement possible d'améliorer la création d'itinéraires sans pour autant séparer les tronçons brouillons dans une autre couche de données, par exemple en utilisant le meme geojson en cache, mais en n'affichant pas les brouillons sur les tracés linéaires topologiques ( à tester sur un gros volume de données)
  • L'imbrication des points 1 et 2 du document est telle que je vais surement devoir les réaliser en meme temps.

PR des modifications coté mapentity : https://github.com/makinacorpus/django-mapentity/pull/228 (en cours, je vais commencer son intégration coté geotrek et apporterai toutes les corrections nécessaires en suivant)

submarcos avatar Feb 22 '22 17:02 submarcos

OK merci pour ces premiers retours. En effet si le cache est remis à zéro dans tous les cas quand il y a une modification d'un objet, quand il n'y a pas de modification autant le garder plus que 8 heures.

camillemonchicourt avatar Feb 23 '22 07:02 camillemonchicourt

Bonjour, Je viens de terminer la premiere salve de dévelopements,

Avec dans l'ordre :

  • Augmentation du cache des GeoJSON par défaut à 30jours (8h à l'origine)
  • Modification du moteur de rendu des appels API pour les listes (utilisation de django-rest-framework)
  • Mise en place de la pagination des listes

La pagination des listes permet de n'appeler que les éléments visibles dans les listes de geotrek-admin lors de la visualisation, filtres et recherches. Avant, tout devait être chargé dans le navigateur, et toutes ces opérations étaient réalisées dans le navigateur en javascript. Désormais, tout est éxecuté coté serveur, et les opérations de recherche / tri / filtres sont éxecutées en base de données et affichées page par page, ce qui permet d'augmenter sensiblement les performances sur cette partie.

Sur une base de 25 000 tronçons :

Avant, la liste chargée en entier, quand le cache est invalidé : Capture d’écran du 2022-04-27 09-31-45

Avant, la liste chargée en entier, quand le cache est présent : Capture d’écran du 2022-04-27 09-37-15

Désormais, sans cache, en chargeant juste la page affichée de la liste : Capture d’écran du 2022-04-27 09-33-06

J'ai pasé 19j sur les 25j sur ces parties, qui comprend le socle qui sera utilisé par les prochaines étapes.

django-rest-framework est le socle commun qui permettra de générer les GeoJSON en utilisant les reprojections en base de données (avec ST_TRANSFORM - qui augmentera les performances encore en réalisant certaines opérations en une seule fois coté BDD, plutot qu'élément par élément en python). Cela permettra aussi de mettre en place le tuilage des GeoJSON dans une prochaine release.

Les 6 derniers jours seront donc consacrés à cette génération / optimisation des GeoJSON.

La pagination des listes sera disponible dans la prochaine version de Geotrek-admin, qui sera normalement la 2.82.0, disponible dans les prochains jours.

submarcos avatar Apr 27 '22 07:04 submarcos

Bonjour, je viens de terminer la deuxième partie des dévelopements. Concernant les geojson :

Sur une base de 25 000 tronçons :

Avant, la liste chargée en entier, quand le cache est invalidé : path_sans_cache

Avant, la liste chargée en entier, quand le cache serveur est présent : path_avec_cache_sans_last_modified

Avant, la liste chargée en entier, quand le cache navigateur est présent : path_avec_cache_avec_last_modified

Désormais, sans cache, en chargeant juste la page affichée de la liste : path_sans_cache

Désormais, quand le cache serveur est présent : path_avec_cache_sans_last_modified

Désormais, quand le cache naviagteur est présent : path_avec_cache_avec_last_modified

Le cache s'invalidant après chaque ajout / modification / suppression de tronçon, on constate qu'après une intervention sur ceux ci, le temps d'attente pour afficher une liste ou tracer un linéaire topologique est environ 16x plus rapide

Pour les prochaines étapes, je préconiserai :

  • de filtrer les tronçons brouillons en JavaScript plutot que côté serveur (cache utilisé directement sans le regénérer une deuxième fois)
  • de mettre à jour les bibliotheques JavaScript / Leaflet et d'optimiser le traitement des geojson (goulot d'étranglement à l'affichage)
  • de mettre en place le système de tuilage

et à terme d'utiliser du routage coté backend ?

Rappel de ce qui a été fait :

  • Optimisation de la génération de tous les GeoJSON
    • reprojection et simplification en 1x côté BDD avec postGIS (au lieu d'élément par élément en python)
    • compression gzip avec nginx (au lieu de python)
    • optimisation des requetes SQL au maximum
    • génération avec django-rest-framework (au lieu de django-geojson)

les GeoJSON de l'API v2 étaient déjà générés avec DRF et côté BDD, par contre la modification active la compression gzip qui n'était pas présente

submarcos avatar Jun 08 '22 08:06 submarcos

Super, une belle avancée de plus au niveau des performances. Merci.

camillemonchicourt avatar Jun 08 '22 09:06 camillemonchicourt

La partie 2 de l'amélioration des performances du chargement des GeoJSON a été intégrée dans la version 2.84.0. En lien avec celle-ci, il est indiqué dans les notes de version :

  • Que ceux dont Geotrek-admin est installé sur une version 18 d'Ubuntu (Bionic) doivent mettre à jour PostGIS en version 2.5, à la place de la 2.4 fournie par défaut sur cette version d'Ubuntu (voir la doc dédiée à la méthode pour le mettre à jour)
  • Que le cache serveur doit être vidé après la mise à jour de Geotrek-admin en version 2.84.0
  • Qu'il est conseillé de répercuter les améliorations du template de configuration NGINX pour que les fichiers JSON et GeoJSON soient compressés par NGINX (https://github.com/GeotrekCE/Geotrek-admin/commit/3d44447893037944f35cd4280e89021f693b3a1f)

camillemonchicourt avatar Jun 20 '22 16:06 camillemonchicourt