2017-05-25 5 views
1

Ich benutze einen API-Server mit NodeJS 6.10.3 LTS unter Ubuntu 14.04 (vertrauenswürdig). Ich habe festgestellt, dass mein API-Server bei ca. 600 Reqs/Min. Auf einer c4.large EC2-Instanz die Obergrenze erreicht. Ich meine, die CPU geht bis zu 100% nach oben. Ich weiß, dass ich die Instanz nicht vollständig ausnutze, indem ich das Cluster-Modul benutze, aber das ist jetzt in Ordnung.NodeJS-Leistungsproblem

Ich nahm einen .cpuprofile-Speicherauszug meines API-Servers für 10 Sekunden und bemerkte, dass der Profiler jede Sekunde für ~ 300ms zeigt, dass mein NodeJS-Code im Leerlauf ist.

Weiß jemand, was das (Leerlauf) bedeutet? Ist es ein GC-Problem? Oder ist es eine interne (zu V8) Sperre, die ich auslöse? Jede Hilfe oder Hinweise auf Tools, um dieses zu debuggen wäre schön. Ich arbeite daran, einige der Stack-Traces im cpuprofile zu anonymisieren, damit ich sie teilen kann.

Die Pakete, die ich verwende, sind ExpressJS 4, Couchbase NodeJS SDK, Socket.IO hauptsächlich. Die Codepatches sind hauptsächlich Leseanforderungen und Pushing zu Couchbase. Und schließlich die Abfrage von Couchbase über die Views-API und die Übertragung einiger aggregierter Daten auf einem Socket.IO-Kanal. Also alle hübschen I/O asynchronen freundlichen Sachen. Ich habe sichergestellt, dass ich keine synchronen Funktionen anrufe. Es gibt keine Muster von Funktionsaufrufen vor dem (Leerlauf) im CPU-Profil.

+0

Tut mir leid, ich habe nicht mehr, aber dieses Gespräch war wirklich hilfreich, wenn ich in Node Perf Probleme stieß: https://www.youtube.com/watch?v=O1YP8QP9gLA – SomeKittens

+0

Wenn der Server im Leerlauf geht und Sie aren ' Wenn Sie eine synchrone E/A verwenden, werden Sie die CPU scheinbar nicht sättigen (der Server ist nicht voll ausgelastet), oder Ihr Server ist nicht an die CPU gebunden und etwas anderes (wahrscheinlich die Festplatte oder DB) ist Ihr Engpass. – jfriend00

+0

@ jfriend00 tatsächlich einer der Kern meiner CPU bleibt bei 100% Auslastung im Test. Aber ich sehe diese (Leerlauf) immer noch jede Sekunde. –

Antwort

0

Es könnte auch nur I/O warten, was bedeutet, dass keine der Sockets Daten bereit zum Lesen noch haben und so die Zeit im Leerlauf verbracht wird. Wenn Sie eine Lasttest-Bibliothek verwenden, sollten Sie überprüfen, ob die Anforderungen innerhalb einer Sekunde gleichmäßig verteilt sind.

Werfen Sie einen Blick auf https://www.npmjs.com/package/gc-stats, um GC-Daten zu überprüfen. Es gibt Flags zum Erhöhen des Heapspeichers und zum Ändern, wenn GC ausgeführt wird, wenn sich das Problem als GC-bezogen erweist.