将2百万个对象放在5个节点的Hazelcast集群中 - 我们应该做什么优化

时间:2017-08-14 17:59:53

标签: hazelcast vert.x hazelcast-imap

我们有来自REST API的2百万个对象,每个API调用中有500个对象(总共750 MB数据)。

  • 当我们将这些对象放入Hazelcast缓存中时,它需要 10分钟 - CPU为5-6% - 这是有道理的,因为有200万个阻止n / w调用

    vertx.executeBlocking {
        for(2 million times) {
            hazelcast.put(mapName, key, value)
        }
    }
    
  • 当我们不使用vertx的“executeblocking”而是执行以下操作时,整个过程在 10-15秒内完成,但CPU达到80%。我正在使用Hazelcast mancenter,所以我可以看到所有2百万个对象在10-15秒内反映在缓存中。

    for(2 million times) {
        hazelcast.putAsync(mapName, key, value)
    }
    
  • 当我们使用 #putAll 时, CPU达到60%优于第二种方法。这种方法也在10秒内完成。

    for(2 million objects in chunks of 500) {
        hazelcast.putAll(mapName, collection-of-500-objects)
    }
    

你们推荐的任何优化?我想知道为什么Hazelcast如此飙升CPU。

仅供参考 - 将 vertx.executeBlocking 视为异步执行一段代码。我们使用Intel Xeon 8 Core CPU和12GB RAM。

2 个答案:

答案 0 :(得分:0)

看看IMap.putAll。它允许将数据放入块中。你说2mln除以500个对象一个块= 4k块

/**
 * {@inheritDoc}
 * <p>
 *      No atomicity guarantees are given. It could be that in case of failure
 *      some of the key/value-pairs get written, while others are not.
 * </p>
 * <p>
 *      <p><b>Warning:</b></p>
 *      If you have previously set a TTL for the key, the TTL remains unchanged and the entry will
 *      expire when the initial TTL has elapsed.
 * </p>
 */
void putAll(Map<? extends K, ? extends V> m);

答案 1 :(得分:0)

  

你们推荐的任何优化?

您可以尝试使用IMap.setAsync而不是IMap.putAsync,根据文档它应该更有效:

  

与put操作类似,只是set不返回旧值,这样效率更高。