Gridgain-Anwendung, die auf einer Maschine langsamer als eine Multi-Thread-Anwendung ist

StackOverflow https://stackoverflow.com/questions/4481645

  •  11-10-2019
  •  | 
  •  

Frage

Ich habe meine erste Gridgain-Anwendung implementiert und bin nicht die Performance-Verbesserungen immer ich erwartet hatte. Leider ist es langsamer. Ich würde etwas Hilfe meine Implementierung zu verbessern, damit es schneller sein kann.

Der Kern meiner Anwendung, die ich mit Millionen von möglichen Parametern eine Brute-Force-Optimierung tue, das für jede Funktion Auswertung einen Bruchteil einer Sekunde. Ich habe dies umgesetzt, indem die Millionen von Iterationen in einigen Gruppen aufzuteilen und jede Gruppe wird als ein Auftrag ausgeführt wird.

Das entsprechende Stück Code ist unten. die Funktion maxAppliedRange ruft Funktion foo für jeden Wert im Bereich von x und kehrt das Maximum, und das Ergebnis wird das Maximum aller den Maxima von jedem Job gefunden.

  scalar {
    result = grid !*~
      (for (x <- (1 to threads).map(i => ((i - 1) * iterations / threads, i * iterations / threads)))
        yield () => maxAppliedRange(x, foo), (s: Seq[(Double, Long)]) => s.max)
  }

Mein Code wählt zwischen einer Multi-Threaded-Ausführung auf einer Maschine oder mehrere Knoten Gridgain verwenden Sie den Code oben. Wenn ich die Gridgain Version führen Sie es beginnt, wie es schneller sein wird, aber dann immer ein paar Dinge passieren:

  • Einer der Knoten (auf einer anderen Maschine) vermisst einen Herzschlag, den Knoten auf meinem Haupt-Computer veranlasst, auf diesem Knoten aufgeben und beginnen den Job ein zweites Mal ausgeführt wird.
  • Der Knoten, der einen Herzschlag verpasst weiterhin die gleiche Arbeit tun. Jetzt habe ich zwei Knoten das gleiche tun.
  • Schließlich alle Jobs auf meiner Haupt-Maschine ausgeführt werden, aber da einige der Arbeitsplätze später begannen, dauert es viel länger für alles zu Ende.
  • Manchmal ist eine Ausnahme von Gridgain geworfen wird, weil ein Knoten abgelaufen und die ganze Aufgabe versagt wird.
  • Ich ärgere.

Ich habe versucht, ihre Einrichtung viele Arbeitsplätze zu haben, also wenn man versagt, dann wäre es nicht so große Sache, aber wenn ich das mache ich am Ende mit vielen Arbeitsplätzen auf jedem Knoten ausgeführt werden. Das bringt eine viel größere Belastung für jede Maschine es wahrscheinlicher, für einen Knoten macht einen Herzschlag zu verpassen, alles was bergab schneller zu gehen. Wenn ich einen Job pro CPU habe dann, wenn ein Auftrag fehlschlägt, hat ein anderer Knoten von Anfang an zu beginnen. So oder so ich nicht gewinnen kann.

Was ich denke, würde am besten funktionieren, wenn ich zwei Dinge tun könnte:

  • Erhöhen Sie den Timeout für Herzschläge
  • Drosselklappen jeden Knoten, so dass es nur, dass ein Job auf einmal.

Wenn ich dies tun könnte, könnte ich meine Aufgabe in viele Arbeitsplätze aufzuteilen. Jeder Knoten würde zu einer Zeit, einen Job und keine Maschine würde überfrachtet werden, um es zu einem Herzschlag zu verpassen. Wenn ein Auftrag fehlgeschlagen ist dann wenig Arbeit verloren gehen würde und Erholung würde schnell sein.

Kann jemand mir sagen, wie dies zu tun? Was soll ich hier?

tun
War es hilfreich?

Lösung 2

Jetzt habe ich es richtig funktioniert. In meiner Situation für meine Bewerbung erhalte ich ein 50% ige Speed-up über eine Multithread-Anwendung auf einer Maschine, aber das ist nicht das Beste, was ich tun kann. Mehr Arbeit ist getan werden.

So verwenden Gridgain, so scheint es, dass die Konfigurationsdatei immer alles Arbeits kritisch ist. Dies ist, wo Knoten Verhalten gesetzt und müssen die Notwendigkeiten der Anwendung entsprechen.

Eine Sache, die ich in meinem XML-Konfigurationsdatei benötigt, ist dies:

    <property name="discoverySpi">
        <bean class="org.gridgain.grid.spi.discovery.multicast.GridMulticastDiscoverySpi">
            <property name="maxMissedHeartbeats" value="20"/>
            <property name="leaveAttempts" value="10"/>
        </bean>
    </property>

Damit wird die maximale Herzschläge, die verpasst werden kann, bevor ein Knoten fehlt betrachtet. Ich habe dies auf einen hohen Wert, weil ich ein Problem der Knoten gehalten, die verlassen und kommt ein paar Sekunden später zurück. Alternativ kann anstelle der Verwendung von Sammels ich mit fliessendem Knoten mit anderen Eigenschaften in der in der Konfigurationsdatei, die IP-Adressen der Maschinen festgelegt haben könnte. Ich habe das nicht tun, aber wenn Sie die gleichen Maschinen über verwenden und darüber wahrscheinlich zuverlässiger wäre.

Das andere, was ich habe ist:

    <property name="collisionSpi">
        <bean class="org.gridgain.grid.spi.collision.jobstealing.GridJobStealingCollisionSpi">
            <property name="activeJobsThreshold" value="2"/>
            <property name="waitJobsThreshold" value="4"/>
            <property name="maximumStealingAttempts" value="10"/>
            <property name="stealingEnabled" value="true"/>
            <property name="messageExpireTime" value="1000"/>
        </bean>
    </property>

    <property name="failoverSpi">
        <bean class="org.gridgain.grid.spi.failover.jobstealing.GridJobStealingFailoverSpi">
            <property name="maximumFailoverAttempts" value="10"/>
        </bean>
    </property>

Für die ersten, der activeJobsThreshold Wert teilt den Knoten, wie viele Arbeitsplätze es gleichzeitig ausgeführt werden kann. Dies ist eine bessere Art und Weise Drosselung des Tuns der Anzahl der Threads in dem Testamentsvollstrecker Dienst als zu ändern. Auch es hat einigen Lastausgleich und Leerlauf-Knoten kann ‚stehlen‘ Arbeit von anderen Knoten alles getan, schneller zu bekommen.

Es gibt bessere Möglichkeiten, dies auch zu tun. Gridgain können die Arbeitsplätze tun Größe auf Basis der gemessenen Leistung jedes Knotens, offenbar, die Gesamtleistung verbessern würde, vor allem, wenn Sie schnellen und langsamen Rechnern im Netz haben.

Für die Zukunft werde ich die Konfigurationsdatei studieren und zu vergleichen, das zu den javadocs alle über all die verschiedenen Möglichkeiten zu lernen, diese noch schneller laufen zu bekommen.

Andere Tipps

ich es herausgefunden.

Erstens gibt es eine XML-Konfigurationsdatei, die steuert die Einzelheiten, wie die Netzknoten arbeiten. Die Standardkonfigurationsdatei ist in GRIDGAIN_HOME / config / default-spring.xml. Ich konnte entweder bearbeiten oder kopieren Sie sie und übergeben Sie die neue Datei ggstart.sh, wenn ich die Netzknoten starten. Die beiden Dinge, die ich benötigt hinzuzufügen sind:

    <property name="networkTimeout" value="25000"/>

, die das Timeout für Netzwerknachricht auf 25 Sekunden einstellen, und

   <property name="executorService">
        <bean class="org.gridgain.grid.thread.GridThreadPoolExecutor">
            <constructor-arg type="int" value="1"/>
            <constructor-arg type="int" value="1"/>
            <constructor-arg type="long">
                <util:constant static-field="java.lang.Long.MAX_VALUE"/>
            </constructor-arg>
            <constructor-arg type="java.util.concurrent.BlockingQueue">
                <bean class="java.util.concurrent.LinkedBlockingQueue"/>
            </constructor-arg>
        </bean>
    </property>

Die ersten beiden Konstruktorargumente sind für 1 Thread zu starten und eine max Gewindegröße von 1. Die Vollstrecker Dienst steuert den Threadpool, der die Gridgain Jobs ausführt. Der Standardwert ist 100, weshalb meine Anwendung überwältigt wurde und die Herzschläge Zeitüberschreitung wurden.

Die andere Änderung musste ich meinen Code machen ist:

  scalar.apply("/path/to/gridgain home/config/custom-spring.xml") {
    result = grid !*~
      (for (x <- (1 to threads).map(i => ((i - 1) * iterations / threads, i * iterations / threads)))
        yield () => maxAppliedRange(x, kalmanBruteForceObj.performKalmanIteration), (s: Seq[(Double, Long)]) => s.max)
  }

Denn ohne die .apply Anweisung es beginnt einen Gitterknoten mit allen Standardoptionen, nicht die Konfigurationsdatei mit den oben genannten Änderungen, das ist, was ich will.

Jetzt funktioniert es genau so, wie ich brauche es. Ich kann die Aufgabe in kleine Stücke teilen und sogar meine schwächste und langsamste Computer, einen Beitrag zu diesen Bemühungen leisten kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top