2

Angenommen, ich habe einen Cluster von n Erlang Knoten, von denen einige in meinem LAN sein können, während andere möglicherweise über ein WAN (dh über das Internet) verbunden sind, was sind geeignete Mechanismen für eine) unterschiedliche Bandbreite Verfügbarkeit/Verhalten (zum Beispiel Latenz induziert) und b) Knoten mit unterschiedlicher Rechenleistung (oder sogar Speicher Einschränkungen für diese Angelegenheit)? Mit anderen Worten, wie priorisiere ich lokale Knoten, die viel Rechenleistung haben, über diejenigen, die eine hohe Latenz haben und weniger leistungsfähig sind, oder wie würde ich idealerweise hochperformante entfernte Knoten mit hohen Übertragungslatenzen priorisieren Machen Sie diese Prozesse mit einem relativ großen Verhältnis von Berechnungen/Übertragungen (d. h. abgeschlossene Arbeit pro Nachricht, pro Zeiteinheit)?Priorisierung Erlang Knoten

Ich denke hauptsächlich daran, im Grunde jeden Knoten in einem Cluster zu benchmarken, indem ich ihnen einen Benchmark-Prozess für die Initialisierung schicke, damit die Latenzen, die mit der Datenübermittlung verbunden sind, berechnet werden können , Verwenden eines node-spezifischen Timers, um zu bestimmen, wie schnell ein Knoten mit einer Task beendet wird).

Wahrscheinlich müsste so etwas wiederholt gemacht werden, einerseits um repräsentative Daten zu erhalten (also Mittelwerte zu bilden) und andererseits könnte es möglicherweise sogar zur Laufzeit sinnvoll sein, um zu sein kann sich dynamisch an sich ändernde Laufzeitbedingungen anpassen.

(Im gleichen Sinne, man würde wahrscheinlich wollen lokal priorisieren Knoten über die, die laufen auf anderen Rechnern laufen)

Diese hoffentlich gemeint sein würde, um interne Stellen Versand zu optimieren, so dass bestimmte Knoten bestimmte Aufträge verarbeiten.

Antwort

1

Wir haben etwas ähnliches nur auf unserem internen LAN/WAN (WAN ist zum Beispiel San Francisco nach London) getan.Das Problem mit einer Kombination dieser Faktoren kocht:

  1. den Overhead in einfach einen Fernaufruf über einen lokalen (internen) machen Aufruf
  2. die Netzwerklatenz zu dem Knoten (in Abhängigkeit von dem Anforderungs-/Ergebnis Nutzlast)
  3. die Leistung von dem entfernten Knoten
  4. die Rechenleistung benötigt, um die Funktion
  5. ob batching der Anrufe Verbesserung jede Leistung auszuführen, liefert, wenn eine freigegebene „statische“ Datensatz dort war.

Für 1. gingen wir davon keinen Overhead (es war vernachlässigbar im Vergleich zu den anderen)

Für 2. wir aktiv gemessen es Sonde Nachrichten mit Umlaufzeit zu messen, und wir gesammelten Informationen aus tatsächlichen Anrufe

für 3. maßen wir es auf dem Knoten und hatte übertragen sie diese Informationen (das auf dem Laststrom aktiv auf dem Knoten in Abhängigkeit davon geändert)

für 4 und 5. wir es funktionierte empirisch für die jeweilige Charge aus

Dann löste der Anrufer, um die Mindestlösung für eine Reihe von Anrufen zu erhalten (in unserem Fall eine ganze Reihe von Derivaten zu berechnen) und beförderte sie an die Knoten in Batches.

Wir haben unsere Berechnung "Gitter" viel besser mit dieser Technik, aber es war ziemlich viel Aufwand. Wir hatten den zusätzlichen Vorteil, dass das Gitter nur von dieser Umgebung verwendet wurde, so dass wir viel mehr Kontrolle hatten. Das Hinzufügen eines Internetmixes (variabler Latenz) und anderer Benutzer des Rasters (variable Leistung) würde die Komplexität nur erhöhen mit möglicherweise abnehmenden Renditen ...

+0

Vielen Dank für Ihre Antwort, die Technik, die Sie verwendet haben, ist ziemlich im Einklang mit was Ich habe mir vorgestellt (und was ich in der Frage skizziert habe). Ich denke, es wäre interessant zu sehen, dass genau dieses Szenario von irgendeiner Form von Erlang-Infrastruktur unterstützt wird (z. B. unter Verwendung von OTP). Ich habe deine Antwort akzeptiert, weil sie meinem Szenario sehr nahe kommt. – none

1

Das Problem, über das Sie sprechen, wurde im Zusammenhang mit Grid-Computing auf viele verschiedene Arten gelöst (siehe z. B. Condor). Um dies ausführlicher zu diskutieren, denke ich, dass einige zusätzliche Informationen erforderlich sind (Homogenität der zu lösenden Probleme, Grad der Kontrolle über die Knoten [d. H. Gibt es eine unerwartete externe Last usw.?]).

Die Implementierung eines adaptiven Job-Dispatchers erfordert normalerweise auch die Anpassung der Häufigkeit, mit der Sie die verfügbaren Ressourcen testen (andernfalls könnte der Overhead aufgrund von Sondierung die Leistungsgewinne übersteigen). Im Idealfall können Sie Benchmark-Tests verwenden, um ein empirisches (statistisches) Modell zu erstellen, mit dem Sie die Berechnungshärten eines bestimmten Problems vorhersagen können (erfordert gutes Domänenwissen und Problemmerkmale, die einen hohen Einfluss auf das Problem haben) Ausführungsgeschwindigkeit und sind einfach zu extrahieren), und ein anderer, um den Kommunikationsaufwand vorherzusagen. Die Verwendung beider in Kombination sollte es möglich machen, einen einfachen Dispatcher zu implementieren, der seine Entscheidungen auf den Vorhersagemodellen basiert und sie verbessert, indem er die tatsächlichen Ausführungszeiten als Rückmeldung/Belohnung berücksichtigt (z. B. über).