Web Worker CPUs werden nicht ausgelastet
Michael_K
- javascript
Hallo,
woran kann es liegen, dass manche Web Worker die vorhandenen CPU-Kerne besser ausnutzen als andere?
Einige Berechnungen werden bei mir in Web worker ausgelagert. Für jeden Berechnung wird eine neue worker instance erstellt und nach Beendigung der Berechnung geschlossen. Firefox zeigt auch an, dass entsprechend viele Threads parallel laufen und nach Berechnungsende sind alle Threads beendet. Schaue ich mir aber die Auslastung der CPU-Kerne an, dann sieht die Auslastung ganz unterschiedlich aus. Einige von mir geschrieben web worker funktionieren gut und die Last wird auf die vorhanden Kerne verteilt. Bei anderen web workern dümpeln die CPU-Kerne irgendwoe bei 20 bis 30% rum, obwohl die Instanzen parellel abgearbeitet werden können.
Woran kann das liegen? Gibt es irgendwo Hilfestellung, wie web worker zu schreiben sind, damit mehrere Instanzen vom gleichen web worker von der vorhanden Hardware gut Gebrauch machen?
hohe Auslastung der CPU-Kerne bei 50 parellelen web worker1 Instanzen
mittelmäßige Auslastung bei 50 parellelen web worker2 Instanzen
Gruss, Michael
Hallo Michael_K,
für dümpelnde CPU gibt's viele Gründe.
Ich nehme mal an, dass deine Worker keine I/O machen und nur rechnen. Sobald sie mit irgendwem kommunizieren wollen, kann es zu Wartesituationen kommen.
Ein anderer Grund kann sein, dass dein Speicher voll ist und das Betriebssystem den Arbeitsspeicher deiner Workerprozesse aus- und einlagern muss. Ohne genaue Kenntnis des Umfeldes kann man das schlecht beurteilen.
Es ist übrigens nicht unbedingt hilfreich, auf einem System mit X Kernen mehr als (X-1) Worker laufen zu lassen. Einen sollte man für Betriebssystem und UI übrig lassen, die übrigen können workeln. Mehr Worker als Kerne bedeuten nur mehr Overhead für das Task Scheduling und ergeben nur Sinn, wenn außer CPU-Last auch I/O anfällt, so dass die Worker auf die Daten warten müssen.
Viele kleine Worker zu erstellen kann vermeintlich dann einen Sinn ergeben, wenn sich die Aufgabe gut in unabhängige Bausteine aufteilen lässt und diese Bausteine per Messaging kommunizieren können. Allerdings sind Browser-Worker dafür nicht das ideale Medium. Soweit ich weiß, wird für jeden Worker ein neuer Prozess gestartet (Quelle). Hast Du 50 zusätzliche Firefox-Prozesse, wenn deine Worker loslaufen? Prozesse sind für das Betriebssystem ein ziemlicher Overhead. Kleinteiliges Threading macht man besser mit Sprachen, die dafür vorgesehen sind, wie z.B. Erlang. Okay, das läuft nicht im Browser. In JavaScript ergibt das wenig Sinn.
Rolf
Hallo Rolf,
I/O ist nicht involviert. Es werden Datanreihen als JSON an die Worker übergeben und das Ergebnis wird zurückgeschickt und der Thread wird geschlossen. Deshalb verwundert es mich ja auch so, weil es eigentlich im Code nichts gibt, auf dem sich die CPUs "ausruhen" können.
Es ist übrigens nicht unbedingt hilfreich, auf einem System mit X Kernen mehr als (X-1) Worker laufen zu lassen.
Ja, das stimmt. Aber auch wenn ich die Anzahl der Thread unter die Anzahl der Cores setze, dümpeln diese bei einigen Threads rum, als ob es nichts abzuarbeiten gibt. Ich habe aber noch keine Möglichkeit gefunden, wie man die verfügbaren cores ermitteln kann. Ich werde mal weiter schauen, ob ich die Ursache eingrenzen kann.
Gruss, Michael
Hallo,
… Ich habe aber noch keine Möglichkeit gefunden, wie man die verfügbaren cores ermitteln kann.
ich mache das mit
const ncores = navigator.hardwareConcurrency;
Gruß
Jürgen
Hallo Michael_K,
Ich habe aber noch keine Möglichkeit gefunden, wie man die verfügbaren cores ermitteln kann.
navigator.hardwareConcurrency
Jetzt auch im Selfwiki 😉
Rolf