2017-02-28 4 views
3

Ich versuche zu verstehen, die Grenzen von NodeJs beim Dishing viel Inhalt unter Last. Insbesondere möchte ich wissen, ob das Streaming einer längeren Antwort auf einen Client blockiert wird.Führt das Streamen eines HTTP-Antwortblocks nodejs?

Ich habe eine sehr einfache Test-Setup erstellt wo Node reagiert nur auf jede Anfrage mit einem Stream, der von einem 1 GB http Download zieht. Hier ist mein Code:

var http = require('http'); 
var fs = require('fs'); 

var iterator = 0; 

http.createServer(function(req, res) { 

    console.log('req received ', iterator++); 

    var url = 'http://download.thinkbroadband.com/1GB.zip'; 

    http.get(url, bigFile => { 

     res.writeHead(200, { 
      'content-type': 'application/zip', 
      'content-length': bigFile.headers['content-length'], 
     }); 

     bigFile.pipe(res); 

    }); 

}).listen(8003); 

So startete ich diesen Knoten Server und auf den Endpunkt mit mehreren Registerkarten in meinem Browser. Interessant war, dass nachfolgende Antworten nicht sofort mit dem Code console.log('request received ', iterator++); protokolliert werden. Stattdessen gibt es eine Verzögerung von 5 bis 10 Sekunden, bevor das erste Ereignis protokolliert wird.

Das ist seltsam für mich, denn wenn das Streaming einer HTTP-Antwort blockiert, sollte es warten, bis die erste Anfrage abgeschlossen ist, bevor die zweite akzeptiert wird. Wenn das Streaming nicht blockiert wird, erwarte ich, dass alle Anfragen sofort protokolliert werden, nachdem sie angefordert wurden.

Kann jemand das erklären?

Ich würde auch gerne irgendwelche Gedanken über Leistung hier hören. Knoten ist wahrscheinlich nicht wirklich für diese Art von Dingen gebaut. Die Download-Geschwindigkeit leidet wirklich bei mehreren Anfragen.

Antwort

2

Nach etwas mehr Forschung kann ich sehen, wie die verschiedenen Phasen der Ereignisschleife die Ergebnisse verursachen konnten, die ich sehe. Der Knoten guides erklärt, wie die Abfragephase, die alle E/A-Ereignisse ausführt, bei Bedarf blockiert und außerdem einen maximalen Stack hat, so dass der Hauptthread nicht zu lange blockiert wird.

Das würde das Verhalten erklären, das ich gesehen habe, wo viele E/A-Ereignisse (auch wenn ich sie nicht mit on('data')... abhörte) Ihre Knoten-App vorübergehend blockieren konnte. Ich sah nach der ersten Anfrage eine Verzögerung von 5 bis 10 Sekunden, bevor irgendetwas anderes durchkommen konnte.

Natürlich gibt es andere Dinge, die getan werden könnten, um die Leistung zu verbessern, wie das Cluster-Modul, um alle verfügbaren Prozessoren auf dem Rechner zu verwenden. Am Ende des Tages ist Knoten jedoch wahrscheinlich nicht die beste Lösung. Sie erhalten von einem herkömmlichen Webserver mit allen Threads, die Sie benötigen, eine viel bessere Leistung. Selbst nach der Verwendung aller Prozessoren habe ich nur eine CPU-Auslastung von etwa 6% mit Knoten erreicht.

Verwandte Themen