Я бег TomEE (вида Tomcat) сервер на Java 8 и используя Titan 1.0.0 с Кассандрой бэкэндом и индексом Elasticsearch в моей базе данных. В моей среде разработки с небольшим пользовательским подключением все работает отлично, но на моем рабочем сервере со многими пользователями, связанными с большим доступом к db, у нас есть проблема с утечками памяти, вероятно, из-за того, что кеш-диаграмма Titan или что-то подобное Titan. У меня есть размер кучи размером 4 ГБ, и после более чем 10 часов работы выделенная память на куче растет до максимума (~ 300 Мбит/ч в час), и это приводит к тому, что GC (Garbage Collector) больше не может очищать и остается работать непрерывно, что заставляет экземпляр сервера быть неактуальным. Использование VisualVM я сделал некоторые профилирование памяти и те мои скриншоты:
Любой подсказывают, как можно это исправить или найти способ, чтобы исследовать этот вопрос более подробно? Может быть, некоторые GC-параметры могут помочь нам в этом случае?Titan 1.0.0 график кэш-память просачивается
ответ
Я видел эти проблемы раньше на Titan 1.0 с Cassandra. Две вещи, чтобы проверить:
Открытие и закрытие Graph
вы открываете другую транзакцию на графике для каждого пользователя или различных графиков для каждого пользователя? т.е. вы делаете:
(1)
//User 1 Logs in
graph = TitanFactory.open(config);
soStuffWithGraph(graph);
//User 2 Logs in
graph = TitanFactory.open(config);
soStuffWithGraph(graph);
или
(2)
graph = TitanFactory.open(config);
//User 1 Logs in
soStuffWithGraph(graph);
//User 2 Logs in
soStuffWithGraph(graph);
подхода (1) означает, что каждый пользователь получает свое собственное подключение к графике с их собственный объект графа. Это очень тяжело и приводит к большему использованию памяти.
Подход (2) означает, что каждый пользователь использует одно и то же соединение, но разные транзакции. Это, на мой взгляд, предпочтительнее. Примечание: предполагается, что пользователи находятся на разных потоках.
Долгосрочные Сделки
Это проблема, которую я имел в результате которой в подобных проблем ГЦ к себе. Я слишком долго держал транзакции живыми. Чтобы ускорить запрос Titan, кэш много, и я не думаю, что он очищает кеш, если транзакция не закрыта. Поэтому в идеале у вас должно быть что-то вроде:
graph = TitanFactory.open(config);
//User 1 Logs in
soStuffWithGraph(graph);
graph.tx().close();
//User 2 Logs in
soStuffWithGraph(graph);
graph.tx().close();
где каждая транзакция закрыта после того, как пользователь с ней выполнен.
- 1. Titan 1.0.0 to Datastax Enterprise Migration
- 2. График Titan DB для JSON
- 3. Загрузить график Titan с Gremlin
- 4. Как обработать большой график Titan, используя Spark
- 5. FileNotFoundException с Titan (titan-all)
- 6. Titan ConcurrentModificationException
- 7. Как добавить свойства для TitanVertext в titan graph 1.0.0
- 8. Работает ли Titan-1.0.0-hadoop1 с ключевыми линиями
- 9. История команд Gremlin не работает в titan 1.0.0
- 10. Почему функция фильтра не работает с Titan 1.0.0
- 11. gremlin от titan 1.0.0 не работает из окна на окнах
- 12. Titan DB 1.0.0: Не удается импортировать Json-файл в titan TinkerPop 3.x
- 13. VALGRIND C++ просачивается
- 14. IOS: объект CF просачивается
- 15. Создать \ Добавить график сервера Titan, используя по умолчанию rexster
- 16. Titan graph leaf nodes
- 17. Как использовать TitanCleanup в 1.0.0?
- 18. Titan Cassandra Многопотоковые транзакции Блокировка
- 19. Неразрешенные ссылки, устанавливающие Titan
- 20. Thinkaurelius Titan настройки BerkeleyDB
- 21. Titan: есть() не работает
- 22. GraphML inport in Titan
- 23. Агрегаты Titan DB
- 24. Titan Retrieving Vertex Properties
- 25. Ошибка соединения в удаленном режиме Titan-1.0.0 + Hbase-0.98.20 с использованием java
- 26. Как получить свойства вершин или ребер элементов в Titan DB версии 1.0.0
- 27. install-gremlin-server.sh создает titan-1.0.0-hadoop1.zip, который нельзя распаковать
- 28. Невозможно изменить индекс reindex titan 1.0.0 после добавления к нему существующего свойства
- 29. Как загрузить миллионы вершин из CSV в Titan 1.0.0 с помощью Bulkloadervertextprogram?
- 30. Узел Titan не подходит
Я использую второй подход. У меня есть одно открытое соединение с графиком и открытие новой транзакции «TitanTransaction tt = graph.newTransaction()» для каждого пользовательского запроса. Каждая транзакция короткая (добавляет или обновляет одну или две вершины или ребра ИЛИ данные запроса из вершин), а в конце транзакции всегда передается 'tt.commit()' или roll-backed 'tt.rollback()' в случае отказа (перед выбросом некоторого исключения) – OctopusSD
Используете ли вы 'graph.newTransaction()', тогда вы создаете [многопоточные транзакции] (http://s3.thinkaurelius.com/docs/titan/1.0.0/tx.html# multi-thread-tx), который создает целый новый объект обработки транзакций, который также довольно тяжелый и всегда открыт.Если вы * явно * создаете один для каждого пользователя, тогда вам обязательно нужно называть 'tt.close()' в конце. В противном случае он останется открытым. –
Из Титана [документация] (http://s3.thinkaurelius.com/docs/titan/1.0.0/index.html) и [javadoc] (http://titan.thinkaurelius.com/javadoc/1.0.0/) Я думал, что 'tt.commit()' и 'tt.rollback()' закроют транзакцию, но после добавления 'tt.close()' рядом с каждым фиксацией и откатом он решает наши утечки памяти. – OctopusSD