2016-10-26 2 views
0

Я столкнулся с поведением EntryProcessor, который казался мне немного странным.Пауза между каруселием EntryProcessor метод обработки вызовов

Прежде всего, что я делал.

Моя задача состоит в том, чтобы использовать EntryProcessor для заполнения кэш-B с данными другого кэша А.

Кэш может содержать от 100K до 1M записей. Таким образом, у меня не было выбора, кроме цикла, чтобы создать ключ кэша B из записи данных и запустить EntryProcessor на таком ключе, чтобы создать запись B-кеша.

Я обнаружил, что когда я запускаю такой цикл и строю B-кеш из A и многократно вызываю 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 logging и посмотреть на них – 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), не может быть обработано . Имея это в виду, это хорошая практика сделать вашу запись как можно быстрее.

+0

Нет чтения, я создаю новую запись на B в процессоре ввода, но данные от A до EP начать, поэтому я думаю, что это не первый случай. Но может быть и второй. Кстати, вы могли бы спросить меня, когда работает входной процессор, можно ли читать (не помещать, а получать) запись? Можно ли читать не эту запись, а запись из того же раздела? Благодарю. – andymur

Смежные вопросы