2016-10-26 101 views
0

我面对这似乎有点奇怪,我EntryProcessor的行为。暂停通话

,首先我在做什么。

我的任务就是用EntryProcessor从另一个缓存A.

缓存A可以包含从100K到1M条目的数据填充高速缓存B。所以我没有选择,只能循环通过它从A数据项创建B缓存键,然后在此类键上运行EntryProcessor以创建B缓存项。

我发现,当我运行这样的循环,并从构建乙缓存和呼叫EntryProcessor多次(数量等于条目数在高速缓存A)不时整体工期的变化。

所以我已经开始写日志的过程中的每一步。有时对多个条目执行之间的暂停输入处理器运行,看日志

16:47:17.773 ce23b7a [thread-7] AppendingProcessor process process; enter 
16:47:17.773 7d9a120 [thread-7] AppendingProcessor process process; exit 

Pause between two threads (invocation on different keys) is about 10ms (which could give us 100s on 100k keys!) 

16:47:17.782 ce23b7a [thread-0] AppendingProcessor process process; enter 
16:47:17.782 7d9a120 [thread-0] AppendingProcessor process process; exit 

有时候,我们可能会看到另一个行为,没有任何停顿或在不同项目执行之间的非常小的停顿。

14:38:42.685 ce23b7a [thread-0] AppendingProcessor process - process; enter 
14:38:42.685 7d9a120 [thread-0] AppendingProcessor process - process; exit 

14:38:42.686 ce23b7a [thread-1] AppendingProcessor process - process; enter 
14:38:42.686 7d9a120 [thread-1] AppendingProcessor process - process; exit 

14:38:42.686 ce23b7a [thread-6] AppendingProcessor process - process; enter 
14:38:42.686 7d9a120 [thread-6] AppendingProcessor process - process; exit 

我认为这可能与分区,所以它可能与我是多么的分区有和entryprocessor能否与来自同一个分区或没有项目,但现在我不认为是这样。

有时候,当我运行它适用于许多条目,没有停顿的代码,然后暂停(通常为10毫秒),然后再在所有

2016-10-25 18:23:34.486 [thread-2] AppendingProcessor - process.exit; partId = 114 
.... 
about 500 entries processed in 1 ms 
... 
2016-10-25 18:23:34.486 [thread-3] AppendingProcessor - process.exit; partId = 115 
.... 
about 250 entries processed in 1 ms 
... 
2016-10-25 18:23:34.487 [thread-3] AppendingProcessor - process.exit; partId = 115 

没有暂停工作,我的问题是,这可能是原因EntryProcessor中的处理条目之间的暂停,特别是如果每​​两次调用过程方法之间出现暂停。

例如10毫秒似乎会引起暂停不正确的,可能是什么情况?

由于NDA,我无法提供代码的实例,但我编写了一个代码示例,请参见AddressMapBean#process方法 和适当的AddressBookProcessor入口处理器。

任何帮助,将不胜感激!

+0

任何想法你的客户端应用程序以及服务器上的GC加载看起来像什么?听起来很像我的GC问题。 – noctarius

+0

@noctarius谢谢你的回复,我正在考虑这个问题,也会试着打开gc日志记录并查看它们 – andymur

回答

3

你从A阅读并投入B中的处理器里面?如果是这样,则存在死锁的风险。请参阅: https://groups.google.com/forum/#!topic/hazelcast/27_6iS4oaSY 还看到: https://github.com/hazelcast/hazelcast/issues/3146

另一个(也许)可能的原因可能是线程争。从文档:

注意:入口处理器通过专用于 特定分区的操作线程运行。因此,如果长时间运行Entry Processor 执行,则其他分区操作(如map.put(key)不能被 处理。考虑到这一点,最好尽快让您的Entry 处理器执行。

+0

没有阅读,我在入口处理器中创建了B上的新条目,但是A的数据在其之前开始,所以我认为这不是第一种情况。但可能是第二个。顺便提一下,当入口处理器工作时,是否可以读取(不能放入,但是获得)入口?是否可以读取不是此条目,而是从同一分区中输入?谢谢。 – andymur