Couchbase에서 쿼리 서비스의 메모리 관리는 특히 서비스가 동시에 처리하는 쿼리의 수가 증가함에 따라 서비스의 효율성과 응답성을 유지하는 데 핵심적인 역할을 합니다. 적절한 메모리 관리가 이루어지지 않으면 욕심 많은 쿼리가 메모리를 독차지하고 여러 동시 쿼리의 메모리 사용량이 합쳐져 서비스가 과부하되어 성능이 저하되는 등 상황이 잘못될 수 있습니다.
다행히도 쿼리 서비스에는 사용자가 쿼리의 메모리 사용량과 서비스 전반을 관리할 수 있는 몇 가지 기능이 있습니다.
이 블로그에서는 이러한 기능에 대해 자세히 살펴봅니다:
-
- 요청당 메모리 할당량
- 소프트 메모리 제한
- 노드 전체 문서 메모리 할당량
요청당 메모리 할당량
쿼리 서비스 메모리 사용량의 상당 부분은 문서나 계산된 값을 포함하는 일시적 값에서 비롯됩니다. 이러한 일시적 값에 사용되는 메모리는 다음과 같이 참조됩니다. 문서 메모리 블로그에서 확인하세요.
쿼리 서비스는 데이터 서비스에서 인코딩된 바이트 스트림으로 문서를 받습니다. 그러나 문서와 관련된 값에 사용되는 메모리는 원래 스트림보다 훨씬 더 클 수 있습니다. 이는 쿼리 서비스가 모든 필드, 값 및 중첩된 개체를 저장해야 하기 때문에 스트림을 구조로 디코딩하기 때문에 크기가 커질 수 있기 때문입니다. 쿼리 서비스는 압축률이 아닌 성능에 최적화되어 있습니다.
리소스 집약적인 쿼리가 발생하여 많은 양의 문서 메모리를 소모하기 시작하면 어떻게 될까요? 결국 메모리를 독차지하여 다른 쿼리가 지연될 수 있습니다. 이를 방지하려면 어떻게 해야 할까요? 욕심 쿼리가 다른 활성 쿼리의 실행에 영향을 미치지 않도록 하려면 어떻게 해야 하나요?
바로 여기에서 요청당 메모리 할당량 기능이 출시되었습니다!
Couchbase 7.0부터 쿼리 서비스는 다음과 같은 설정을 제공합니다. 메모리 할당량 를 설정하여 쿼리 요청이 실행되는 동안 특정 시간에 사용할 수 있는 최대 문서 메모리 양을 제한합니다.
이 요청별 메모리 할당량은 쿼리가 할당량을 초과하는 경우 쿼리를 종료하고 다른 모든 활성 쿼리는 계속 실행되도록 허용하는 방식으로 작동합니다. 이렇게 하면 욕심이 많은 쿼리만 중지되어 다른 쿼리의 성능에 영향을 미치지 않습니다.
메모리 할당량은 OS 메모리 사용량과 일치하지 않습니다. It 만 는 문서 메모리 사용량을 설명하며 힙, 스택, 실행 연산자 등에 사용되는 메모리는 설명하지 않습니다.
메모리 할당량은 어떻게 작동하나요?
요청별 메모리 할당량은 쿼리 요청에 대한 문서 메모리 풀을 구성하는 것으로 생각할 수 있습니다. 풀의 크기는 쿼리의 메모리 할당량 값에 따라 결정됩니다.
쿼리에 문서/값이 필요한 경우, 이 풀에서 문서/값의 크기를 할당합니다. 값/문서가 더 이상 필요하지 않은 경우, 할당된 크기는 요청에서 재사용할 수 있도록 풀로 다시 반환됩니다.
특정 순간에 쿼리 요청이 사용하는 문서 메모리의 총량은 해당 풀의 크기, 즉 메모리 할당량을 초과할 수 없습니다. 쿼리가 풀에서 사용 가능한 것보다 더 많은 문서 메모리를 사용하려고 하면 요청이 종료되고 오류가 반환됩니다.
쿼리 서비스는 고도로 병렬화되어 있으며 운영자가 동시에 실행할 수 있다는 점에 유의해야 합니다. 즉, 쿼리가 메모리 할당량을 초과하는지 여부는 실행마다 달라질 수 있습니다. 이는 각 실행의 세부 사항에 따라 동일한 실행 단계에서도 사용 중인(따라서 요청 풀에서 할당된) 문서 메모리의 양이 달라질 수 있기 때문입니다.
메모리 할당량을 구성하는 방법
요청당 메모리 할당량은 클러스터, 노드 및 요청 수준에서 설정할 수 있습니다.
-
- 단위: MiB
- 기본값입니다: 0 즉, 요청이 사용할 수 있는 문서 메모리 양에 제한이 없습니다.
클러스터 수준
를 사용하여 클러스터의 모든 쿼리 노드에 대한 메모리 할당량을 설정합니다. 쿼리메모리쿼터 클러스터 수준 설정. 클러스터 수준의 값은 유지되며 설정되면 모든 쿼리 노드에 대한 노드 수준 설정을 덮어씁니다.
-
- 클러스터 수준 설정 방법 알아보기 여기
노드 수준
를 사용하여 특정 쿼리 노드에 대한 메모리 할당량을 설정합니다. 메모리 할당량 노드 수준 설정. 노드 수준에서 설정된 값은 노드에서 실행되는 모든 쿼리 요청에 대한 기본 메모리 할당량입니다. 노드 수준 값은 유지되지 않으며 클러스터 수준 설정이 수정되면 덮어쓰기됩니다.
-
- 노드 수준 설정 방법 알아보기 여기
요청 수준
를 사용하여 특정 쿼리 요청에 대한 메모리 할당량을 설정합니다. memory_quota 매개변수를 설정합니다. 요청 수준 매개변수는 노드 수준 설정 값을 재정의합니다. 그러나 노드 수준 설정이 0보다 큰 경우 요청 수준 값은 노드 수준 값에 의해 제한됩니다.
-
- 요청 수준 매개변수 설정 방법 알아보기 여기
쿼리 서비스의 소프트 메모리 제한
쿼리의 문서 메모리 사용량을 제한하는 방법을 살펴보았으니 이제 쿼리 서비스의 메모리 사용량을 제한하는 방법도 있는지 궁금하실 것입니다.
쿼리 서비스에는 서비스의 메모리 사용량에 대한 하드 제한을 적용하는 설정이 없습니다. 이는 SQL++ 개발에 사용되는 프로그래밍 언어가 런타임 메모리 사용량에 대한 하드 제한을 강제하는 메커니즘을 제공하지 않기 때문입니다. 하지만 소프트 메모리 제한을 조정하는 메커니즘은 제공합니다...
따라서 Couchbase 7.6.0에서는 노드 할당량 설정이 도입되어 쿼리 서비스의 소프트 메모리 제한을 조정할 수 있게 되었습니다!
이 제한은 소프트 제한이므로, 쿼리 서비스의 메모리 사용량이 항상 이 제한 이하로 유지되거나 메모리 부족 상태가 발생하지 않는다는 보장은 없습니다. 그러나 이 한도를 초과하거나 근접할 경우 가비지 수집기(GC)를 더 자주 실행하여 쿼리 서비스의 메모리 사용량을 이 한도 이하로 유지하기 위해 노력합니다.
중요 참고 사항:
메모리 사용량이 소프트 제한에 가깝게 유지되면 GC가 공격적으로 실행되어 CPU 사용률이 높아질 수 있습니다.
노드 할당량을 구성하는 방법
노드 할당량은 클러스터, 노드 및 요청 수준에서 설정할 수 있습니다.
-
- 단위: MiB
- 기본값입니다: 0
- 최소: 1
노드 할당량의 최소값은 1MB이지만 워크로드 및 시스템 용량에 따라 실제 값으로 설정하세요.
클러스터 수준
를 사용하여 클러스터의 모든 쿼리 노드에 대한 노드 할당량을 설정합니다. 쿼리 노드 쿼터 클러스터 수준 설정. 클러스터 수준의 값은 유지되며 설정되면 모든 쿼리 노드에 대한 노드 수준 설정을 덮어씁니다.
-
- 클러스터 수준 설정 방법 알아보기 여기
중요 참고 사항:
클러스터 전체에서 이 설정을 구성하는 한 가지 방법은 Couchbase 웹 콘솔을 사용하는 것입니다. 웹 콘솔의 경우, 이 설정은 서버 노드당 메모리 할당량 을 클릭합니다.
이 섹션은 특히 쿼리 서비스의 클러스터 수준 노드 할당량을 구성하기 위한 것으로, 클러스터 수준 메모리 할당량 설정과 혼동해서는 안 됩니다.
노드 수준
를 사용하여 특정 쿼리 노드에 대한 노드 할당량을 설정합니다. 노드 할당량 노드 수준 설정. 노드 수준에서 설정된 값은 노드에서 실행되는 모든 쿼리 요청에 대한 기본 메모리 할당량입니다. 노드 수준 값은 유지되지 않으며 클러스터 수준 설정이 수정되면 덮어쓰기됩니다.
-
- 노드 수준 설정 방법 알아보기 여기
소프트 메모리 제한을 구성하는 방법
쿼리 서비스의 소프트 메모리 제한은 노드 할당량 값을 사용하여 설정됩니다. 설정하지 않으면 기본값이 계산됩니다.
노드 할당량
노드 할당량이 노드에 설정되어 있는 경우 이것이 소프트 메모리 제한입니다. 소프트 메모리 제한은 다음 단계에 따라 계산된 최대 허용 값으로 제한됩니다:
a) 총 시스템 RAM과 총 시스템 RAM의 90%의 차이를 계산합니다.
총 시스템 RAM - (0.9 * 총 시스템 RAM)
b) 차이가 8기가바이트보다 크면 최대 소프트 메모리 제한이 됩니다:
총 시스템 RAM - 8기가바이트
c) 차이가 8기가바이트 이하인 경우, 최대 소프트 메모리 제한은 전체 시스템 RAM의 90%로 설정됩니다.
노드 할당량이 계산된 최대값을 초과하면 소프트 메모리 제한이 자동으로 최대값으로 설정됩니다.
기본값
노드 할당량 설정이 노드에 설정되어 있지 않으면 다음 단계에 따라 소프트 제한에 대한 기본값이 계산됩니다:
a) 총 시스템 RAM과 총 시스템 RAM의 90%의 차이를 계산합니다.
총 시스템 RAM - (0.9 * 총 시스템 RAM)
b) 차이가 8기가바이트보다 큰 경우 기본 소프트 메모리 제한이 적용됩니다:
총 시스템 RAM - 8기가바이트
c) 차이가 8기가바이트 이하인 경우 기본 소프트 메모리 제한은 전체 시스템 RAM의 90%로 설정됩니다.
노드 전체 문서 메모리 할당량
워크로드에 실행에 많은 양의 메모리가 필요한 쿼리가 있는 경우 어떻게 해야 할까요? 이 쿼리는 할당량을 초과하여 자주 종료될 수 있으므로 요청별 메모리 할당량을 적용하는 것이 이상적이지 않을 수 있습니다. 쿼리 서비스를 과도한 메모리 사용으로부터 보호하면서 이 쿼리를 성공적으로 실행하려면 어떻게 해야 할까요?
요청당 메모리 할당량이 설정된 여러 쿼리가 동시에 실행되는 다른 시나리오를 생각해 보겠습니다. 이 시나리오에서는 서비스의 메모리 사용량이 매우 높아졌습니다. 하지만 쿼리의 문서 메모리 사용량은 각각의 할당량 이하로 유지됩니다. 따라서 쿼리가 종료되지 않습니다. 결과적으로 쿼리 서비스의 전체 메모리 사용량이 높게 유지되어 문제가 발생합니다. 이 문제를 어떻게 해결할 수 있을까요?
카우치베이스 7.6.0부터 쿼리 서비스에는 활성 쿼리가 사용할 수 있는 누적 문서 메모리 양을 제한하는 메커니즘이 도입되었습니다! 노드 전체에 문서 메모리 할당량을 도입하여 이러한 문제를 해결하려고 합니다.
노드 전체 할당량은 어떻게 작동하나요?
노드 전체 할당량은 노드에서 전체 쿼리 서비스에 대한 문서 메모리 풀을 구성하는 것으로 생각할 수 있습니다.
노드 할당량이 설정되면 메모리 세션 세션이 각 요청에 대해 생성됩니다. 기본적으로 이 세션은 초기 크기 1MiB로 시작됩니다. 노드 전체 할당량이 구성되면 모든 서버에 1MiB가 할당되고 노드 전체 풀에서 차감됩니다. 이 기본 할당은 각 서버에 최소한의 예약 공간을 보장하여 들어오는 요청을 항상 처리할 수 있도록 보장합니다.
요청에 값/문서가 필요한 경우, 값/문서의 크기는 해당 요청의 세션. 세션에 이 할당을 위한 메모리가 충분하지 않은 경우, 세션은 성장 할당 요청을 수용하기 위해 최소 1MB 단위로 증가합니다. 이러한 증가에 필요한 추가 메모리는 노드 전체 풀에서 할당됩니다.
활성 요청의 메모리 세션이 노드 전체 풀의 사용 가능한 잔여 메모리를 초과하여 증가하려고 하면 요청이 중지되고 오류가 반환됩니다.
요청에 더 이상 값/문서가 필요하지 않게 되면 할당된 크기를 다시 세션.
세션의 메모리(초기 서버 예약의 1MB 제외)는 요청 실행이 완료된 후에만 노드 전체 풀로 반환됩니다.
모든 메모리 세션의 총 크기는 언제든지 노드 전체 할당량의 크기를 초과할 수 없습니다.
이 메모리 세션은 요청에 대해 메모리 할당량을 설정할 때 구성되는 요청별 풀과 혼동해서는 안 된다는 점을 이해하는 것이 중요합니다. 노드 전체 할당량과 요청별 메모리 할당량 모두 구성할 수 있으며, 둘은 동일하지 않습니다. 읽기 노드 전체 문서 할당량과 요청별 메모리 할당량 모두 구성하기 섹션에서 자세히 알아보세요.
이러한 방식으로 노드 전체 할당량은 모든 활성 요청에서 사용 중인 문서 메모리 양에 제한을 둡니다.
노드 전체 문서 할당량은 노드 할당량 설정이 다음과 같은 경우에만 구성할 수 있습니다. 명시적으로 노드에 설정합니다. 이 할당량의 크기는 두 가지 쿼리 설정을 사용하여 계산됩니다, 노드 할당량 (이전 섹션에서 살펴본 내용) 및 노드 할당량 값 백분율.
노드 할당량 값 퍼센트를 구성하는 방법은 무엇인가요?
노드 할당량 값 퍼센트는 모든 활성 요청에서 추적된 값 콘텐츠 메모리/'문서 메모리' 전용 노드 할당량의 백분율입니다.
노드 할당량 값 퍼센트는 클러스터 및 노드 수준에서 설정할 수 있습니다.
-
- 단위: MiB
- 기본값입니다: 67
- 최소: 0
- 최대: 100
클러스터 수준
를 사용하여 클러스터의 모든 쿼리 노드에 대한 노드 할당량 값 백분율을 설정합니다. 쿼리 노드 할당량 비율 클러스터 수준 설정. 클러스터 수준의 값은 유지되며 설정되면 모든 쿼리 노드에 대한 노드 수준 설정을 덮어씁니다.
-
- 클러스터 수준 설정 방법 알아보기 여기
노드 수준
를 사용하여 특정 쿼리 노드에 대한 노드 할당량 값 백분율을 설정합니다. 노드-쿼터-값-퍼센트 노드 수준 설정. 노드 수준에서 설정된 값은 노드에서 실행되는 모든 쿼리 요청에 대한 기본 메모리 할당량입니다. 노드 수준 값은 유지되지 않으며 클러스터 수준 설정이 수정되면 덮어쓰기됩니다.
-
- 노드 수준 설정 방법 알아보기 여기
노드 전체 문서 메모리 할당량을 구성하는 방법
노드 전체 문서 메모리 할당량의 크기는 노드 할당량을 기준으로 계산됩니다. 노드 할당량 필수 를 설정하여 노드 전체 문서 메모리 할당량을 구성할 수 있습니다.
노드 전체 풀의 크기는 다음 단계를 사용하여 계산합니다:
1. 다음 공식을 사용하여 모든 활성 쿼리에서 문서 메모리 추적 전용 노드 할당량의 백분율을 계산합니다:
노드 할당량 * 노드 할당량-값 백분율 / 100
2. 노드 전체 문서 메모리 할당량에 대한 최소 허용 값을 계산합니다.
SQL++ 문 실행은 다음과 같이 처리됩니다. 서버. 쿼리가 실행될 때 쿼리는 실행을 담당하는 서버 스레드에 할당됩니다. 쿼리 서비스는 들어오는 요청을 처리하기 위해 여러 개의 서버로 구성됩니다. 서버에는 두 가지 유형이 있습니다, 무제한 서버 그리고 플러스 서버.
쿼리 엔진은 각 서버에 대해 1MiB의 문서 메모리를 예약합니다. 따라서 각 요청의 메모리 세션의 기본 초기값은 1MiB입니다. 즉, 기준 문서 메모리 사용량은 무제한과 더하기 서버의 총 수(MiB 단위로 측정)가 됩니다.
따라서 노드 전체 문서 메모리 할당량의 크기는 다음과 같아야 합니다. 적어도 는 서버의 수와 같으며, MiB 단위로 측정됩니다.
포뮬러 1
서버를 위해 예약된 할당량 =
(무제한 서버 수 + 플러스 서버 수) MiB
3. 노드 전체 문서 메모리 할당량의 크기는 다음 공식을 사용하여 계산합니다:
공식 2
노드 전체 문서 메모리 할당량 크기
=
MAX( 노드 할당량 * 노드 할당량-값-퍼센트/100, 서버용 할당량)
-
- 서버를 위해 예약된 할당량은 다음을 사용하여 계산됩니다. 포뮬러 1
이것은 활성 요청 및 모든 메모리 세션의 최대 허용 크기입니다. 포함 각 서비스 제공업체의 초기 예약입니다.
문서 메모리 증가를 위해 풀에서 사용 가능한 할당량 계산하기
서버에 대한 초기 예약은 노드의 노드 전체 문서 메모리 할당량에서 차감됩니다. 노드 전체 메모리 풀의 남은 공간은 각 활성 요청에서 문서 메모리 사용량을 초기 1MB 예약량 이상으로 늘리는 데 사용할 수 있습니다.
문서 메모리 증가에 사용할 수 있는 남은 할당량은 다음 공식을 사용하여 계산합니다:
공식 3
활성 요청의 메모리 세션이 늘어날 때 사용할 수 있는 노드 전체 문서 메모리 할당량 크기 = =.
노드 전체 문서 메모리 할당량 크기 - 서버를 위해 예약된 할당량
-
- 노드 전체 문서 메모리 할당량의 크기는 다음에서 계산됩니다. 공식 2
- 서버를 위해 예약된 할당량은 다음을 사용하여 계산됩니다. 포뮬러 1
실용적이고 워크로드에 적합한 적절한 노드 할당량 및 노드 할당량-밸-퍼센트 값을 설정하는 것이 중요합니다. 예시를 통해 그 중요성을 설명합니다:
예
32개의 무제한 서버와 128개 이상의 서버가 있는 쿼리 노드를 예로 들어 보겠습니다. 관리자가 노드 할당량을 10MB로 설정합니다. 노드 할당량 값의 기본값은 67입니다.
사용 공식 2 를 사용하여 노드 전체 문서 메모리 할당량의 크기를 계산합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
크기 의 노드-넓은 문서 메모리 할당량 = MAX( 노드-할당량 * 노드-할당량-val-퍼센트 / 100, 할당량 예약됨 에 대한 서버) = MAX( 노드-할당량 * 노드-할당량-val-퍼센트 / 100, (숫자 의 무제한 서버 + 숫자 의 플러스 서버) MiB ) = MAX ( 10 * 67 / 100 MiB, (32+128) MiB ) = MAX ( 6.7 MiB, 160 MiB) = 160 MiB |
사용 공식 3 를 사용하여 요청의 메모리 증가에 사용할 수 있는 노드 전체 풀에서 사용 가능한 문서 메모리 양을 계산합니다:
|
1 2 3 4 5 6 |
= 크기 의 노드-넓은 문서 메모리 할당량 - (숫자 의 무제한 서버 + 숫자 의 플러스 서버) MiB = 160 MiB - (32+128) MiB = 160 MiB - 160 MiB = 0 MiB |
즉, 초기 예약 용량인 1MB를 초과하여 요청의 문서 메모리가 늘어날 여지가 없습니다. 다시 말해, 각 요청은 제한된 를 최대 1MB의 문서 메모리 사용으로 변경했습니다.
또한 노드 할당량이 10MB로 매우 작기 때문에 가비지 컬렉션이 자주 실행되어 CPU 사용률이 높아질 수 있습니다.
문서 메모리 수치 보고
요청에 대한 메모리 할당량이 설정되었거나 노드 전체 문서 메모리 풀이 구성된 경우, 아래에서 살펴볼 몇 가지 SQL++ 기능에서 이에 대한 정보가 보고됩니다. 이 정보는 디버깅에 유용합니다.
응답 출력
a) 메트릭:
그리고 사용된 메모리 필드에 메트릭 쿼리 응답의 섹션은 쿼리 응답의 하이 워터 마크(HWM) 에서 쿼리의 문서 메모리 사용량을 바이트.
쿼리 서비스는 고도로 병렬화되어 있어 운영자가 동시에 실행할 수 있습니다. 그 결과 사용된 메모리 수치는 동일한 쿼리에 대한 실행마다 다를 수 있습니다. 이는 각 실행의 세부 사항에 따라 HWM 문서 메모리 사용량이 달라질 수 있기 때문입니다.
|
1 2 3 4 5 6 7 8 |
"metrics": { "elapsedTime": "19.07875ms", "실행 시간": "18.909916ms", "resultCount": 10000, "결과 크기": 248890, "serviceLoad": 2, "usedMemory": 341420 } |
b) 컨트롤 섹션:
만약 컨트롤 쿼리 설정이 활성화되고 메모리 할당량 요청에 대해 구성된 메모리 쿼터 필드에 컨트롤 쿼리 응답의 섹션은 메모리 할당량 세트의 값을 보고합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
"컨트롤": { "스캔 일관성": "무제한", "use_cbo": "true", "memoryQuota": "25", "n1ql_feat_ctrl": "0x4c", "disabledFeatures":[ "(향후 사용을 위해 예약됨) (0x40)", "인코딩된 계획(0x4)", "골랑 UDF(0x8)" ], "stmtType": "SELECT" } |
-
- 컨트롤 설정에 대해 자세히 알아보기 여기
시스템 키 공간
시스템:완료된_요청, 시스템:활성_요청
이러한 시스템 키 공간에 있는 요청의 항목에 있습니다:
그리고 사용된 메모리 필드는 HWM 쿼리의 문서 메모리 사용량을 바이트 단위로 표시합니다. 쿼리 서비스는 고도로 병렬화되어 있으며 운영자가 동시에 실행할 수 있습니다. 그 결과 사용된 메모리 수치는 동일한 쿼리에 대한 실행마다 다를 수 있습니다. 이는 각 실행의 세부 사항에 따라 HWM 문서 메모리 사용량이 달라질 수 있기 때문입니다.
그리고 메모리 쿼터 필드는 요청에 대해 설정된 메모리 할당량 값입니다.
요청별 메모리 할당량과 노드 전체 문서 할당량 모두 구성하기
에 설명된 대로 요청당 메모리 할당량 섹션에서 요청에 메모리 할당량이 구성된 경우, 요청이 실행되는 동안 특정 시간에 사용할 수 있는 최대 문서 메모리 양은 메모리 할당량에 의해 제한됩니다.
또한 노드 전체 문서 메모리 할당량 섹션에서 노드 할당량과 노드 전체 문서 메모리 할당량이 구성되면 각 요청은 자체 "메모리 세션"을 얻습니다. 이러한 세션의 크기가 증가하면 노드 전체 문서 메모리 할당량에서 할당됩니다.
노드 전체 문서 메모리 할당량이 구성되어 있고 요청에 메모리 할당량이 설정되어 있는 경우 쿼리 요청의 문서 메모리 사용량은 다음과 같이 제한됩니다. 둘 다 쿼터.
문서/가치 할당은 어떻게 수행되나요?
요청에 문서/값이 필요한 경우 할당 프로세스 중에 다음 단계가 수행됩니다:
- 메모리 세션 할당:
-
- 요청은 먼저 해당 메모리 세션에서 문서에 대한 메모리를 할당하려고 시도합니다.
- 세션에 충분한 공간이 있으면 할당에 성공한 것입니다.
- 세션에 공간이 부족하면 세션은 노드 전체 문서 메모리 할당량에서 할당하여 크기를 늘리려고 시도합니다. (즉, "노드 전체 문서 메모리 풀"에서).
- 노드 전체 풀에 세션이 늘어날 공간이 충분하지 않으면 요청이 중지되고 오류가 반환됩니다.
- 메모리 할당량 할당을 요청합니다:
-
- 세션 할당이 성공하면 요청은 메모리 할당량에서 문서에 대한 메모리를 할당하려고 시도합니다. (즉, "요청 메모리 풀"에서).
- 메모리 할당량에 충분한 공간이 남아 있으면 할당이 성공하고 요청이 진행됩니다.
- 메모리 할당량에 남은 공간이 충분하지 않으면 요청이 실패하고 오류가 반환됩니다.
다음을 사용하여 모니터링 시스템:바이탈
시스템 키 공간 시스템:바이탈 에는 메모리 및 CPU 사용량, 가비지 수집 등과 관련된 정보를 비롯하여 클러스터의 각 쿼리 노드에 대한 중요한 정보가 포함되어 있습니다. 사용자는 이 시스템 키 공간을 사용하여 쿼리 노드의 상태와 바이탈을 모니터링할 수 있습니다.
이 정보에 액세스하는 방법에는 두 가지가 있습니다:
1. SQL++를 사용하여 system:vitals 키스페이스를 쿼리합니다.
SELECT * FROM system:vitals;
-
- 쿼리 서비스의 다음을 사용하여 노드별 바이탈에 액세스하기 /admin/비탈 엔드포인트.
curl -u $USER:$PASSWORD $QUERY_NODE_URL/admin/vitals
아래는 다음 레코드의 샘플입니다. 시스템:바이탈 를 쿼리 노드에 추가합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
{ "bucket.IO.stats": { "travel-sample": { "읽다": 52090 } }, "코어": 12, "cpu.sys.percent": 0.005, "cpu.user.percent": 0.0056, "ffdc.total": 0, "gc.num": 64352224, "gc.pause.percent": 0, "gc.pause.time": "4.479336ms", "건강한": true, "host.memory.free": 321028096, "host.memory.quota": 10485760000, "host.memory.total": 38654705664, "host.memory.value_quota": 7025459200, "load": 0, "로드 팩터": 6, "local.time": "2024-12-05T17:21:25.609+05:30", "memory.system": 584662408, "memory.total": 3884613696, "memory.usage": 25302328, "node": "127.0.0.1:8091", "node.allocated.values": 613916, "node.memory.usage": 251658240, "process.memory.usage": 0, "process.percore.cpupercent": 0, "process.rss": 629309440, "process.service.usage": 0, "요청.활성.카운트": 1, "요청.완료.카운트": 41, "요청.당.초.15분": 0.0221, "request.per.sec.1min": 0.0136, "요청당.초.5분": 0.017, "요청.준비된.퍼센트": 0, "요청.대기열.카운트": 0, "요청_시간.80퍼센타일": "63.969209ms", "요청_시간.95퍼센타일": "74.865437ms", "요청_시간.99퍼센타일": "150.904625ms", "요청_시간.평균": "37.019323ms", "요청_시간.중앙값": "39.115791ms", "servers.paused.count": 0, "servers.paused.total": 0, "temp.hwm": 0, "temp.usage": 0, "total.threads": 411, "가동 시간": "12m48.431007375s", "버전": "7.6.0-N1QL" } |
쿼리 서비스는 가비지 수집기를 어떻게 트리거하나요?
7.6.0부터 쿼리 서비스는 지난 30초 동안 가비지 컬렉터(GC)가 실행되었는지 정기적으로 확인합니다. 그렇지 않은 경우 GC가 실행되도록 트리거됩니다. 이 검사 중에는 사용 가능한 시스템 메모리의 양도 모니터링됩니다. 사용 가능한 메모리 양이 25% 미만이면 가능한 한 많은 메모리를 OS에 반환하려고 시도합니다.
온디맨드 가비지 컬렉터 실행
7.6.0부터 쿼리 서비스는 REST 엔드포인트를 제공합니다. /admin/gc 를 호출하여 가비지 수집기를 실행할 수 있습니다. 이 엔드포인트는 메모리 사용률을 줄이기 위해 GC 실행을 트리거하기 위해 호출할 수 있습니다.
GC 실행을 강제하려면 API에 GET 요청을 발행합니다:
curl -u $USER:$PASSWORD $QUERY_NODE_URL/admin/gc
GC를 강제로 실행하고 가능한 한 많은 메모리를 OS에 반환하려면 API에 POST 요청을 발행합니다.
curl -X POST -u $USER:$PASSWORD $QUERY_NODE_URL/admin/gc
-
- 이 엔드포인트에 대해 자세히 알아보기 여기.
중요 참고 사항:
가비지 수집기를 공격적으로 실행하면 CPU 사용률이 높아질 수 있습니다.