기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon Neptune 느린 쿼리 로깅 사용
실행 속도가 느린 쿼리를 식별, 디버깅, 최적화하는 것은 어려울 수 있습니다. Neptune의 느린 쿼리 로깅을 활성화하면 장기간 실행되는 모든 쿼리의 속성이 자동으로 로깅되므로, 이 프로세스가 더 쉬워집니다.
참고
느린 쿼리 로깅은 Neptune 엔진 릴리스 1.2.1.0에 도입되었습니다.
neptune_enable_slow_query_log DB 클러스터 파라미터를 사용하여 느린 쿼리 로깅을 활성화합니다. 이 파라미터는 기본적으로 disabled
로 설정되어 있습니다. info
또는 debug
로 설정하여 느린 쿼리 로깅을 활성화합니다. info
설정은 실행 속도가 느린 각 쿼리의 몇 가지 유용한 속성을 로깅하는 반면, debug
설정은 사용 가능한 모든 속성을 로깅합니다.
느리게 실행되는 쿼리로 간주되는 쿼리의 임계값을 설정하려면 neptune_slow_query_log_threshold DB 클러스터 파라미터를 사용하여 실행 중인 쿼리가 느린 것으로 간주되어 느린 쿼리 로깅이 활성화되었을 때 로깅되는 시간을 밀리초 단위로 지정합니다. 기본값은 5,000밀리초(5초)입니다.
에서 AWS Management Console또는 modify-db-cluster-parameter-group AWS CLI 명령 또는 ModifyDBClusterParameterGroup 관리 함수를 사용하여 이러한 DB 클러스터 파라미터를 설정할 수 있습니다.
참고
느린 쿼리 로깅 파라미터는 동적입니다. 즉, 값을 변경해도 DB 클러스터를 다시 시작할 필요가 없으며 재시작되지도 않습니다.
에서 느린 쿼리 로그를 보려면 AWS Management Console
다음과 AWS Management Console같이 에서 느린 쿼리 로그를 보고 다운로드할 수 있습니다.
인스턴스 페이지에서 DB 인스턴스를 선택한 다음, 로그 섹션으로 스크롤합니다. 그런 다음 로그 파일을 선택한 후 다운로드를 선택하여 다운로드할 수 있습니다.
Neptune 느린 쿼리 로깅으로 생성된 파일
Neptune에서 느린 쿼리 로깅으로 생성되는 로그 파일은 다음과 같은 특징을 갖습니다.
파일은 UTF-8로 인코딩됩니다.
쿼리 및 해당 속성은 JSON 형식으로 로깅됩니다.
queryTime
데이터를 제외하고 null 및 빈 속성은 로깅되지 않습니다.로그는 여러 파일에 걸쳐 있으며, 수는 인스턴스 크기에 따라 달라집니다.
로그 항목이 순서대로 나열되지 않습니다. 정렬을 위해
timestamp
값을 사용할 수 있습니다.최신 이벤트를 보기 위해 모든 느린 쿼리 로그 파일을 확인해야 하는 경우가 있을 수 있습니다.
로그 파일은 총 100MiB에 도달하면 교체됩니다. 이 제한은 구성할 수 없습니다.
info
모드에서 로깅된 쿼리 속성
neptune_enable_slow_query_log
DB 클러스터 파라미터가 info
로 설정된 경우 느린 쿼리에 대해 다음과 같은 속성이 로깅됩니다.
그룹 | 속성 | 설명 |
---|---|---|
requestResponseMetadata |
|
쿼리의 요청 ID. |
|
HTTP 또는 와 같은 요청 유형입니다 WebSocket. |
|
|
쿼리 응답 상태 코드(예: 200). |
|
|
쿼리 실행 후 반환된 오류의 예외 클래스. |
|
queryStats |
|
쿼리 문자열. |
|
쿼리의 핑거프린트. |
|
|
Gremlin SPARQL 또는 와 같은 쿼리 언어openCypher. |
|
memoryStats |
|
쿼리에 할당된 권한. |
|
실행 중 쿼리에 사용된 대략적인 메모리. |
|
queryTime |
|
쿼리 시작 시간(UTC). |
|
총 쿼리 실행 시간(밀리초). |
|
|
쿼리 구문 분석 시간(밀리초). |
|
|
Gremlin/SPARQL/openCypher 대기열 대기 시간 쿼리, 밀리초 단위 |
|
|
쿼리 실행 시간(밀리초). |
|
|
쿼리 직렬화 시간(밀리초). |
|
statementCounters |
|
스캔한 문 수. |
|
작성한 문 수. |
|
|
삭제된 문 수. |
|
transactionCounters |
|
커밋된 트랜잭션 수. |
|
롤백된 트랜잭션 수. |
|
vertexCounters |
|
추가된 버텍스 수. |
|
제거된 버텍스 수. |
|
|
추가된 버텍스 속성 수. |
|
|
제거된 버텍스 속성 수. |
|
edgeCounters |
|
추가된 엣지 수. |
|
제거된 엣지 수. |
|
|
추가된 엣지 속성 수. |
|
|
제거된 엣지 속성 수. |
|
resultCache |
|
결과 캐시 적중 횟수. |
|
결과 캐시 실패 횟수. |
|
|
결과 캐시 입력 횟수. |
|
concurrentExecution |
|
시작 시 현재 쿼리 실행과 함께 허용되는 병렬 쿼리. |
|
시작 시 현재 쿼리 실행과 함께 실행되는 병렬 쿼리. |
|
|
종료 시 현재 쿼리 실행과 함께 허용되는 병렬 쿼리. |
|
|
종료 시 현재 쿼리 실행과 함께 실행되는 병렬 쿼리. |
|
queryBatch |
|
쿼리 처리 중 배치 크기. |
|
쿼리 직렬화 중 배치 크기. |
debug
모드에서 로깅된 쿼리 속성
neptune_enable_slow_query_log
DB 클러스터 파라미터가 debug
로 설정되면 info
모드에서 로딩된 속성 외에도 다음과 같은 스토리지 카운터 속성이 로깅됩니다.
속성 | 설명 |
---|---|
|
모든 인덱스에서 스캔된 문. |
|
SPOG 인덱스에서 스캔된 문입니다. |
|
POGS 인덱스에서 스캔된 문입니다. |
|
GPSO 인덱스에서 스캔된 문입니다. |
|
OSGP 인덱스에서 스캔된 문입니다. |
|
청크로 함께 스캔된 문. |
|
스캔되고 나서 사후 필터링 후 남은 문. |
|
스캔된 고유 문. |
|
모든 인덱스에서 스캔 사후 필터링 후 읽은 문. |
|
SPOG 인덱스에서 사후 필터링을 스캔한 후 읽은 문입니다. |
|
POGS 인덱스에서 사후 필터링을 스캔한 후 읽은 문입니다. |
|
GPSO 인덱스에서 사후 필터링을 스캔한 후 읽은 문입니다. |
|
OSGP 인덱스에서 사후 필터링을 스캔한 후 읽은 문입니다. |
|
액세스 경로 검색 횟수. |
|
완전히 바인딩된 키 액세스 경로 검색 횟수. |
|
접두사를 기준으로 검색한 액세스 경로 수. |
|
1개 이상의 레코드가 출력된 검색 횟수. |
|
레코드가 출력되지 않은 검색 횟수. |
|
모든 검색에서 찾은 총 레코드. |
|
모든 인덱스에 삽입된 문 수. |
|
모든 인덱스에서 업데이트된 문 수. |
|
모든 인덱스에서 삭제된 문 수. |
|
조건자 수. |
|
값에서 ID 표까지 딕셔너리 읽기 수. |
|
값 표 ID의 딕셔너리 읽기 수. |
|
ID 표까지 값에 대한 딕셔너리 쓰기 수. |
|
값 표까지 ID에 대한 딕셔너리 쓰기 수. |
|
모든 인덱스의 범위 수. |
|
쿼리의 교착 상태 수. |
|
수행된 단일 카디널리티 삽입의 수. |
|
단일 카디널리티 삽입 중에 삭제된 문 수. |
느린 쿼리에 대한 디버그 로깅의 예제
다음 Gremlin 쿼리는 느린 쿼리에 설정된 임계값보다 실행 시간이 더 오래 걸릴 수 있습니다.
gremlin=g.V().has('code','AUS').repeat(out().simplePath()).until(has('code','AGR')).path().by('code').limit(20).fold()
그러면 디버그 모드에서 느린 쿼리 로깅을 활성화한 경우 다음과 같은 형식으로 쿼리에 아래의 속성이 로깅됩니다.
{ "requestResponseMetadata": { "requestId": "5311e493-0e98-457e-9131-d250a2ce1e12", "requestType": "HTTP_GET", "responseStatusCode": 200 }, "queryStats": { "query": "gremlin=g.V().has('code','AUS').repeat(out().simplePath()).until(has('code','AGR')).path().by('code').limit(20).fold()", "queryFingerprint": "g.V().has(string0,string1).repeat(__.out().simplePath()).until(__.has(string0,string2)).path().by(string0).limit(long0).fold()", "queryLanguage": "Gremlin" }, "memoryStats": { "allocatedPermits": 20, "approximateUsedMemoryBytes": 14838 }, "queryTimeStats": { "startTime": "23/02/2023 11:42:52.657", "overallRunTimeMs": 2249, "executionTimeMs": 2229, "serializationTimeMs": 13 }, "statementCounters": { "read": 69979 }, "transactionCounters": { "committed": 1 }, "concurrentExecutionStats": { "acceptedQueryCountAtStart": 1 }, "queryBatchStats": { "queryProcessingBatchSize": 1000, "querySerialisationBatchSize": 1000 }, "storageCounters": { "statementsScannedInAllIndexes": 69979, "statementsScannedSPOGIndex": 44936, "statementsScannedPOGSIndex": 4, "statementsScannedGPSOIndex": 25039, "statementsReadInAllIndexes": 68566, "statementsReadSPOGIndex": 43544, "statementsReadPOGSIndex": 2, "statementsReadGPSOIndex": 25020, "accessPathSearches": 27, "fullyBoundedAccessPathSearches": 27, "dictionaryReadsFromValueToIdTable": 10, "dictionaryReadsFromIdToValueTable": 17, "rangeCountsInAllIndexes": 4 } }