2013-03-14 16 views
13

Warnte Node.JS auf einer AWS-Instanz und wurde die Anfrage mal getestet, bekam einige interessante Ergebnisse.Node.JS Antwortzeit

benutzte ich die folgenden für den Server:

var http = require('http'); 

http.createServer(function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.write('Hello World'); 
    res.end(); 
}).listen(8080); 

Ich habe eine durchschnittliche 90ms Verzögerung auf diesen Server, aber die Gesamtanforderung nimmt ~ 350 + ms. Offensichtlich wird viel Zeit für die Box verschwendet. Ich stellte sicher, dass der DNS vor dem Test zwischengespeichert wurde.

Ich habe eine Apache-Bank auf dem Server mit einer Co-Währung von 1000 - es beendete 10.000 Anfragen in 4,3 Sekunden ... was bedeutet, einen Durchschnitt von 4,3 Millisekunden.

UPDATE: Nur für grins, ich installierte Apache + PHP auf der gleichen Maschine und hat eine einfache "Hallo Welt" Echo und bekam eine Antwortzeit von 92ms im Durchschnitt (zwei über Ping).

Gibt es irgendwo eine Einstellung, die ich vermisse?

+1

Wie haben Sie die gesamte Anfragezeit gemessen? Wie haben Sie die Zeit von 10000 Anfragen gemessen? –

+0

@AndreySidorov Habe die Chrome Developer Tools vor Ort nur für die Anfragezeit genutzt, ich habe eine Apache-Bank für den Server erstellt. – Jonathan

+0

hey Jonathan, so die Schlussfolgerung ist? ... Reaktionszeit mit Knoten ist langsam? wäre interessant weiter zu untersuchen –

Antwort

10

Ich hasse es absolut meine eigenen Fragen zu beantworten, aber ich möchte weitergeben, was ich mit zukünftigen Lesern entdeckt habe.

tl; dr: Mit res.write() ist etwas nicht in Ordnung. Verwenden Sie express.js oder res.end()

Ich habe gerade eine Reihe von Tests durchgeführt. Ich habe mehrere Arten von Node-Server eingerichtet und Dinge wie PHP und Nginx gemischt. Hier sind meine Ergebnisse.

Wie bereits erwähnt, verlor ich mit dem obigen Snippet ungefähr 250ms/Anfrage, aber die Apache-Benchmarks replizierten diese Probleme nicht. Ich habe dann einen PHP-Test gemacht und Ergebnisse von 2ms - 20ms über Ping bekommen ... ein großer Unterschied.

Dies führte zu etwas mehr Forschung, ich begann einen Nginx-Server und Proxy den Knoten durch, und irgendwie, dass magisch die Antwort von 250ms auf 15ms über Ping geändert. Ich war auf Augenhöhe mit diesem PHP-Skript, aber das ist ein wirklich verwirrendes Ergebnis. Normalerweise würden zusätzliche Hops die Dinge verlangsamen.

Fasziniert, ich machte auch einen express.js Server - und etwas noch Interessanteres passierte, der Ping war 2ms alleine. Ich habe mich eine ganze Weile in der Quelle herumgegraben und festgestellt, dass es keinen res.write() Befehl gab, sondern direkt zur res.end(). Ich startete einen anderen Server, der "Hello World" aus dem res.write entfernte und fügte es dem res.end hinzu und erstaunlicherweise war der Ping 0ms über Ping.

Ich habe einige suchen, wollte sehen, ob es ein bekanntes Problem war und stieß auf diese SO Frage, wer genau das gleiche Problem hatte.nodejs response speed and nginx

Insgesamt interessante Dinge. Stellen Sie sicher, dass Sie Ihre Antworten optimieren und alles auf einmal senden.

Viel Glück für alle!

+0

Danke Mann! Gute Arbeit :-) –

14

Während die Chrome-Entwicklertools eine gute Möglichkeit darstellen, die Leistung am Frontend zu untersuchen, erhalten Sie eine sehr grobe Schätzung der tatsächlichen Server-Timings/CPU-Last. Wenn Sie in den Entwicklungswerkzeugen eine Gesamtanforderungszeit von ~ 350 ms haben, subtrahieren Sie von dieser Anzahl DNS-Nachschlagen + Verbinden + Senden + Empfangen, dann ziehen Sie die Umlaufzeit (90 ms?) Ab und danach haben Sie die erste Schätzung. In meinem Fall erwarte ich, dass die tatsächliche Anfragezeit unter einer Millisekunde liegt. Versuchen Sie diesen Code auf dem Server auszuführen:

var http = require('http'); 
function hrdiff(t1, t2) { 
    var s = t2[0] - t1[0]; 
    var mms = t2[1] - t1[1]; 
    return s*1e9 + mms; 
} 
http.createServer(function(req, res) { 
    var t1 = process.hrtime(); 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.write('Hello World'); 
    res.end(); 
    var t2 = process.hrtime(); 
    console.log(hrdiff(t1, t2)); 
}).listen(8080); 

Basierend auf ab Ergebnis sollten Sie durchschnittlichen Sende schätzen + Anfrage + Empfangszeit höchstens 4,2 ms (4200 ms/10000 req) zu sein (haben Sie führen Sie es auf dem Server? was Nebenläufigkeit?)

+1

+1 Für eine intelligente Antwort. Alles sehr interessant. In meinem lokalen Test wurde DNS zwischengespeichert, also dauerte die Anforderung ohne Ping 260 ms - entsprechend dem von Ihnen bereitgestellten Snippet beträgt die durchschnittliche Anforderung dafür etwa 0,6 Millisekunden. Auf der ab, ich habe es auf dem Server mit Nebenläufigkeit bei 1000. ** Diese Zahlen sinnvoll, aber ich bin immer noch bei der 260ms verlustig ** – Jonathan

+2

Weitere interessante Zahlen, Apache/PHP auf der gleichen Box testen , Bekomme ich eine Reaktionszeit von 92ms (zwei über Ping). Während ich immer noch ungefähr 350ms auf dem NodeJS-Skript bekomme. Ich fühle mich wie ich etwas vermisse ... – Jonathan

+0

Ich habe sehr ähnliche Ergebnisse mit Apache/PHP und mit node.js beim Messen vom Client. Können Sie detailliertere Messungen mit https://github.com/mnot/htracr durchführen oder einfach tcpdump verwenden und Ihre Ergebnisse veröffentlichen? –

Verwandte Themen