2017-07-28 1 views
1

Ich habe Tonnen von Artikeln und Stackoverflow Fragen gelesen, und ich sah eine Menge Informationen über Thread-Pool, aber niemand spricht über physischen CPU-Kern Verwendung. Ich glaube, dass diese Frage nicht doppelt ist.Node.js Thread-Pool und Core-Nutzung

Vorausgesetzt, dass ich einen Quad-Core-Computer und libuv Thread-Pool-Größe von 4 habe, wird Node.js all diese 4 Kerne bei der Verarbeitung von vielen E/A-Anfragen (vielleicht mehr als tausend) verwenden?

Ich bin auch neugierig, dass i/o AnfrageThread-Pool verwendet. Niemand gibt eine klare und vollständige Liste der Anfrage. Ich weiß, dass die Node.js-Event-Schleife single-threaded ist, aber einen Thread-Pool verwendet, um i/o zu behandeln, wie zum Beispiel den Zugriff auf Disk und db.

Antwort

4

Ich bin auch neugierig, welche I/O-Anfrage Thread-Pool verwendet.

Die Platten-E/A verwendet den Thread-Pool.

Netzwerk-E/A ist von Anfang an async und verwendet keine Threads.

Mit Datenträger-E/A werden die einzelnen Datenträger-E/A-Aufrufe weiterhin als nicht blockierend und asynchron in Javascript angezeigt, obwohl sie Threads in ihrer systemeigenen Codeimplementierung verwenden. Wenn Sie mehr Festplatten-E/A-Aufrufe als die Thread-Poolgröße überschreiten, werden die E/A-Aufrufe der Festplatte in die Warteschlange gestellt. Wenn einer der Threads freigibt, wird der nächste Festplatten-E/A-Aufruf in der Warteschlange ausgeführt jetzt verfügbarer Thread. Da das Javascript für die Festplatten-I/O nicht blockierend ist und davon ausgeht, dass ein Completion-Callback irgendwann in der Zukunft aufgerufen wird, bedeutet das Anstehen von Anfragen, wenn der Thread-Pool gerade besetzt ist, dass es länger dauert, bis ich das spätere I erreiche/O-Anfragen, aber ansonsten ist die Javascript-Programmierschnittstelle nicht betroffen.

Vorausgesetzt, dass ich einen Quad-Core-Computer und libuv Thread Pool-Größe von 4 habe, wird Node.js all diese 4 Kerne bei der Verarbeitung von vielen E/A-Anfragen (vielleicht mehr als Tausende) verwenden?

Dies ist nicht node.js und ist aus diesem Grund schwer zu beantworten. Die first referenced article below sagt, dass unter Linux der I/O-Thread-Pool mehrere Kerne verwendet und bietet eine kleine Demo-App, die das zeigt.

Dies hängt von der spezifischen Betriebssystemimplementierung und dem verwendeten Thread-Scheduler ab. node.js erstellt einfach die Threads und verwendet sie und das Betriebssystem entscheidet dann, wie die CPU verwendet werden soll, vorausgesetzt, es wird insgesamt auf dem System ausgeführt. Da Threads im selben Prozess oft miteinander kommunizieren müssen, ist die Verwendung einer separaten CPU für verschiedene Threads im selben Prozess viel komplizierter.

Es gibt ein paar node.js Design-Muster, die die Vorteile von mehreren Kernen nehmen sind garantiert (in jedem modernen OS)

  1. Cluster App und erstellen Sie so viele Cluster, wie Sie Prozessorkerne haben. Dies hat auch den Vorteil, dass jeder Cluster seinen eigenen I/O-Thread-Pool hat, der unabhängig arbeiten kann und jeder unabhängig davon sein eigenes Javascript ausführen kann. Mit nur einem node.js-Prozess und mehreren Kernen erhalten Sie nie mehr als einen Thread der Javascript-Ausführung (hier wird node.js als single-threaded bezeichnet - obwohl in seinen Bibliotheksimplementierungen Threads verwendet werden). Mit dem Clustering erhalten Sie jedoch eine unabhängige JavaScript-Ausführung für jeden Cluster-Serverprozess.

  2. Für einzelne Aufgaben, die möglicherweise CPU-intensiv sind (z. B. Bildverarbeitung), können Sie eine Arbeitswarteschlange und einen Pool von untergeordneten Arbeitsprozessen erstellen, an die Sie arbeiten. Dies hat einige Vorteile mit dem Clustering, aber es ist ein spezieller Zweck, bei dem Sie genau wissen, wo der CPU-Engpass liegt und Sie ihn gezielt angreifen möchten.

Weitere ähnliche Antworten/articles:

how libuv threads in nodejs utilize multi core cpu

Node.js on multi-core machines

Taking Advantage of Multi-Processor Environments in node.js

When is the thread pool used?

+0

diese Antwort Liebevoll, es ist sehr gründlich. Ich möchte erwähnen, dass Node.js auf meiner Auswahlliste als Sprache für eine intensive Bildverarbeitung ziemlich niedrig ist. Vielleicht könnten Sie dieses Beispiel durch etwas wie Web-Crawling ersetzen? Persönlich konnte ich den Vorteil der Verwendung von mehreren Threads zum Headless-Browsing und Round-Robin der Link-Following unter allen Threads sehen. –

+0

@PatrickRoberts - Für das Web-Crawling mit dem Parsen der gecrawlten Ergebnisse würde ich wahrscheinlich eher Cluster als eine Arbeitswarteschlange bilden. In diesem Fall profitieren Sie ziemlich gut davon, dass die gesamte App in mehrere Prozesse geclustert ist, nicht nur ein Teil davon. Und Sie müssten nur zwischen Clustern koordinieren, wenn Sie die nächste URL zum Verarbeiten oder Speichern Ihrer Ergebnisse erhalten. Alles dazwischen ist völlig unabhängig. – jfriend00

+0

Oh, ich habe das bisschen über die "Arbeitswarteschlange" verpasst, ich dachte auch nur an Clustering. Ich denke, in diesem Fall ist die Bildverarbeitung ein gutes Beispiel für eine Parallelisierung auf Task-Ebene, die Node.js ausnutzen könnte. –