Closed firm1 closed 9 years ago
Donne des informations sur ton environnement parce que je n'ai pas le bug sur OS X avec Chrome, ni FF.
En effet.
Navigateur : Firefox 37 OS : Windows 7
Zoom à 100% ? Le 26 mai 2015 11:38, "firm1" notifications@github.com a écrit :
En effet.
Navigateur : Firefox 37 OS : Windows 7
— Reply to this email directly or view it on GitHub https://github.com/zestedesavoir/zds-site/issues/2752#issuecomment-105466747 .
Zoom a 100%, 90%, 120% => le bug reste le même.
Ouais, donc en fait le front est tellement dynamique de partout qu'on peut tout de suite abandonner l'idée du cache...
J'ai du mal avec cet affirmation du "front trop dynamique". Objectivement, c'est ce qu'on lui demande, c'est d'être dynamique, justement.
Alors il faut faire un choix ou repenser le front, mais si on continue comme ça, on va dans le mur.
C'est une question de performances aussi. Si le moindre octet du front dépend de 12000 paramètres, il va falloir de plus gros serveurs, puisque tous ces calculs consomment et qu'on ne peut rien mettre en cache.
Pour donner une idée des temps de réponse actuels :
cet avis n'engage que moi:
Je vois bien, et je te suis absolument, mais donc ça veut dire qu'avant de mettre en place le moindre cache, il faut repenser une partie du front. Hors, et c'est très malheureux, on manque de dev front, et j'ai l'impression qu'on tente rustine sur rustine (par exemple ça) pour quand même faire un truc potable qui se casse pas trop la gueule.
Donc pour moi, d'un coté, on est coincé par le fait qu'on doive sortir une release incessamment sous peu parce que la liste des commits s'allonge de jour en jour, d'autre part, il faudrait presque qu'on fasse un gel et qu'on prenne la peine de repenser un peu tout ça, parce qu'en l'état, on a un milliards de problèmes qui apparaissent due aux événements récents (et pas que liés au cache, je suis bien d'accord, même si j'ai l'impression que ça y est pour beaucoup, et encore une fois, aucune attaque là derrière, il FAUT qu'on mette en place un cache).
Si on agit pas incessamment sous peu (et désolé, en temps que DTC, il va falloir que tu statue là dessus), on va créer de telles incohérences que le bouzin va être impossible à maintenir.
Voilà ce que j'en pense.
Ha non mais les trucs comme #2754, il ne faut surtout pas faire !
Quant au reste, le statut est déjà ici
Ah, mais je parle pas simplement de la release en cours (j'avais bien vu qu'elle étais annulée et ça me semble une bonne chose à faire), je parle carrément de dire "Stop, on arrête maintenant, on fait un MP/un Zest'meeting/un post sur le forum et on réfléchis convenablement à comment intégrer le cache au front, et plus personne ne tente rien d'ici là".
Pour moi, on est déjà mal embarqué (on a pété l'API, non de non !), donc si on fait pas quelque chose, on est mal.
Peut être que je suis un peu trop alarmiste, ceci étant dit.
on a pété l'API, non de non !
Même pas. L'API n'a jamais fonctionné correctement de ce point de vue, si j'en crois ce que dit @GerardPaligot ici.
Sinon, cf #2756
Même pas. L'API n'a jamais fonctionné correctement de ce point de vue, si j'en crois ce que dit @GerardPaligot ici.
Non, l'API a fonctionné. C'est à cause d'évènements récents qui m'échappent que ça ne fonctionne plus.
Sinon, cf #2756
Fort bien. Mais je pense que tu n'acceptera jamais une release sans cache, donc c'est temporaire.
C'est pas le cache l'important, c'est les perfs. Si on a un meilleur moyen d'avoir des perfs correctes, on a pas besoin de cache (et ce serait l'idéal).
Je voudrait pas être défaitiste, mais coté back, faire mieux que ça va être très difficile. Sauf si quelqu'un est un magicien en SQL et trouve la requête qui permet de récupérer le nombre de commentaires et le dernier message avec (pour moi le truc le plus consommateur de requêtes actuellement quand je regarde la django toolbar).
(après, il y a un fix facile, c'est de prefetch_*()
l'image, aussi)
En terme de nombre de requête, j'ai travaillé pas mal sur ça dans la zep12 : nos pages de listes sont horribles à ce propos et on a de quoi gagner plus de 50% de perfs là !
Déjà on peut appliquer un fix très simple pour toutes les pages où il y a des messages en cassant les requêtes sur les badges de cette manière :
(fichier zds.utils.templatetags.profile.py)
perms = {'forum.change_post': {}}
@register.filter('state')
def state(user):
try:
profile = user.profile
if not profile.user.is_active:
state = 'DOWN'
elif not profile.can_read_now():
state = 'BAN'
elif not profile.can_write_now():
state = 'LS'
elif user.pk in perms['forum.change_post'] and perms['forum.change_post'][user.pk]:
state = 'STAFF'
elif user.pk not in perms['forum.change_post']:
perms['forum.change_post'][user.pk] = user.has_perm('forum.change_post')
state = None
if perms['forum.change_post'][user.pk]:
state = 'STAFF'
else:
state = None
except Profile.DoesNotExist:
state = None
return state
Ensuite, il y a des astuces à utilises dans les pages de tuto et articles et forums du style ce qui ce fait ici
queryset_reactions = ContentReaction.objects\
.select_related('author')\
.select_related('author__profile')\
.select_related('editor')\
.prefetch_related('author__post_liked')\
.prefetch_related('author__post_disliked')\
.prefetch_related('alerts')\
.prefetch_related('alerts__author')\
.filter(related_content=self.object)\
.order_by("pubdate")
# pagination:
make_pagination(context,
self.request,
queryset_reactions,
settings.ZDS_APP['content']['notes_per_page'],
context_list_name='reactions',
with_previous_item=True)
# is JS activated ?
context["is_js"] = True
if not self.object.js_support:
context["is_js"] = False
# optimize requests:
reaction_ids = [reaction.pk for reaction in queryset_reactions]
context["user_dislike"] = CommentDislike.objects\
.select_related('note')\
.filter(user__pk=self.request.user.pk, comments__pk__in=reaction_ids)\
.values_list('pk', flat=True)
context["user_like"] = CommentLike.objects\
.select_related('note')\
.filter(user__pk=self.request.user.pk, comments__pk__in=reaction_ids)\
.values_list('pk', flat=True)
if self.request.user.has_perm('forum.change_post'):
context["user_can_modify"] = reaction_ids
else:
queryset_reactions_user = ContentReaction.objects\
.filter(author__pk=self.request.user.pk, related_content__pk=self.object.pk)\
.values_list('id', flat=True)
context["user_can_modify"] = queryset_reactions_user
context['isantispam'] = self.object.antispam()
pour un ordre d'idée, ces mesures ont fait passer la page publique d'un tuto de 145->185 requêtes à 45->55.
La consommation du site, ce n'est pas que le nombre de requêtes, loin de là. Et je ne parle pas que de la home ; les forums sont bien pires. Générer une page à partir d'un template, c'est lourd. Souvent bien plus que les requêtes par exemple (cas de tous les articles et tous les tutos).
Et quand bien même, une page d'accueil qui a besoin de 57 requêtes en mode optimisé pour s'afficher, quelque part c'est quand même probablement qu'il y a un problème dans un coin.
Les grandes lignes sont plutôt de changer globalement sa manière de faire les choses :
get_bidule
J'ajoute que le moteur de templates de Django est connu pour être lent. D'ailleurs Django 1.8 propose Jinja2 à la place.
Spacefox, je suis tout à fait d'accord, le nombre de requête n'est qu'une stat. C'est d'ailleurs pour ça que mon travail s'est avant tout consacré à faire du précalcul avant de faire de la réduction de requête. La réduction du nombre de requête est un effet de bord très intéressant car ce sont les requêtes répétitives qui ont été supprimées. Quand je fais 5 fois dans une page la même requête avec les mêmes paramètres c'est pas joli à voir.
Je veux bien qu'on mette du cache car il y a clairement des choses qui doivent être cachées. Mais aujourd'hui on a tellement factorisé nos templates que d'une part on ne sait pas toujours où ils se trouvent, mais en plus ça nous force à faire des tonnes de trucs paramétrisés.
Quand je vois un template comme celui qui affiche les messages d'un forum message.part.html
qui a 12 niveaux d'indentation dont 7 pour des structures de contrôle (if/for/blocktrans) je me dis qu'on a un peu trop fumé quand on les a créé.
Concernant les précalculs, je suis d'accord : c'est typiquement le genre de chose qu'il faut faire avant de mettre du cache.
aujourd'hui on a tellement factorisé nos templates que d'une part on ne sait pas toujours où ils se trouvent, mais en plus ça nous force à faire des tonnes de trucs paramétrisés.
Ça, c'est typique d'une refactorisation mal maîtrisée (pour rester poli). Quel que soit le langage et le contexte, si tu dois passer plein de paramètres à ta méthode générique pour gérer les cas particuliers, c'est que tu t'es planté et qu'elle n'avait pas à être générique, en tous cas pas sous cette forme.
Ça, c'est typique d'une erreur de refactorisation mal maîtrisée (pour rester poli). Quelque soit le langage et le contexte, si tu dois passer plein de paramètres à ta méthode générique pour gérer les cas particuliers, c'est que tu t'es planté et qu'elle n'avait pas à être générique, en tous cas pas sous cette forme.
on est d'accord. Perso, ce n'est pas moi qui ai factorisé le front. M'étant concentré pendant très très longtemps sur le bugfix du back, je ne saurai même pas dire qui a fait quoi sur le front, par contre je sais que les templates m'ont donné pas mal de suées sur la zep12, et c'est pas @pierre-24 qui dira le contraire.
Je veux bien mettre en pause la zep 12 pendant deux semaines pour faire quelques passages "optimisation" dans le code du dev puisque j'ai déjà travaillé sur le sujet pour la zep12 justement. Par contre je n'ai aucune expérience pour le cache. Donc faudra voir.
Justement, fait sans cache, et après on verra.
Concernant les templates, c'est l'horreur intégrale. C'est pour ça que j'avais voulu attendre que l'intégration de la bêta soit terminée pour les faire sur la ZEP-12, parce que c'est du bricolage complet. Donc si quelqu'un s'amuse à faire un peu d'opti, je suis preneur :)
Bon, ça a un peu dégénéré, mais le problème initial est "résolu".
Bon, ça a un peu dégénéré
C'est a dire ?
Ben on c'est mis à discuter de cache et de solutions, quoi ;)
Il n y a rien a faire, que je sois sur la home, sur la page de tous les tutoriel, sur la page des forums, etc. L'item "Articles" dans la speedbar est toujours souligné (comme on peut le voir ci-dessous).
Je suppose que c'est une regression vu que ça marche très bien en prod.
Notons que en mode déconnecté, le fameux soulignement n'existe pas, et donc aussi une regresion.