ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 엘라스틱검색 에러 - java.lang.OutOfMemoryError: Java heap space
    프로그래밍/검색 2015. 6. 27. 17:45
    반응형



    참고: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/heap-sizing.html

     



    엘라스틱서치를 사용하면서 가장 많이 보는 에러중에 하나가 Java heap space 에러이다.

    아래는 로그 파일에서 확인할 수 있는 Java heap space 에러 메세지이다. 


     

    [Eel] Caught exception while handling client http traffic, closing connection 
      2 java.lang.OutOfMemoryError: Java heap space
      3     at org.elasticsearch.common.netty.buffer.HeapChannelBuffer.<init>(HeapChannelBuffer.java:42)
      4     at org.elasticsearch.common.netty.buffer.BigEndianHeapChannelBuffer.<init>(BigEndianHeapChannelBuffer.java:34)
      5     at org.elasticsearch.common.netty.buffer.ChannelBuffers.buffer(ChannelBuffers.java:134)
      6     at org.elasticsearch.common.netty.buffer.HeapChannelBufferFactory.getBuffer(HeapChannelBufferFactory.java:68)
      7     at org.elasticsearch.common.netty.buffer.CompositeChannelBuffer.copy(CompositeChannelBuffer.java:568)
      8     at org.elasticsearch.common.netty.buffer.AbstractChannelBuffer.copy(AbstractChannelBuffer.java:523)
      9     at org.elasticsearch.common.netty.handler.codec.http.HttpChunkAggregator.appendToCumulation(HttpChunkAggregator.java:208)
     10     at org.elasticsearch.common.netty.handler.codec.http.HttpChunkAggregator.messageReceived(HttpChunkAggregator.java:175)
     11     at org.elasticsearch.common.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
     12     at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
     13     at org.elasticsearch.common.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
     14    

     


    위와같은 에러가 발생하면 엘라스틱검색이 사용하고 있는 메모리 사이즈를 확인한다. 

     

     

    # ps afx | grep elastic
    18177 pts/0    S+     0:00                      \_ grep elastic
    19926 ?        Sl    90:40 /usr/lib/jvm/jdk1.7.0_45/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly XX:+HeapDumpOnOutOfMemoryError -Delasticsearch




    기본 설정이었던 최대 메모리가 1기가로 설정되어 있어 

    메모리가 작아 에러가 생긴 것이다. 


      top을 쳐서 가용 메모리를 확인한다.


     

    top - 17:51:15 up 129 days,  8:41,  1 user,  load average: 0.18, 0.07, 0.02
    Tasks: 186 total,   1 running, 185 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.3%us,  0.1%sy,  0.0%ni, 97.1%id,  0.1%wa,  0.0%hi,  2.4%si,  0.0%st
    Mem:   2058540k total,  1931404k used,   127136k free,   126036k buffers
    Swap:  1048568k total,   262252k used,   786316k free,   569492k cached

     


    보통 가용 메모리의 반을 엘라스틱검색에 설정하는데 

    지금 사용하는 리눅스 가상서버의 전체 가용 메모리가 2기가밖에 되지 않아 

    더이상 메모리를 늘려도 조금 더 사용하면 또 메모리 에러날 것 같다. 


    그냥 윈도우 서버에 다시 깔아서 해야할 듯 ㅠㅠ



     참고로  메모리 설정 방법 변경 방법은 간단하다. 

    아래와 같이 시작 스트립트를 하나 만들어서 ES_HEAP_SIZE 환경 변수를 설정하고 

    엘라스틱서치를 시작하면 된다.  

     

     

     

    #!/bin/bash

    export ES_HEAP_SIZE=4g
    ./elasticsearch -Des.max-open-files=true -d

     







     


     

    728x90
    반응형
Designed by Tistory.