2014-06-17 8 views
7

Aufgrund eines bekannten (behobenen) Fehlers in Hazelcast 2.5 haben wir entschieden, dass dies der nächste Upgrade-Kandidat für unser Projekt sein wird. Aber nachdem wir die letzte Version (3.2.2) fallen gelassen hatten, hatten wir eine schreckliche Leistung.Performance-Drop-Upgrade von Hazelcast 2.5 auf 3+

Die Art, wie wir Hazelcast verwenden:

  • Zwei Knoten
  • mehrere IMAP-Instanzen (ca. 7 Karten insgesamt)
  • Beide Knoten aktualisieren die Karten
  • Viele liest auf den Karten
  • in der Nähe von-Cache liest

zu beschleunigen aktiviert Mit Hazelcast 2.5 hatten wir eine großartige Leistung, wenn wir anstelle von map.values() eine Liste aller enthaltenen Schlüssel map.getAll(containedKeys) zur Verfügung stellten. Die Art und Weise, wie wir die enthaltenen Keys im Auge behalten, indem wir eine EntryListener zu der Map hinzufügen, die die enthaltenen Keys in einem gleichzeitigen Satz speichert. Dies wurde von einem Kollegen hinzugefügt und fühlt sich an wie ein Hack, funktioniert aber wie ein Zauber.

Wenn wir jetzt aktualisieren 3.2.2 Hazelcast sehen wir Probleme sofort mit java.io, zum Beispiel von AppDynamics im folgenden Ausschnitt aus:

com.hazelcast.map.proxy.MapProxyImpl:getAll:326 (method time = 0 ms, total time = 18938 ms) 
com.hazelcast.map.proxy.MapProxySupport:getAllObjectInternal:495 (method time = 0 ms, total time = 18938 ms) 
    com.hazelcast.map.MapService:toObject:852 (method time = 0 ms, total time = 18938 ms) 
    com.hazelcast.spi.impl.NodeEngineImpl:toObject:156 (method time = 0 ms, total time = 18938 ms) 
    com.hazelcast.nio.serialization.SerializationServiceImpl:toObject:221 (method time = 0 ms, total time = 18938 ms) 
    com.hazelcast.nio.serialization.StreamSerializerAdapter:read:59 (method time = 0 ms, total time = 18938 ms) 
     com.hazelcast.nio.serialization.DefaultSerializers$ObjectSerializer:read:185 (method time = 0 ms, total time = 18938 ms) 
     java.io.ObjectInputStream:readObject:370 (method time = 3398 ms, total time = 18938 ms) 
     java.io.ObjectInputStream:readObject:370 (method time = 15540 ms, total time = 15540 ms) 

Das ist etwas haben wir nicht in Hazelcast gesehen 2.5, aber habe in 3.2.2. Es schleift unsere Anwendung zu einem völligen Stillstand. Erneutes Ersetzen des JAR durch 2.5 (und Umbenennen von Eintrag zurück zu MapEntry) und nichts ist falsch.

Was könnte das verursachen? Vielleicht benutzt es den Nah-Cache nicht mehr?

+0

Gibt es eine Möglichkeit, schnell Ihre eigene Momentaufnahme zu bauen und es versuchen? Ich weiß, dass es einen Nearcache-Bug gab, aber ich bin mir nicht sicher, ob er auf diese Situation zutrifft. – noctarius

+0

Ich habe das bereits gepatcht: https://github.com/hazelcast/hazelcast/pull/2523 es hat die loadClass repariert, aber dieses readObject ist jetzt der Flaschenhals. Bitte zeig mir einen möglichen Patch/Richtung. –

+1

Nun Java-Standard-Serialisierung wird immer der Engpass sein. Wenn Sie hohe Geschwindigkeit wollen, verwenden Sie es nicht oder verwenden Sie j.i.Externalizable. – noctarius

Antwort