2014-01-15 3 views
1

내가 모두 XMS를 구성한SOLR는, 윈도우 OS는 모든 메모리를 내가 모니터링하려면 Visual VM을 엮은 한 다시 시작한 후

업데이트 (초기 메모리)과의 -Xmx (최대 메모리 할당 JVM의 paramters을 소비 톰캣 메모리 사용량. 색인 생성 프로세스가 실행되는 동안 Tomcat의 메모리 사용량은 정상적으로 보입니다. 메모리 소비량은 정의 된 jvm 매개 변수 범위 내에 있습니다. (이미지 참조)
파일 시스템 버퍼가 나머지 메모리를 모두 소비하고있는 것 같습니다. 메모리를 떨어 뜨리지 않습니까? nGram 크기 또는 directoryFactory 변경과 같은이 동작을 처리하는 방법이 있습니까?

(210)

나는 SOLR와 톰캣 꽤 새로운 해요,하지만 여기에 우리가 간다 :

OS Windows 서버 2008

  • 4 CPU
  • 8기가바이트 램

톰캣 서비스 버전 7.0 (64 비트)

  • 실행중인 Solr
  • 없음 옵션 JVM 매개 변수를 설정,하지만 SOLR의 설정 GUI

SOLR 버전 4.5.0을 통해.

  • 하나의 코어 인스턴스 (모두 질의 및 인덱싱)

스키마 구성 :

  • minGramSize = "2"maxGramSize = "20"
  • 대부분의 필드는 저장된 = "true"(필수)

Solr config :

  • ramBufferSizeMB : 100
  • maxIndexingThreads : 8
  • directoryFactory : MMapDirectory
  • 자동 커밋 : maxdocs 10000, maxtime 15000, opensearcher 거짓
  • 캐시 (기본값) :
    의 FilterCache INITIALSIZE : 512 크기 : 512 autowarm : 0
    queryresultcache initialsize : 512 크기 : 512 autowarm : 0
    documentcache initialsize : 512 크기 : 512 autowarm : 0

단일 Solr Core 인스턴스에 문서를 업데이트하고 삽입하기 위해 .Net 서비스 (Solr.Net 기반)를 사용하고 있습니다. Solr에게 보낸 문서의 크기는 에서 1KB에서 최대 8MB까지까지 다양합니다. 하나 또는 여러 개의 스레드를 사용하여 문서를 일괄 전송합니다. Solr 색인의 현재 크기는 약 15GB입니다.

인덱싱 서비스가 3 시간 반 동안 실행되어 Solr에 대한 모든 삽입 및 업데이트를 완료합니다. 인덱싱 프로세스가 실행 중일 때 Tomcat 프로세스 메모리 사용량은 계속 증가하여>7GB RAM까지 증가하며 24 시간 후에도 감소하지 않습니다. Solr Admin에서 Tomcat 또는 Reload Core를 다시 시작하면 메모리가 1GB로 줄어 듭니다. 메모리 누출?

Tomcat에서 Solr 프로세스의 최대 메모리 사용량을 구성 할 수 있습니까? 다른 대안이 있습니까? 모범 사례?

enter image description here

감사

+0

캐시의 설정을 게시 할 수 있습니까? 문제 일 수 있습니다. – Rowanto

답변

0

당신은 설치 JVM 메모리 바람둥이에 대한 설정을 할 수 있습니다. 필자는 보통 tomcat (catalina.bat/.sh 파일과 동일한 디렉토리)의 bin 디렉토리에있는 setenv.bat 파일을 사용하여이 작업을 수행합니다. 거기에

set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx512m" 
다음

있는 명확한 지시 :

사용자의 필요에 따라 다음과 같은 값을 조정

http://wiki.razuna.com/display/ecp/Adjusting+Memory+Settings+for+Tomcat 
0

처음에 당신이에서 사용할 수있는 최대 메모리를 제한의 -Xmx 매개 변수를 설정해야 수코양이. 그러나 SOLR의 경우 파일 시스템 버퍼를 처리하기 위해 JVM 외부의 많은 메모리를 사용한다는 것을 기억해야합니다. 이 경우 Tomcat에 사용 가능한 메모리의 50 % 이상을 사용하지 마십시오.

0

다음과 같은 설정이 있습니다. (훨씬 작은 문제 임에도 불구하고) ... 문서 크기는 1MB에서 30MB까지입니다. 2 CPU/2GB 시스템에서 Tomcat 프로세스를 실행하려면 1GB 미만으로 실행해야합니다.

실험을 마친 후에 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와 톰캣에 문제가 발생했습니다.

  • 조회에서 텍스트/콘텐츠 분야를 포함하지 마십시오
  • QueryResultCache 이외의

    1. 사용 안 함 모든 캐시만을 포함을 다음과 같이 잘 유지하는 것

      솔루션 또는 내가 지금까지 설정 한 것들/구성은 id

    2. 10보다 큰 행 크기를 사용하지 않고 강조 표시를 포함하지 마십시오.
    3. 강조 표시를 사용하는 경우 (가장 큰 원인) 쿼리에서 문서 식별자를 먼저 가져온 다음 id 필드가 포함 된 검색 조건과 강조 표시를 사용하여 쿼리를 다시 수행하십시오.

    마지막으로 메모리 문제입니다. 난 tomcat/java 메모리 hogging 문제를 해결하기 위해 (Java가 OS에 메모리를 다시주지 않기 때문에) 정교하지 못한 접근 방식을 구현해야했습니다.

    나는 디버그 권한으로 실행되는 메모리 관리자 서비스를 만들었고 windows API를 호출하여 톰캣 프로세스가 강제로 메모리를 해제하도록했다.나는 또한 호출이 들어올 때 일어나는 동안 바람둥이에 대한 액세스를 막기 위해 전역 뮤텍스 (mutex)를 가지고있다.

    놀랍게도이 접근법은 잘 작동하지만 Tomcat에 대한 액세스를 제어 할 수있는 옵션이 없다면 문제가되지 않는다.

    더 나은 솔루션/구성 변경 사항을 발견하면 알려주십시오.