Prozess Auswuchten in Erlang
-
21-08-2019 - |
Frage
Hat weiß jemand, ob es eine Art ‚Lastenausgleich‘ in der Erlang-Standardbibliothek ist? Ich meine, wenn ich ein paar wirklich einfache Operationen auf eine wirklich große Menge von Daten, die Overhead für jedes Element einen Prozess der Konstruktion wird größer sein als die Operation sequentiell auszuführen. Aber wenn ich die Arbeit in der ‚richtigen Zahl‘ von Prozess ausgleichen kann, wird es ein bessere Leistung, so bin ich im Grunde zu fragen, ob es eine einfache Möglichkeit, diese Aufgabe zu erfüllen.
By the way, hat jemand weiß, ob eine OTP-Anwendung eine Art Balance Last tut? Ich meine, in einer OTP-Anwendung gibt es das Konzept eines „Arbeitsprozess“ (wie ein Java-ish Thread Arbeiter)?
Lösung
Die plists
Modul wahrscheinlich macht, was Sie wollen. Es ist im Grunde eine parallele Implementierung des lists
Modul, Designs als Drop-in-Ersatz verwendet werden. Sie können jedoch auch steuern, wie es parallelisiert seine Operationen, beispielsweise durch wie viele Arbeitsprozesse definieren, sollten usw. werden hervorgebracht.
Sie wahrscheinlich würde es tun, indem eine bestimmte Anzahl von Arbeitnehmern Berechnung auf der Länge der Liste oder die Last des Systems in Abhängigkeit etc.
Von der Webseite:
plists ist ein Drop-in-Ersatz für die Erlang Modullisten, so dass die meisten Listenoperationen parallel. Es kann arbeiten auf jedes Element in parallel, für IO-gebundenen Operationen auf Sublisten Parallel dazu nimmt für Vorteil Multi-Core Rechner mit einer CPU-bound Operationen und über erlang Knoten, für innerhalb eines Clusters parallizing. Es behandelt Fehler und Knotenausfälle. Es kann so konfiguriert, abgestimmt werden, und gezwickt eine optimale Leistung zu erhalten, während Minimierung der Overhead.
Andere Tipps
Siehe Module pg2
und pool
.
pg2
implementiert ganz einfach verteilt Prozesspool. pg2:get_closest_pid/1
gibt „am nächsten“ pid, das heißt zufälligen lokalen Prozess, wenn vorhanden, andernfalls gelegentlicher Remote-Prozess.
pool
implementiert Lastverteilung zwischen den Knoten mit dem Modul slave
gestartet.
Es gibt keine, meiner Meinung nach, usefull generic Load-Balancing-Tool in OTP. Und vielleicht usefull es nur eine in bestimmten Fällen zu haben. Es ist leicht genug, um selbst eine Beurteilung zu implementieren. plists kann in den gleichen Fällen nützlich sein. Ich glaube nicht, parallel-Bibliotheken als Ersatz für die reale Sache. Amdahl werden Sie für immer verfolgen, wenn Sie diesen Weg gehen.
Die richtige Anzahl von Arbeitsprozessen ist auf die Anzahl der Disponenten gleich. Dies kann in Abhängigkeit von variieren, was anderen Arbeiten am System. Verwendung,
erlang:system_info(schedulers_online) -> NS
die Anzahl der Disponenten zu erhalten.
Der Begriff der Overhead, wenn das System mit einer Fülle von Arbeitsprozessen Überschwemmungen ist etwas fehlerhaft. Es gibt Overhead mit neuen Prozessen, aber nicht so viel wie mit os-Threads. Die Hauptoverhead-Nachrichten Kopieren zwischen Prozessen ist, kann dies seit dem binären der Referenz nur bei der Verwendung von Binärdateien gelindert wird gesendet. Mit eterms wird die Struktur expandierte zuerst, dann mit dem anderen Prozess kopiert.
Es gibt keine Möglichkeit, wie Kosten der Arbeit vorherzusagen mechanisch, ohne es zu messen beispiels es tun. Einige Personen müssen bestimmen, wie die Arbeit für einige Klassen von Aufgaben zu partitionieren. In Load Balancer Wort verstehe ich etwas ganz anderes als in Ihrer Frage.