1 votes

NGINX et php_fpm streaming file prend le triple en transfert ?

Ma configuration : - nginx 1.0.6 ( compilé à partir de zéro ) - php 5.3.8 avec php-fpm ( également à partir de zéro ).

J'utilise ce script PHP script pour transmettre des fichiers du site distant à mes utilisateurs :

        $chunksize = 1 * (1024 * 1024); //you may want to change this
        $bytes_send = 0;
        if ($file = fopen($file, 'rb',false)) {      
            while(!feof($file) &&  (!connection_aborted()) && ($bytes_send<$new_length)) {

                $buffer = fread($file, $chunksize);            
                echo ($buffer);                       
                flush();
                $bytes_send += strlen($buffer); 
            }
            fclose($file);                         
        } else {
            die('Error - can not open file.');
        }

Après avoir commencé à télécharger avec ma connexion (20 Mbps), j'ai obtenu le résultat suivant dans ifstat

 eth0       
 KB/s in  KB/s out
 5105.77   1925.70
 5106.15   2063.77
 5083.80   2337.95
 4946.52   2487.28
 5127.37   2507.15
 5118.94   2474.98
 5172.55   2438.86
 4646.82   2451.87
 5246.18   2465.98
 5186.71   2459.66
 5032.03   2458.55

Est-ce normal ? Le résultat sur le serveur de production a été un échec complet à cause du manque de bande passante :| sur apache la balance est équilibrée. L'aide est vraiment appréciée :

@Edit Petit benchmark réalisé. Téléchargement d'un fichier de 500 Mo par ce biais. Les résultats pour environ 250-260 MBs étaient comme ça, puis sont descendus à presque 0. Est-ce une sorte d'équilibre d'utilisation du réseau que fait nginx ?

2voto

Sergey Vlasov Points 6068

Cela se produit parce que nginx essaie de lire depuis le backend (php-fpm dans votre cas) aussi vite que possible, en mettant d'abord la réponse en mémoire tampon (limitée par la directive proxy_buffer_size y proxy_buffers ), puis sur le disque (jusqu'à la taille spécifiée dans la rubrique proxy_max_temp_file_size (la valeur par défaut est de 1 GiB). Par conséquent, votre script "streaming" télécharge le fichier aussi vite qu'il le peut, même si la vitesse de téléchargement du client est plus lente.

Voir le Documentation du module proxy http de nginx - il y a beaucoup de paramètres qui peuvent être réglés, et la plupart d'entre eux peuvent être définis par emplacement (de sorte que vous pouvez modifier le comportement de la mise en mémoire tampon uniquement pour certaines URL). Vous pouvez même renvoyer la valeur X-Accel-Buffering du backend pour désactiver la mise en mémoire tampon, ou, mieux encore, renvoyer l'en-tête X-Accel-Redirect pour que nginx diffuse le fichier lui-même sans faire appel à un processus dorsal.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X