Apache Ignite 2.7.0在GridFutureAdapter.get0()中花费了很多时间

时间:2019-05-07 17:22:06

标签: java caching ignite

我将Apache Ignite用于以下设置: 2个服务器组成一个群集,其中多个Ignite缓存以REPLICATED模式配置。还有10个Java进程作为客户端连接到Apache Ignite集群并从那些缓存中获取数据。

使用VisualVM对客户端JVM进行性能分析时,我看到客户端在下一行上花费了将近一半的时间

java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:178)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:141)
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter.get0(GridCacheAdapter.java:4723)
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:4697)
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:1415)
    at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.get(IgniteCacheProxyImpl.java:928)
    at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.get(GatewayProtectedCacheProxy.java:640)

我了解可能需要锁,以正确处理给定缓存中给定键的get()/ put()。但是在我的应用程序中,我首先将所有需要的参考数据加载到Ignite缓存中,然后客户端JVM仅从缓存中获取数据。这样的行为(在cache.get()期间在等待中花费大量时间)是否可以预期?有什么方法可以不加锁地调用cache.get(),因为在我的情况下,初始加载后缓存中将没有更新?

1 个答案:

答案 0 :(得分:1)

通常,这是可以预期的,因为您需要等待网络至少将高速缓存值传递到客户端节点。 REPLICATED缓存模式意味着每个服务器节点上都存在每个密钥,但是将其拉到客户端节点仍需要一些时间。