mon-entreprise icon indicating copy to clipboard operation
mon-entreprise copied to clipboard

PWA : consommation de bande passante

Open mquandalle opened this issue 2 years ago • 18 comments

L'ajout de la PWA dans #2189 a entraîné une augmentation significative de la consommation de bande passante pour notre serveur Netlify.

C'était un problème que nous avions déjà avec le précédent essai d'ajout d'intégration PWA avant de retirer complètement cette fonctionnalité #1456.

Malheureusement Netlify donne une vue très très incomplète de la consommation de bande passante (Vercel le fait très bien...), le seul chiffre que j'ai trouvé est celui là : image

Il faut donc se livrer à d'absurdes calculs pour essayer d'estimer la surconsommation de bande passante et l'impact sur la facturation :

Avec l'historique de mes mails j'obtiens 75% de bande passante consommée au 17 juillet, soit 750gb sur la période 17juin - 17 juillet. Vu qu'on a à peu près le même traffic sur la deuxième quinzaine de juillet on devrait avoir environ (14/31×750) = 340gb sur la période 18 juillet - 31 juillet, or Netlify nous donne 1100gb, soit une surconsommation de bande passante de 1100-340 = 760gb. La PR pwa a été mergée le 25 juillet, si on lui impute toute la surconsommation, ça veut dire qu'on a 760/7 ≈ 100gb de surconsommation par jour.

L’ordre de grandeur est vérifié avec l'onglet réseau des outils de développement, avant la PR le chargement du site implique le transfert de 760kB, après la PR pour un premier chargement sans cache j'obtiens 3.8MB (beaucoup moins ensuite une fois que le site et le worker sont à jour)

Netlify facture les 100gb au prix de 55€ https://www.netlify.com/pricing/, on peut donc estimer le coût de ce problème de surconsommation de bande passante à 1600€/mois.

Il faut changer le mode de fonctionnement du worker pour qu'il ne télécharge plus les mêmes ressources plusieurs fois. Connexe https://github.com/betagouv/mon-entreprise/issues/2228#issuecomment-1200919760

mquandalle avatar Aug 01 '22 10:08 mquandalle

J'ai regardé un peu et on charge tout les js du dossier assets y compris les legacy ce qui est inutile. Ca divise par 2 le poids téléchargé par la pwa (de 15240.79 KiB à 7507.55 KiB)

wiinxt avatar Aug 01 '22 14:08 wiinxt

J'ai testé plusieurs idées pour réduire le precache de la pwa :

La première était d'avoir des chunks plus petit et découpé par module (un chunk react, publicodes, etc), cela aurais permis de garder en cache les dépendances qui ne change pas souvent. J'avais déjà fait quelque chose de semblable avec Webpack qui possède des options pour faire ce genre d'optimisation. J'ai donc tenté avec Rollup (via manualChunk) mais cela pose problème car Rollup ne garantie pas que le bundle fonctionne si il est découpé manuellement.

La seconde était de ne pas ajouter les chunks lazy import au precache de la pwa, cela réduit bien le poids téléchargé à l'installation mais cela pose problème quand on est offline et que l'on va sur un page lazy loadé, la page crash si on ne l'a pas chargé avant. Pour contourner ca j'ai tenté de plusieurs choses via workbox (fallback un composant react Offline, poster un message du service worker au client pour naviguer vers une autre route...) sans succès. J'ai finalement réussi en passant par un ErrorBoundary, à voir si ca fonctionne bien avec tous les navigateurs.

J'ai aussi externalisé les json dans data qui était inclus dans le build, ca permet de ne pas générer de nouveau chunks tous les jours alors qu'on a fait aucune modification de code.

Je suis arrivé à environ 2900KiB au lieu de 15240KiB pour le precache (sans legacy et sans lazy import), je pense que ca devrais être beaucoup mieux ainsi, je push ca.

wiinxt avatar Aug 03 '22 10:08 wiinxt

Je réouvre car la consommation me parait toujours excessive, nous somme à plus de 300GB depuis le 17 aout, soit environ 60GB/jour. Une option pour résoudre le problème serait de passer par cloudflare comme CDN car il propose une bandwith illimité gratuitement (ex: https://blog.bytefaction.com/posts/save-netlify-bandwidth-using-cloudflare/)

wiinxt avatar Aug 22 '22 10:08 wiinxt

Mettre Cloudfare comme CDN devant Netlify me semble ajouter trop de complexité dans l'infra. Mais si on veut utiliser Cloudflare il y a l’offre "Cloudflare Pages" qui est leur concurrent de Netlify https://pages.cloudflare.com, avec effectivement une bande passante illimité (ainsi qu'un nombre de devs ayant accès au compte illimité).

Mais dans tous les cas ce n'est pas souhaitable que le service worker génère de gros volumes de bande passante. En l’état actuel je suis dubitatif sur son rapport intérêt/coût.

mquandalle avatar Aug 22 '22 10:08 mquandalle

Le problème c'est que je n'arrive pas à comprendre d'où vient cette consommation, depuis le 17 aout on a ~56000 visite sur le site avec une majorité sur la page salarié qui pèse ~1.5MB, normalement on devrait donc être dans les 84GB. Avec nos +300GB on devrait être dans les 200k visite juste du 17 au 22 aout...

Je vois pas trop comment savoir si c'est nos stats qui ne sont pas bonne, ou le calcul de consommation de netlify...

En tout cas il y a un truc qui ne fonctionne pas comme il devrait, on pourrait désactiver la PWA un moment pour voir si ca vient bien de ca, je vois pas trop quoi faire d'autre

wiinxt avatar Aug 22 '22 10:08 wiinxt

Je viens de voir que netlify prend aussi en compte les données qui passe par leur proxy : "- outgoing data sent by your sites in proxied API requests, including requests to Netlify Functions." (source), ca veut dire que l'api augmente aussi le trafic.

wiinxt avatar Aug 22 '22 11:08 wiinxt

Bon à savoir, mais je ne pense pas que ça vienne de là.

J'ai regardé un peu, c'est très mystérieux en effet. Je n'arrive pas à relier les ajouts de Service Worker avec l'augmentation de la bande passante. En tout cas, je ne vois rien d'anormal sur les différentes consoles network des navigateurs (Chrome, Firefox, safari).

Désactiver la PWA est un bon premier pas en effet, histoire d'être sûr qu'on cherche au bon endroit :+1:

johangirod avatar Aug 22 '22 11:08 johangirod

C'est quand même fou d'avoir environ 100mb d'utilisation en moyenne à 4h du matin, même en prenant de grosse marge (avec 5mb par visite) ca fait plus de 20 nouveau visiteurs simultané... On doit avoir des bots je vois que ca

wiinxt avatar Aug 23 '22 09:08 wiinxt

Sur scalingo il y a quand même pas mal de requêtes je viens de voir, environ 800 requêtes en continue de 9h à 16h :

image

Dommage que j'avais pas mon script à ce moment

wiinxt avatar Aug 23 '22 09:08 wiinxt

Pour l'instant il n'y a pas de grosse différence sans la PWA, la barre jaune est le moment du deploy (la courbe était déjà dans la descente avant le deploy)

image

wiinxt avatar Aug 23 '22 15:08 wiinxt

Pour les navigateurs qui ont déjà la PWA installés, je me demande si le premier retour sur le site n'est pas comme avant, c'est à dire géré par la PWA avant d'avoir un rechargement de la page. C'est l'impression subjective que j'ai eu quand ça m'est arrivé.

mquandalle avatar Aug 23 '22 15:08 mquandalle

Il me semble qu'il force le rechargement de la page une fois qu'il a téléchargé la nouvelle version (sans popup), c'est la seul différence

wiinxt avatar Aug 23 '22 16:08 wiinxt

Il y a pas photo sans la PWA :

image

wiinxt avatar Aug 24 '22 07:08 wiinxt

CR du point de ce matin :

Pour remettre la PWA sur le site :

  • stratégie "network first" sur toutes les ressources en particulier la page html initiale
  • pas de préfetch pour ne pas consommer des données inutilement chez nos utilisateurs

Possible de configurer une PWA avec prefetch de toute l'appli si la personne choisi d'installer l'application avec l'option système

mquandalle avatar Aug 24 '22 12:08 mquandalle

Les deux premier points sont fait dans #2252 (le precache n'est pas complètement désactivé mais ne télécharge que des fichiers nécessaire) Le troisième point n'est pas possible actuellement car l'event appinstalled n'est disponible que sur chrome et edge (voir https://caniuse.com/mdn-api_window_appinstalled_event), mais ce n'est pas très important car la majorité des simulateurs fonctionne juste en allant sur la home page

wiinxt avatar Aug 25 '22 16:08 wiinxt

Ca à l'air mal parti pour l'instant : image

wiinxt avatar Aug 29 '22 10:08 wiinxt

C'est la rentrée aussi :) Plus de traffic aujourd'hui https://explorer.atinternet-solutions.com/core/#/overview/overview/010101?period.shortcut=today&period.end=14:02&period.comp.shortcut=previousPeriod&period.granularity=3&site=617190&graph.options.defaultlist=minmax&graph.options.comparisonlist=comparisonperiod&graph.options.displayoptionlist=classicline&graph.options.eventloglist=eventlog

mquandalle avatar Aug 29 '22 12:08 mquandalle

J'ai fait une estimation grossière et si ca continue comme ca on sera dans les 1.4TB vers la fin du mois netlify (le 17 septembre)

wiinxt avatar Aug 30 '22 18:08 wiinxt

Je ferme car ça à l'air ok maintenant

image

wiinxt avatar Nov 07 '22 16:11 wiinxt