Elasticsearch는 자바로 구현되어 있어서 메모리가 부족하면 Out Of Memory가 언제든지 발생할 수 있다. 아래 로그는 bulk insert하면서 OOM이 발생한 부분이다. 



Caused by: java.lang.OutOfMemoryError: Java heap space

        at org.apache.lucene.index.FreqProxTermsWriterPerField$FreqProxPostingsArray.<init>(FreqProxTermsWriterPerField.java:214)

        at org.apache.lucene.index.FreqProxTermsWriterPerField$FreqProxPostingsArray.newInstance(FreqProxTermsWriterPerField.java:235)

        at org.apache.lucene.index.ParallelPostingsArray.grow(ParallelPostingsArray.java:48)

        at org.apache.lucene.index.TermsHashPerField$PostingsBytesStartArray.grow(TermsHashPerField.java:252)

        at org.apache.lucene.util.BytesRefHash.add(BytesRefHash.java:292)

        at org.apache.lucene.index.TermsHashPerField.add(TermsHashPerField.java:151)

        at org.apache.lucene.index.DefaultIndexingChain$PerField.invert(DefaultIndexingChain.java:663)

        at org.apache.lucene.index.DefaultIndexingChain.processField(DefaultIndexingChain.java:359)

        at org.apache.lucene.index.DefaultIndexingChain.processDocument(DefaultIndexingChain.java:318)

        at org.apache.lucene.index.DocumentsWriterPerThread.updateDocument(DocumentsWriterPerThread.java:241)

        at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:465)

        at org.apache.lucene.index.IndexWriter.updateDocument(IndexWriter.java:1526)

        at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1252)

        at org.elasticsearch.index.engine.internal.InternalEngine.innerCreateNoLock(InternalEngine.java:502)

        at org.elasticsearch.index.engine.internal.InternalEngine.innerCreate(InternalEngine.java:444)

        at org.elasti


그 이후에, cpu 튀고, 메모리가 부족한 현상으로 나타난다. 색인은 해야 하고 메모리는 부족하는 상황이라 재시작 외에는 해결할 방법이 없다. 그리고 색인 작업이 실패한 색인에서는 unassigned라 표시된다. 



이 문제를 해결하려면 색인 작업을 하기 전에 메모리 상태를 체크하는 것이 좋다. 이를 위해서는 헤드 플러그인 정보를 살펴보는 것이 좋다.  헤드 플러그인을 설치한 후, http://ip:9200/_plugin/head/ 에 접속하여 size가 얼마인지 확인하고 새 색인의 size를 미리 예상하고 색인 작업을 하는 것이 좋다.


헤드 플러그인에 접속해서 색인 이름 밑의 size가 있는데. 전체 크기를 의미한다. 만약 저장 방식을 memory로 했을 때는 모두 메모리로 올라오기 때문에 메모리 상황을 계속 체크해야 한다. 




Posted by '김용환'
,