2016-10-26 100 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