Neo4J с небольшим графиком использует много памяти на Ubuntu 16.04
Я установил Neo4J v3.3.0 (версия для сообщества) на виртуальную машину Ubuntu 16.04 (Hyper-V) с 8 ГБ и 4 ядрами.
У меня очень маленький график (30 узлов), и он используется только для чтения (примерно 1 попадание каждые 3 секунды), на него редко записывают. Мы хотим расширить график намного больше, но каждые три дня (иногда меньше) происходит сбой нашего сервера, потому что Java занимает более 2 ГБ, а верхняя часть показывает 300% загрузки ЦП.
Для меня это не имеет никакого смысла, не могли бы вы дать мне знать, как настроить Java или Neo4J, чтобы предотвратить это?
Спасибо
У меня есть следующая конфигурация в моем /etc/neo4j/neo4j.conf
файл:
dbms.query_cache_size=5000
dbms.threads.worker_count=4
dbms.memory.heap.initial_size=2g
dbms.memory.heap.max_size=2g
dbms.memory.pagecache.size=2g
Файлы журналов показывают следующую ошибку, когда это происходит:
ERROR [o.n.b.v.r.c.RunnableBoltWorker] Worker for session 'ecfe4a7f-1714-4ba3-9e98-a692bf153b45' crashed. Java heap space java.lang.OutOfMemoryError: Java heap space
Есть также эти подозрительные сообщения (которых много):
WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 4680ms.
ERROR [o.n.b.v.t.BoltMessagingProtocolV1Handler] Failed to write response to driver Unable to write to the closed output channel org.neo4j.bolt.v1.packstream.PackOutputClosedException: Unable to write to the closed output channel
WARN [io.netty.channel.DefaultChannelPipeline] An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. syscall:read(..) failed: Connection reset by peer
Новая информация
Я сделал:
netstat -an | grep ESTABLISHED
У меня было много открытых связей. Мы используем следующий драйвер javascript в nodeJS ( https://github.com/neo4j/neo4j-javascript-driver). Проверим, правильно ли мы проверяем соединения.
Кажется, я правильно закрываю все соединения с:
session.close();
driver.close();
Соединения остаются открытыми, пока я не выйду из приложения.
Заключительные комментарии
В моем коде было место, где я не закрывал соединения.
1 ответ
Могу сказать, что Neo4j прекрасно работает для меня на 8 ГБ ОЗУ с 10 млн. Узлов и 30 млн. Отношений без специальной настройки.
top показывает использование процессора на 300%, вероятно, после завершения сборки мусора. Поэтому я голосую за увеличение размера кучи
/etc/neo4j/neo4j.conf
параметр
dbms.memory.heap.max_size=3g
На больших базах данных высокая загрузка ЦП означает отсутствие индексов.
Чтобы перечислить индексы:
CALL db.indexes();
создать один:
CREATE INDEX ON :Label(prop_name);
Если вы получаете ошибки OOM (см. Dmesg) и java убивает linux (не вылетает), попробуйте установить серверную ОС, например, CentOS без GUI и т. Д., Чтобы освободить часть памяти. 8 ГБ более чем достаточно для Neo4j с базой данных размером 8-10 ГБ.