une réponse en amont est mise en mémoire tampon dans un fichier temporaire


62

J'ai une application Web plutôt volumineuse et lente (données complexes, interface complexe) intégrée RoRet servie par Pumaavec nginxun proxy inverse. En regardant le nginxjournal des erreurs, je vois quelques entrées comme:

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file 
    /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, 
    client: 5.144.169.242, server: engagement-console.foo.it, 
    request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", 
    upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", 
    host: "ec.reputationmonitor.it", 
    referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"

Je suis plutôt curieux car il est très peu probable que la page reste la même pour différents utilisateurs et interactions d'utilisateur, et je ne penserais pas que la mise en mémoire tampon de la réponse sur le disque soit nécessaire / utile.

Je sais proxy_max_temp_file_sizeet le mettre à 0, mais cela me semble un peu gênant (mon proxy essaie de tamponner mais n’a aucun fichier où tamponner ... comment cela peut-il être plus rapide?).

Mes questions sont:

  1. Comment puis-je supprimer le [avertir] et éviter la mise en mémoire tampon des réponses? Est-il préférable d'éteindre proxy_bufferingou de mettre proxy_max_temp_file_sizeà 0? Pourquoi?

  2. Si nginxla réponse en mémoire tampon est une réponse: Quand sert-il la réponse en mémoire tampon, à qui et pourquoi?

  3. Pourquoi est-il nginxactivé proxy_bufferingpar défaut, puis [averti] si vous mettez une réponse en mémoire tampon?

  4. Quand une réponse déclenche-t-elle cette option? Quand cela prend> quelques secondes (combien?) Pour servir la réponse? Est-ce configurable?

TIA, ngw.


1
J'ai l'impression que vous confondez la mise en mémoire tampon de la mise en cache. La mise en mémoire tampon est la procédure qui permet de charger plus de données que ne le permet l'allocation de mémoire.
Slave

Réponses:


75

1) Comment puis-je supprimer le [avertir] et éviter la mise en mémoire tampon des réponses? Est-il préférable de désactiver proxy_buffering ou de définir proxy_max_temp_file_size à 0? Pourquoi?

Vous devez définir proxy_max_temp_file_sizesur 0 pour le supprimer. La proxy_bufferingdirective n'est pas directement liée à l'avertissement. Vous pouvez l'éteindre pour arrêter toute mise en mémoire tampon, mais cela n'est pas recommandé en général (sauf si cela est nécessaire pour Comet ).

2) Si nginx met une réponse en mémoire tampon dans une réponse, à qui et pourquoi?

Il se connecte immédiatement, mais un client a généralement une connexion beaucoup plus lente et ne peut pas utiliser les données de réponse aussi rapidement que celles produites par votre application. Nginx tente de mettre en mémoire tampon la totalité de la réponse afin de libérer votre application dès que possible.

Voir aussi: http://aosabook.org/en/nginx.html

3) Pourquoi nginx active-t-il proxy_buffering par défaut puis vous prévient-il s’il tamponne une réponse?

Comme je l'ai déjà mentionné, le proxy_bufferingn'est pas directement lié à l'avertissement. Il est généralement nécessaire pour optimiser les opérations proxy et le désactiver réduit les performances et le débit.

Nginx vous avertit uniquement lorsqu'une réponse ne rentre pas dans les mémoires tampons configurées. Vous pouvez ignorer l'avertissement si cela vous convient.

4) Quand une réponse déclenche-t-elle cette option? Quand cela prend plus que quelques secondes (combien?) Pour servir la réponse? Est-ce configurable?

Il se déclenche lorsque les mémoires tampons sont pleines. Veuillez regarder la documentation, tout le mécanisme est expliqué: http://nginx.org/r/proxy_max_temp_file_size

Vous voudrez peut-être augmenter les mémoires tampons.


5
Pour # 1, comment la suppression de la taille limite des fichiers temporaires empêche-t-elle l'avertissement de mise en mémoire tampon? Je ne pense pas que cela soit correct parce que cette directive est définie sur 0 et que des avertissements sont toujours émis.
Phil

Cette réponse n’est pas assez claire, est-il préférable que les performances soient définies proxy_max_temp_file_sizesur 0ou c’est seulement un moyen de supprimer cet avertissement?
Offir Pe'er

13

La configuration suivante fonctionne bien sur mon serveur.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

2
La deuxième directive est-elle redondante, c'est- 16kà- dire que la première ligne est identique à la deuxième ligne?
EoghanM

1
@EoghanM selon la documentation, no. Proxy_Buffer_size (tampon, non pluriel) s'applique à la première partie de la réponse du serveur proxy (à savoir les en-têtes) Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header. Proxy_buffers est pour le reste de la réponse.
cde

2
Tu as sauvé une partie de mes cheveux aujourd'hui. Je déplaçais nginx de notre serveur vers un conteneur Docker et il a commencé à être INCROYABLEMENT lent. Cela "corrige" ça. Pas sûr si la version sur notre serveur avait cette option activée par défaut ou non, mais celle du conteneur avait définitivement besoin de ces paramètres.
Krystian
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.