[C'était une spécification de curl & HTTP] Lorsque Flask avec uWSGI est exécuté par HTTP, il y a un délai de nettoyage de 1 seconde lors de la publication d'un fichier.

Twitter Commençons par Qiita pour commémorer la réincarnation.

~~ Comme le titre l'indique, lorsque j'exécute Flask avec uWSGI @ HTTP, j'ai confirmé qu'il y a un beau délai de 1 seconde lors de la publication d'un fichier, donc je vais vous présenter la procédure de reproduction. ~~

Ceci est une spécification de curl qui émet une requête avec l'en-tête ʻExpect: 100-continue` et attend 1 seconde pour vous demander si vous voulez publier le fichier sur le serveur. Il semble. [^ 1]

$ curl -v -s -XPOST -F file=@LICENSE localhost:5002
* Rebuilt URL to: localhost:5002/
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 5002 (#0)
> POST / HTTP/1.1
> Host: localhost:5002
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 1271
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------ebc5516179fb0a6c
>
* Done waiting for 100-continue
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 20
<
* Connection #0 to host localhost left intact
Took: 0:00:01.011157

Il est dit conforme à HTTP / 1.1. [^ 2]

uWSGI prend en charge la gestion de ʻExpect: 100-continue`, et il semble que vous devriez ajouter la ligne suivante au fichier ini. [^ 1]

http-manage-expect = 1

Paramètres expérimentaux

https://github.com/akeyhero/uwsgi-http-is-slow

Selon le référentiel ci-dessus

  1. Lorsque Flask est démarré indépendamment
  2. Lorsque Flask est démarré via uWSGI avec les paramètres HTTP
  3. Lorsque Flask est démarré via uWSGI dans le paramètre de protocole uwsgi

Je mène une expérience sur.

1. Lorsque Flask est démarré indépendamment

simplement

$ flask run --host=0.0.0.0

Quand a commencé avec.

2. Lorsque Flask est démarré via uWSGI avec les paramètres HTTP

uWSGI

http = 0.0.0.0:80

Lorsque vous avez commencé avec des paramètres qui incluent.

3. Lorsque Flask est démarré via uWSGI dans le paramètre de protocole uwsgi

uWSGI

socket = /socket/uwsgi.sock

Lorsque vous avez commencé avec des paramètres qui incluent.

version

Flask==1.1.1
uwsgi==2.0.18

Résultat expérimental

Les temps de réponse lors du POST d'un fichier à l'aide de curl sont les suivants. Ici, tant qu'il est confirmé, le fichier peut être n'importe quoi, donc j'utilise le fichier LICENSE du référentiel.

Temps de réponse
1.Flacon seul 0.067
2. Flask w/ uWSGI @ HTTP 1.063
3. Flask w/ uWSGI @ uwsgi 0.062

Vous pouvez voir que le temps de réponse est juste une seconde plus lent que lorsque Flask est démarré avec uWSGI @ HTTP.

Cette fois, nous avons publié les données pour un essai, mais le temps de réponse sera presque le même quel que soit le nombre d'essais.

en conclusion

~~ Flask seul ne cause pas ce phénomène, j'ai donc lancé un [problème] approprié (https://github.com/unbit/uwsgi/issues/2129) car uWSGI en était probablement la cause. Cependant, je ne sais pas si c'est à cause de Flask ou si cela est causé par une seule technique de combinaison. ~~

~~ Si vous avez des détails, veuillez nous en informer. : arc: ~~

J'ai été enseigné par un contributeur d'uWSGI. [^ 1] J'ai beaucoup appris.

Recommended Posts

[C'était une spécification de curl & HTTP] Lorsque Flask avec uWSGI est exécuté par HTTP, il y a un délai de nettoyage de 1 seconde lors de la publication d'un fichier.
C'était un peu difficile de faire flacon avec la version docker de nginx-unit
[Art de la coquille] Seulement quand c'est un multiple de 3 et un nombre avec 3 devient stupide