-
Notifications
You must be signed in to change notification settings - Fork 77
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Lenteur requête "ST_DWithin" lancée malgré la segmentation dynamique #4423
Comments
Bonjour @RemiClaus et merci pour cette analyse. En effet les itinéraires longs créés des problèmes de performances dans Geotrek du fait de certaines requêtes d'intersections. C'est un sujet qui a déjà été identifié et documenté et pour lequel il faudrait développer des optimisations. Une piste intéressante est celle de stocker lorsqu'on modifie un objet les intersections associée pour ne pas avoir à les recalculer à la volée à chaque fois que quelqu'un souhaite afficher l'itinéraire. Toutefois à ce jour aucun territoire n'a souhaité ni financer cette évolution ni proposer de contribution au code pour mettre en oeuvre ce sujet. Quelques tickets qui évoquent les sujets de performances liés à l'API ou à l'affichage de long itinéraires :
En effet à défaut d'une solution du problème "à la source", un territoire a souhaité financer le développement d'une fonctionnalité pour pouvoir cacher les POI et objets associées sur un itinéraire qui contient des enfants (donc une itinérance). De même dans Geotrek-Rando il existe un paramètre pour limiter le nombre d'objets affichés. Dans les deux cas ce ne sont pas des solutions mais bien des contournements. Le sujet ici est donc soit de contribuer dans le code pour corriger ce problème et optimiser ce sujet soir d'aider la communauté à le faire en finançant ce travail je pense. Concernant le sujet de la requête SQL :
En fait la requête affichée das le ticket est une requête qui est "générée" par le code de Geotrek, donc il y a des pré-calculs effectués pour générer les limites, les filtres, etc. : d'un itinéraire à l'autre la requête ne sera pas toujours la même. C'est l'ORM de Django qui s'occupe de générer la requête SQL. |
OK mais là ce que je ne comprends pas non plus, c'est pourquoi la requête un ST_DWithin de 500m entre la géométrie de l'itinéraire et la géométrie des POI alors que ce Geotrek-admin est en mode segmentation dynamique. On n'a pas ces soucis de lenteur ou de plantage sur Grand tour des Ecrins, justement grâce à la segmentation dynamique qui évite de faire des intersections géographiques entre les objets. Ou alors leur Geotrek-admin est en mode "segmentation dynamique", mais une modification ou une intervention sur le serveur précédente fait qu'il agit comme si il était sans segmentation dynamique ? |
Bonjour @camillemonchicourt @babastienne. Je suis Gwen, développeur en charge du support et de l'hébergement sur le projet. Merci pour vos réponses. Le détail de la config est qu'il n'y a aucune config faite dans les fichiers dans |
OK, merci pour ces investigations et précisions. |
En effet, un élément semble indiquer que SANS SD, avant, on faisait des ST_DWithin et qu'on a basculé en ST_Intersect : #3260 (comment) |
Je n'ai pas fait ces changements de mode, donc s'ils ont eu lieu, c'est au cours des versions. Le geotrek a été installé en 2022 et a été mis à jour plusieurs fois depuis. Les données dans la bdd sont toutes fraiches (< 2semaines) et le geotrek n'a pas été mis à jour entre temps. Là ce que je me dis c'est que j'ai peut-être mal suivi les procédures de mise à jour. Ma procédure:
Et effectivement @camillemonchicourt dans mon |
Je pense qu'avant tout en effet la priorité est déjà de mettre à jour l'instance Geotrek-Admin. Normalement les commandes listées devraient fonctionner. Il faut dans le fichier Ensuite lancer les commandes de MAJ et normalement ça devrait mettre à jour Geotrek. Attention à bien consulter le changelog et les releases notes depuis la version 2.92 jusqu'à la dernière pour vérifier qu'il n'y a pas de breaking changes à prendre en compte. Ensuite il est recommandé d'avoir un minimum de configuration dans le fichier Par défaut si rien n'est indiqué dans le fichier Geotrek va en prendre une générique mais ce n'est pas l'idéale. Redites nous après mise à jour ce que donne le comportement de votre Geotrek. |
OK OK, je n'ai jamais utilisé ni testé un déploiement de GTA avec Docker, mais de ce que je vois. |
Oui. J'ai besoin de fixer la version car je suis obligé de modifier le docker-compose pour l'intégrer à mon infrastructure (notamment au load-balancer traefik avec des labels et pour provisionner les certificats automatiquement). Mais effectivement j'ai omis certains détails dans le processus d'upgrade. Merci pour les pistes. Je suis en train de tout mettre à jour (y a une mise à jour majeure de postgres au milieu également) je reviens ici dès que c'est fait et que j'ai testé le tout. |
J'ai eu quelques soucis un peu profonds avec les changements drastiques du docker-compose.yml entre la v2.92 et la v2.111 pour l'adapter à mon infrastructure. C'est maintenant en place. Effectivement il y a eu de grosses améliorations au niveau de la charge serveur et du temps de réponse ! C'est une toute autre histoire ! Merci pour les pistes et m'avoir permis de voir que mon process d'upgrade était incorrect. Du coté de geotrek-admin, on dirait bien que tout est rentré dans l'ordre. |
OK super. |
Vous auriez une méthode pour vérifier ça ? Un log du serveur postgres ? |
Oui, voir #4423 (comment) où ce sont les logs PostgreSQL lors de l'appel API des POI d'un itinéraire. |
La présence de Ca va dans le sens d'une bascule d'un mode à l'autre qui aurait engendré ces requêtes. |
Oui c'est aussi ce que je suspecte aussi. |
Non ils n'ont jamais été décommentés. Je les ai ajoutés là quand @RemiClaus a mentionné le drapeau (dans un email ou il évoquait une piste pour notre problème). |
@babastienne et @camillemonchicourt, merci encore pour vos éclairages. |
Bonjour à vous,
Contexte
Nous avons détecté des lenteurs importantes sur notre géotrek au chargement dans "rando" de longs itinéraires sur plusieurs étapes.
Ces lenteurs aboutissent parfois au chargement de la page, après plus de 30 secondes d'attente.
Mais parfois, ça bloque et rien ne s'affiche.
Serveur utilisé et base de données
Le serveur est très puissant, 8 coeurs, et plus de 100Go de RAM.
La base contient 250 tronçons, 100 POI environ, 40 treks équivalent à 1 journée d'activité et 4 itinérances comprenant une dizaine de treks en moyenne.
Elle n'est donc pas gigantesque.
La segmentation dynamique est activée.
L'interface "rando" est ici : https://rando.itineraireschalaisiens.fr/search
Analyse du problème
En regardant les logs des fois où le chargement ne se fait pas, on a identifié la requête qui crée cette lenteur :
En la simplifiant, elle ressemble à ceci :
Dans cette requête,
ST_GeomFromEWKB('GEOMETRIETRESLONGUE'::bytea)
correspond à l'itinérance à plusieurs étapes que l'on souhaite afficher.Questions soulevées par cette requête ?
Cette requête cherche à localiser les entités qui se trouvent à 500m de l'itinérance.
Or, les 500m de cette requête ressemblent au paramètre de recherche par défaut quand la segmentation dynamique est désactivée comme indiqué ici : https://geotrek.readthedocs.io/fr/stable/install/advanced-configuration.html#trek-poi-intersection
Pourquoi donc a-t-on cette requete de recherche d'entités par buffer alors que la segmentation dynamique est activée ?
La requête met une bonne vingtaine de secondes pour s'exécuter.
Pendant ce laps de temps, le CPU est à 100%, ce qui empêche d'exécuter d'autres requêtes en même temps.
Autre question, pourquoi cette requête indique "limit 37" alors que quand on l'exécute sans la limite, elle renvoie pile 37 lignes ? C'est comme si la requête savait elle même à l'avance le nombre de lignes qu'elle renvoyait.
Suggestions / Avis ?
Avez-vous déjà rencontré ce problème ?
Avez-vous des pistes de solutions ?
Est-ce que nos itinéraires sont juste trop longs ? (200km pour certains...)
Je reste à dispo, Merci !
Rémi Borel pour les Chemins Chalaisiens
PS
En attendant, on a contourné le problème en désactivant l'affichage des POI dans les itinérances avec "enfants" (paramètre
displayObjectsRelatedToItinerantTreks
).Mais ça ne résout pas le problème de fond...
The text was updated successfully, but these errors were encountered: