Исключение JanusGraph OOM с вершиной высокой степени - PullRequest
0 голосов
/ 20 февраля 2019

Это вопрос, касающийся проблемы java.lang.OutOfMemoryError: GC overhead limit exceeded, наблюдаемой при выполнении операций с JanusGraph.

Настройка

Я использую версию JanusGraph 0.2.0 с Cassandra в качестве основного хранилища.Я использую значения конфигурации по умолчанию, как описано здесь , за исключением конфигурации, описывающей мой сервер хранения как cql и хост хранения.

Я вставляю большой список пользователей в график- у каждого есть (1) электронная почта, (2) идентификатор пользователя и (3) ассоциированная метка группировки.Для этого сценария все пользователи находятся в одной группе, которую мы назовем groupA.Вставки выполняются последовательно, каждая выполняется сразу после завершения предыдущего.

Во время каждой операции вставки я создаю одну вершину, представляющую электронное письмо, одну вершину, представляющую идентификатор пользователя, затем создаю или обновляю вершину, представляющую groupA,Я создаю ребро между (1) версией userID <-> userID и ребром (2) userID <-> groupA вершина.

Наблюдаемая проблема

Я использовалпрофилировщик для наблюдения за использованием пространства кучи во время процесса.Вначале вставки выполнялись без проблем, но по мере увеличения количества вставок занимаемое пространство кучи увеличивалось.В конце концов, когда использовалось больше памяти, я достиг исключения «Недостаточно памяти» после нескольких часов работы.

-

Затем я повторил вставку второй раз, но на этот раз я не сделал этого.включите вершину groupA.На этот раз использование памяти показало стандартный пилообразный паттерн с течением времени, как показано ниже.

Heap Usage with Group Vertex Removed from Insertions

Это приводит меня к выводу, что проблемы с нехваткой памятинаблюдаемые были из-за операций с этой вершиной groupA высокой степени.

Потенциальные потенциальные возможности

В настоящее время я подозреваю, что в JanusGraph существует некоторый процесс кэширования, в котором хранятся недавно открытые элементы.Так как список смежности вершины группы высокой степени велик, то может кэшироваться большой объем данных, который увеличивается только по мере того, как я создаю все больше ребер из вершины группы в вершины идентификатора пользователя.

Использование моегоПрофилировщик, я заметил, что класс org.janusgraph.graphdb.relations.RelationCache использовал относительно высокое использование памяти, поэтому это кажется уместным.

Мой вопрос

Мой вопрос: в чем причина этого?со временем JanusGraph все больше использует память?

1 Ответ

0 голосов
/ 20 августа 2019

Рассмотрим частые коммиты.Когда вы вставляете данные, они хранятся в кеше транзакции, пока транзакция не будет зафиксирована.Также взгляните на вашу конфигурацию для кеша БД.Вы найдете больше информации о кеше здесь .

...