Amazon OpenSearch Service 클러스터의 JVM(Java 가상 머신) 메모리 압력이 높아 이를 줄이고 싶습니다.
간략한 설명
기본적으로 OpenSearch Service는 최대 32GiB의 JVM 힙에 대해 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 RAM 중 50%를 사용합니다. JVM 메모리 압력은 클러스터 노드에서 Java 힙의 비율을 지정합니다.
다음 시나리오는 높은 JVM 메모리 압력을 유발할 수 있습니다.
- 클러스터에 대한 요청 수 급증
- 쿼리의 집계, 와일드카드 및 광범위한 시간 범위
- 노드 간 샤드 할당이 불균형하거나 클러스터에 샤드가 너무 많음
- 필드 데이터 또는 인덱스 매핑 폭증
- 인바운드 로드를 관리할 수 없는 Amazon EC2 인스턴스 유형
해결 방법
데이터 패턴 모니터링
높은 JVM 메모리 압력 문제를 해결하려면 클러스터에 대한 트래픽을 줄이십시오.
다음 명령을 실행하여 클러스터에 대한 노드 수준 통계를 얻고 메모리 압력 또는 과도한 폐영역 회수가 발생하는 노드를 식별합니다.
GET _nodes/stats/jvm
잘못된 요청을 더 자세히 식별하려면 느린 로그를 활성화하십시오. 자세한 내용은 OpenSearch 웹 사이트의 샤드 느린 로그를 참조하십시오. JVM 메모리 압력이 90% 미만인지 확인합니다. 느린 쿼리에 대한 자세한 내용은 Elasticsearch 웹 사이트에서 고급 조정: 느린 Elasticsearch 쿼리 찾기 및 수정을 참조하십시오.
Amazon CloudWatch를 사용하여 시간 경과에 따른 JVM 메모리 사용량 및 폐영역 회수 동작을 모니터링할 수 있습니다. 클러스터가 불안정해지기 전에 이 정보를 사용하여 패턴을 감지하고 작업을 수행하십시오. 또한 높은 JVM 메모리 압력을 사전에 감지하고 해결하도록 CloudWatch 경보를 구성하십시오.
캐시 설정 확인
필드 데이터 캐시를 지우려면 다음 쿼리를 실행합니다.
POST /index_name/_cache/clear?fielddata=true
참고: 캐시를 지우면 진행 중인 쿼리가 중단될 수 있습니다.
JVM 회로 차단기를 초과했는데 메모리 사용량이 확인되지 않은 상태로 유지되면 JVM OutOfMemoryError가 발생합니다. 이 문제를 해결하려면 구성 요구 사항에 따라 상위 회로 차단기 필드 데이터 캐시 할당 또는 요청 회로 차단기 설정을 수정하십시오. 이러한 클러스터 수준 설정을 수정하는 방법에 대한 자세한 내용은 OpenSearch 웹 사이트의 클러스터 설정 API를 참조하십시오.
구성 최적화
다음 모범 사례를 사용하여 구성을 최적화합니다.
높은 JVM 메모리 압력 문제를 해결하는 방법에 대한 자세한 내용은 OpenSearch Service 노드가 충돌하는 이유는 무엇입니까?를 참조하십시오.
높은 JVM 메모리 압력의 영향 이해
다음 시나리오는 OpenSearch Service가 다양한 JVM 메모리 압력 비율을 관리하는 방법을 보여줍니다.
- JVM 메모리 압력이 75%에 도달하면 OpenSearch Service는 x86 인스턴스 유형에 대한 CMS(Concurrent Mark Sweep) 폐영역 회수기를 시작합니다. ARM 기반 Graviton 인스턴스 유형은 짧은 일시 중지 및 힙 조각 모음을 추가로 사용하는 Garbage-First(G1) 폐영역 회수기를 사용합니다.
참고: 폐영역 회수는 CPU를 많이 사용하는 프로세스입니다. 메모리 사용량이 계속 증가하면 ‘ClusterBlockException’, ‘JVM OutOfMemoryError’ 또는 기타 클러스터 성능 문제가 발생할 수 있습니다.
- JVM 메모리 압력이 30분 동안 92%를 초과하면 OpenSearch Service는 모든 쓰기 작업을 차단합니다.
- JVM 메모리 압력이 100%에 도달하면 OpenSearch Service가 종료되고 결국 ‘OutOfMemory (OOM)’ 오류 메시지로 인스턴스를 다시 시작합니다.
관련 정보
OpenSearch Service 문제 해결
OpenSearch Service 시작하기: 샤드는 몇 개나 필요합니까?