Solr на Tomcat, ОС Windows потребляет всю память

Обновить

Я настроил как xms (начальная память), так и xmx (параметры jvm максимального распределения памяти, после перезапуска я подключил Visual VM для мониторинга использования памяти Tomcat. Пока процесс индексирования выполняется, использование памяти Tomcat кажется нормальным , потребление памяти находится в диапазоне определенных параметров jvm. (см. изображение)
Таким образом, кажется, что буферы файловой системы занимают всю оставшуюся память и не сбрасывают память? Есть ли способ справиться с этим поведением, например, изменить размер nGram или directoryFactory?


Я новичок в Solr и Tomcat, но начнем:

ОС Windows Server 2008

  • 4 ЦП
  • 8 ГБ ОЗУ

Tomcat Service версии 7.0 (64-разрядная)

  • Только запущенный Solr
  • Не заданы дополнительные параметры JVM, но настраивается Solr через графический интерфейс

Solr версии 4.5.0.

  • Один экземпляр Core (как для запросов, так и для индексации)

Конфигурация схемы:

  • minGramSize = "2" maxGramSize = "20"
  • большинство полей сохранено = "true" (обязательно)

Конфигурация Solr:

  • ramBufferSizeMB: 100
  • maxIndexingThreads: 8
  • directoryFactory: MMapDirectory
  • autocommit: maxdocs 10000, maxtime 15000, opensearcher false
  • cache (по умолчанию):
    filtercache initialsize: 512 size: 512 autowarm: 0
    queryresultcache initialsize: 512 size: 512 autowarm: 0
    documentcache initialsize: 512 size: 512 autowarm: 0

Мы используем .Net Service (на основе Solr.Net) для обновления и вставки документов в один экземпляр Solr Core. Размер документов, отправляемых в Solr, варьируется от 1 КБ до 8 МБ, мы отправляем документы пакетами, используя один или несколько потоков. Текущий размер индекса Solr составляет около 15 ГБ.

Служба индексации работает примерно 3-4 часа, чтобы завершить все вставки и обновления Solr. Пока выполняется процесс индексирования, использование памяти процессом Tomcat продолжает расти до> 7 ГБ ОЗУ и не уменьшается даже через 24 часа. После перезапуска Tomcat или перезагрузки ядра в Solr Admin объем памяти уменьшается до 1 на 2 ГБ. Утечка памяти?

Можно ли настроить максимальное использование памяти для процесса Solr на Tomcat? Есть ли другие альтернативы? Лучшие практики?

введите описание изображения здесь

Спасибо


person onetwothree    schedule 15.01.2014    source источник
comment
Можете выложить настройку для кеша, это может быть проблема.   -  person Rowanto    schedule 15.01.2014


Ответы (3)


Вы можете настроить параметры памяти JVM на tomcat. Обычно я делаю это с файлом setenv.bat в каталоге bin Tomcat (тот же каталог, что и файлы catalina.bat / .sh).

Отрегулируйте следующие значения в соответствии с вашими потребностями:

set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx512m"

Вот четкая инструкция по этому поводу:

http://wiki.razuna.com/display/ecp/Adjusting+Memory+Settings+for+Tomcat
person Arun    schedule 15.01.2014

Сначала вы должны установить параметр XMX, чтобы ограничить максимальный объем памяти, который может использовать Tomcat. Но в случае с SOLR вы должны помнить, что он использует много памяти вне JVM для обработки буферов файловой системы. Поэтому в этом случае никогда не используйте для Tomcat более 50% доступной памяти.

person Jakub Kubrynski    schedule 15.01.2014

У меня следующая настройка (хотя и гораздо меньшая проблема) ... 5000 документов, размеры документов варьируются от 1 МБ до 30 МБ. У нас есть требование, чтобы процесс Tomcat работал менее 1 ГБ в системе с 2 ЦП / 2 ГБ.

После небольших экспериментов я придумал эти настройки для JAVA.

-Xms448m
-Xmx768m
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:ParallelCMSThreads=4
-XX:PermSize=64m
-XX:MaxPermSize=64m
-XX:NewSize=384m
-XX:MaxNewSize=384m
-XX:TargetSurvivorRatio=90
-XX:SurvivorRatio=6
-XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=55
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+OptimizeStringConcat
-XX:+UseCompressedOops
-XX:MinHeapFreeRatio=5
-XX:MaxHeapFreeRatio=5

Это помогло, но я столкнулся с проблемами с OutOfMemory и Tomcat, использующими слишком много памяти даже с таким маленьким набором данных.

Решение Или вещи / конфигурация, которые я установил до сих пор, которые, похоже, хорошо держатся, следующие:

  1. Отключить все кеши, кроме QueryResultCache
  2. Не включайте поля текста / содержимого в свой запрос, включайте только идентификатор
  3. Не используйте размер строки больше 10 и не включайте выделение.
  4. Если вы используете выделение (это самая большая проблема), сначала получите идентификаторы документов из запроса, а затем выполните запрос еще раз с выделением и условиями поиска с включенным полем идентификатора.

Наконец, о проблеме с памятью. Мне пришлось неохотно реализовать неортодоксальный подход для решения проблемы с перегрузкой памяти tomcat / java (поскольку java никогда не возвращает память ОС).

Я создал службу регулятора памяти, которая работает с привилегией отладки и вызывает API Windows, чтобы заставить процесс tomcat освободить память. У меня также есть глобальный мьютекс для предотвращения доступа к tomcat, когда это происходит при поступлении вызова.

Удивительно, но этот подход работает хорошо, но не без риска, если у вас нет возможности контролировать доступ к Tomcat.

Если вы найдете лучшее решение / изменения конфигурации, сообщите нам об этом.

person mms    schedule 07.03.2014