Projet

Général

Profil

Development #64667

Trop de requêtes SQL...

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

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

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Avec le passage sur le pg-intra, un changement mineur a été fait : le PG n'est plus sur la même machine que scrutiny...
Mais le changement mineur n'est pas si mineur que ça semble-t-il, puisque la page https://scrutiny.entrouvert.org/projects/saas2/ part en timeout.
La raison en est simple : elle fait environ 52740 requêtes SQL. Pour un affichage. Donc avec la latence réseau introduite, c'est un timeout.

Je vais creuser le code pour essayer de régler le problème (dans la limite de mes compétences en django avec des class-based views)


Fichiers

Révisions associées

Révision 98cbde38 (diff)
Ajouté par Pierre Ducroquet il y a environ 2 ans

rewrite the code to get modules and versions of a service (#64667)

This page was iterating on Python side, and was spending a huge amount
of time sending tiny queries and building objects from the results.
Instead, use a single query per service/platform, and fetch the version
at the same time.

Benefits: we divide by more than 100 the number of queries of the project
page, and we speed it up by a factor 10 or more...

Historique

#1

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

Il y a à peu près zéro attention portée là-dessus donc tu trouveras sans doute facilement des choses à faire.

J'allais dire qu'éventuellement il pouvait être utile de rebasculer en local le temps de ce travail mais ma seule page vraiment utile c'est https://scrutiny.entrouvert.org/projects/saas2/history et elle s'affiche.

#2

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

Temporairement guillaume a augmenté le timeout sur haproxy.
Et avant la migration, on était tout pile sous le timeout...

#3

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

Patch ci-joint...

Pour saas2, ça passe de 52740 requêtes à 73, et le temps d'exécution en local en mode debug est divisé par 20.
Le code est pas forcément le plus propre par contre, je suis rouillé sur Django.

#4

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

Tu devrais activer pre-commit sur ce module (là le code n'est pas conforme black, ce qui se voit dès le premier chunk avec la suppression d'une ligne).

De mon côté je vais voir pour ajouter un minimal appel à tox et configurer un job jenkins scrutiny-wip pour que les branches puissent être testées, ne fut-ce que sur cet aspect.

Forme toujours on commence nos messages de commit par une minuscule.

Fond maintenant, ça pourrait se jouer sans raw SQL ? (sans y perdre du temps non plus, pour scrutiny ça sera très bien comme ça).

#5

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

Frédéric Péters a écrit :

Tu devrais activer pre-commit sur ce module (là le code n'est pas conforme black, ce qui se voit dès le premier chunk avec la suppression d'une ligne).

Pas l'habitude de pre-commit encore, désolé.
Patch corrigé pour la forme.

Fond maintenant, ça pourrait se jouer sans raw SQL ? (sans y perdre du temps non plus, pour scrutiny ça sera très bien comme ça).

Je manque d'entraînement sur l'ORM de django pour trouver les équivalences. (puis à $job-- j'avais la famille Guérin pour ça, on s'y habitue :) )
Mais je vais continuer de regarder, par contre je pensais faire ça en tâche de fond et donc dans une itération future, si ça ne pose pas de problème.

#6

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

  • Assigné à mis à Pierre Ducroquet

Non comme j'écrivais,

sans y perdre du temps non plus, pour scrutiny ça sera très bien comme ça

~~

{% lookup_or_empty module.1 platform.id %}

Il me semble que c'est ce qu'on ferait plus communément sous la forme {{ module.1|get:platform.id|default:"" }}.

On a ce filtre |get dans combo, tu peux le copier/coller :

@register.filter(name='get')
def get(obj, key):
    try:
        return obj.get(key)
    except AttributeError:
        try:
            return obj[key]
        except (IndexError, KeyError, TypeError):
            return None
#7

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

Dac, refait avec ce filtre...

#8

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

  • Assigné à mis à Pierre Ducroquet
#9

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

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

Hop go, merci.

#10

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

  • Statut changé de Solution validée à Résolu (à déployer)
98cbde3865124f63db814537022bbfbb6d51b2ee (HEAD -> main, origin/main, origin/HEAD)
Author: Pierre Ducroquet <pducroquet@entrouvert.com>
Date:   Fri Apr 29 08:16:22 2022 +0200

    rewrite the code to get modules and versions of a service (#64667)

    This page was iterating on Python side, and was spending a huge amount
    of time sending tiny queries and building objects from the results.
    Instead, use a single query per service/platform, and fetch the version
    at the same time.

    Benefits: we divide by more than 100 the number of queries of the project
    page, and we speed it up by a factor 10 or more...

#11

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

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

=> déployé, et la page est rapide avec beaucoup moins de requêtes SQL, powa est content.

#12

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

Automatic expiration

Formats disponibles : Atom PDF