A causa di un bug noto (corretto) in Hazelcast 2.5, abbiamo deciso che questo sarebbe stato il prossimo aggiornamento per il nostro progetto. Ma dopo aver lasciato l'ultima versione (3.2.2) abbiamo avuto prestazioni orribili.Aggiornamento delle prestazioni da Hazelcast 2.5 a 3+
Il modo in cui stiamo usando Hazelcast:
- Due nodi
- istanze IMAP multiple (circa 7 mappe in totale)
- entrambi i nodi aggiornare le mappe
- Un sacco di legge sulle mappe
- quasi cache abilitata per velocizzare legge
Usando Hazelcast 2.5 abbiamo avuto grandi prestazioni quando, invece di usare map.values()
, abbiamo fornito un elenco di tutte le chiavi contenute map.getAll(containedKeys)
. Il modo in cui teniamo traccia delle chiavi contenute aggiungendo un EntryListener
alla mappa che memorizza le chiavi contenute in un set concorrente. Questo è stato aggiunto da un collega e si sente come un hack, ma funziona come un fascino.
Ora, quando l'aggiornamento a 3.2.2 Hazelcast abbiamo immediatamente vedere i problemi con java.io
, per esempio guarda il seguente frammento da AppDynamics:
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)
Questo è qualcosa che non abbiamo visto in Hazelcast 2.5, ma avere in 3.2.2. Mette a dura prova la nostra applicazione. Sostituendo nuovamente il barattolo con 2.5 (e rinominando la voce in MapEntry) e nulla è sbagliato.
Cosa potrebbe causare questo? Forse non sta più usando il vicino-cache?
C'è la possibilità di costruire rapidamente il proprio snapshot e provarlo? So che c'era un bug nearcache ma non sono sicuro se si applica a questa situazione. – noctarius
Ho già applicato una patch a questo: https://github.com/hazelcast/hazelcast/pull/2523 ha corretto il loadClass ma questo readObject è ora il collo di bottiglia. Per favore indicami una possibile patch/direzione. –
Bene la serializzazione standard di Java sarà sempre il collo di bottiglia. Se si desidera una velocità elevata, non usarla o almeno usare j.i.Externalizable. – noctarius