Bonjour,
Mon problème concerne, sur un hébergement mutualisé chez 1and1, l'upload HTML, donc par un visiteur, à partir d'une page. Au départ le contexte était velu (Symfony3, BlueImp JQuery File Upload, AJAX/XMLHttpRequest, traitements tordus coté serveur) ce qui m'avait d'abord fait chercher ailleurs. J'en suis arrivé à identifier le problème à partir d'un code minimal, un simple formulaire:
Contexte des tests: Chrome/Firefox/Edge, ADSL montant 0,9Mbits/s immuable, descendant ~5Mbits/s avec variations dans la journée. Localement un serveur de tests (avec ISPConfig 3) configuré au plus proche de celui de production, mais connecté en gigabit.
Je voudrais pouvoir envoyer des images JPG issues de RAW, de poids de l'ordre de 20Mo, voire plus, limite placée à 50Mo. Un fichier de l'ordre de 1Mo suffit pour faire apparaître le problème, même s'il n'est pas encore vraiment gênant. Au plus simple, j'observe la barre d'état du navigateur et la fenêtre "réseau" du débugueur (F12). Je vois:
- Une phase A, envoi de la requête et donc du fichier, qui dure exactement ce qu'elle doit durer en fonction de mon débit montant. L'affichage du pourcentage de 0 à 100 est correct.
- Une phase B, qualifiée "Attente" ou "Waiting (TTFB)", qui est trop longue. Globalement, elle est proportionnelle à la taille du fichier. Avec une composante constante visible sur les petites valeurs. Plutôt instable, et ayant tendance à augmenter plus pour les grosses images. Par exemple pour ~4.5Mo, A durera ~45" et B de l'ordre de 20". Pour 20Mo, A sera à 3min1/2 et B autant voire un peu plus.
J'ai fait certaines vérifications sur la version complète, si je stoppe ou rafraîchis la page pendant la phase B, le processus se finalise (le contrôleur copie le fichier et met à jour la BdD). J'ai également vérifié que le site n'avait la main (entrée dans le contrôleur) qu'à la fin de B.
J'ai par ailleurs fait des essais d'upload sur des sites existants, je peux tout à fait mesurer les phases A et B. Sur le site de démo du plugin JQFU, la phase B est visible, mais très courte, 1.2" pour 12.5" pour A, pas pu voir pour de plus grosses valeurs, la taille étant limitée coté client. Sur CJoint, pas de de phase B significative. A noter que la démo utilise Apache, et CJoint NGINX.
Mon interprêtation, maintenant: ici par exemple je lis:
Je suppose (rien de plus, je suis une buse en architecture de gros serveur) que ma requête arrive sur une machine qui l'enregistre localement, c'est la phase A. Ensuite, c'est sur le LAN constituant l'hébergement que vont voyager le fichier et la requête (agrémentée du path d'arrivée du fichier), pour arriver sur la machine qui m'héberge, c'est 99,9..% de la phase B. Ce que je ne comprends pas, c'est le débit de cette opération, sans doute de l'ordre du Mbits/s.The default behavior of file uploads in what still is the standard stack for web applications – Apache and PHP – is pretty straight-forward. The web server reads the incoming POST request, buffering the uploaded file onto the disk, and passes the request on to the PHP backend which, in turn, reads the request and saves the file again to its temporary directory. Sounds like too much overhead, doesn't it?
Avec juste 10Mbits/s, ça passerait, en l'état, c'est très difficile à gérer, il faudrait refaire l'interface pour parer aux manipulations intempestives pendant la phase de silence, et même, avec 27Mo, j'ai eu une 504, c'est pas glop.
J'ai contacté l'assistance 1and1, sans trop insister, il m'a été gentiment suggéré que "le contrat était honoré". Normalement c'est passé au niveau "équipes techniques", je verrai bien. Ce que j'espère en exposant le problème, c'est de l'information pour décider. Les questions:
- L'hypothèse d'un réseau local très lent est-elle plausible ?
- Le débit particulier Socket->tranche peut-il être volontairement bridé, en cohérence par ailleurs avec les débits montants chez les clients ?
- Ou alors est-ce que je dois penser qu'il s'agit d'un problème global (système sous-dimensionné) ? Ou particulier, une "panne" concernant certains hébergements ?
- Si ce n'est pas trop compliqué, j'aimerais connaître le comportement (les temps A et B) pour un fichier de l'ordre de 2Mo, avec d'autres débits montants.
- C'est très compliqué, mais si quelqu'un pouvait tester ces temps sur un autre hébergement, ce serait la fête.
Merci d'avoir lu, bonne fin de journée...
Partager