MongoDB 성능 모니터링: 주요 명령어 및 지표 설명
효과적인 데이터베이스 관리는 강력한 모니터링에 달려 있습니다. 선도적인 NoSQL 문서 데이터베이스인 MongoDB의 경우, 높은 가용성과 응답성을 유지하려면 성능 지표를 이해하는 것이 중요합니다. 느린 쿼리, 과도한 리소스 소비 또는 예기치 않은 연결 증가는 애플리케이션 성능에 심각한 영향을 미칠 수 있습니다.
이 가이드는 성능 모니터링을 위해 특별히 설계된 필수 MongoDB 셸 명령어를 살펴봅니다. 관리자와 개발자는 이러한 명령어를 정기적으로 실행함으로써 연결 상태, 쿼리 실행 시간, 리소스 활용 및 전반적인 운영 상태에 대한 깊은 통찰력을 얻어 선제적인 최적화 및 문제 해결이 가능해집니다.
MongoDB 셸(mongosh)의 필수 모니터링 명령어
이러한 명령어를 실행하는 기본 인터페이스는 MongoDB 셸(mongosh) 또는 레거시 mongo 셸입니다. 여기에 표시된 모든 명령어는 이 셸 환경 내에서 실행됩니다.
1. 현재 연결 이해: db.currentOp() 및 db.serverStatus()
연결 고갈을 방지하고 리소스를 차단할 수 있는 장기 실행 작업을 식별하기 위해 활성 연결을 모니터링하는 것이 중요합니다.
db.currentOp()
이 명령어는 데이터베이스에서 현재 실행 중인 작업에 대한 정보를 반환합니다. 실시간으로 느리거나 차단하는 쿼리를 식별하는 데 필수적입니다.
사용 예시:
현재 실행 중인 모든 작업을 보려면:
db.currentOp()
특정 임계값(예: 5초 이상 실행되는 작업)보다 오래 실행되는 작업을 구체적으로 확인하려면:
db.currentOp({"secs_running": {$gt: 5}})
출력에는 op, ns(네임스페이스), query, secs_running과 같은 세부 정보가 포함됩니다.
db.serverStatus()
이 명령어는 포괄적인 상태 정보를 제공하지만, 연결 풀링 및 제한을 모니터링하는 데는 connections 섹션이 중요합니다.
serverStatus 내 주요 지표 (연결 섹션):
current: 서버에 대한 활성 연결 수.available: 설정된 최대치에 따라 설정할 수 있는 사용 가능한 연결 수.
db.serverStatus().connections
2. 쿼리 성능 분석: db.getProfilingStatus() 및 db.setProfilingLevel()
MongoDB는 데이터베이스 작업의 실행 세부 정보를 기록하는 내장 프로파일링 도구를 제공하여 리소스를 많이 사용하는 쿼리를 식별할 수 있도록 합니다.
프로파일링 수준
프로파일링 수준은 어떤 작업이 기록될지 결정합니다:
- 0 (끄기): 프로파일링되는 작업이 없습니다.
- 1 (느린 작업): 구성된 임계값(
slowms)보다 느린 작업만 프로파일링됩니다. - 2 (모든 작업): 모든 작업이 프로파일링되지만, 이는 상당한 쓰기 부하를 발생시키므로 대상 문제 해결을 위해 짧은 시간 동안만 사용해야 합니다.
상태 확인
현재 프로파일링 수준을 확인하려면:
db.getProfilingStatus()
수준 설정 (예시)
느린 작업(100밀리초를 초과하는 작업)에 대해서만 프로파일링을 활성화하려면:
// slowms를 100밀리초로 설정 (기본값은 보통 100)
db.setProfilingLevel(1, { slowms: 100 })
팁: 과도한 로깅으로 인한 성능 저하를 방지하기 위해 필요한 정보를 수집한 후에는 항상 프로파일링을 수준 0으로 되돌리십시오.
프로파일링된 느린 쿼리 보기
프로파일링된 작업은 모니터링 중인 특정 데이터베이스 내의 system.profile 컬렉션에 저장됩니다. 지난 한 시간 동안 가장 느렸던 쿼리 10개를 보려면:
db.system.profile.find().sort({millis: -1}).limit(10).pretty()
3. 리소스 활용 지표
MongoDB가 CPU, 메모리 및 I/O 리소스를 어떻게 활용하는지 이해하는 것은 확장 결정에 필수적입니다.
메모리 및 스토리지 사용량: db.serverStatus()
serverStatus 내의 globalLock 및 storageEngine 섹션은 리소스 관리에 대한 깊은 통찰력을 제공합니다.
메모리 지표:
resident: 프로세스가 사용하는 물리적 메모리 양.virtual: 프로세스가 할당한 총 가상 메모리.
db.serverStatus().globalLock
잠금 경합 모니터링
MongoDB는 내부 잠금 메커니즘을 사용합니다. 잠금 획득 및 대기 시간을 모니터링하면 동시성 병목 현상을 식별하는 데 도움이 됩니다.
globalLock의 주요 지표:
currentQueue.readers: 잠금을 기다리는 리더 수.currentQueue.writers: 잠금을 기다리는 작성자 수.totalTime: 모든 작업에서 잠금을 기다리는 데 소비된 총 시간.
currentQueue의 높은 값은 인덱스가 누락되었거나 쓰기 작업이 지나치게 오래 걸려 리더/작성자가 대기열에 쌓이는 것임을 나타내는 경우가 많습니다.
4. 인덱스 사용 및 상태: db.collection.stats()
잘 활용되지 않거나 누락된 인덱스는 성능 저하의 가장 흔한 원인입니다. stats() 명령어는 인덱스 효율성을 분석하는 데 도움이 됩니다.
특정 컬렉션(예: users)에서 실행할 때:
db.users.stats()
확인해야 할 주요 지표:
totalIndexSize: 해당 컬렉션의 모든 인덱스가 차지하는 총 디스크 공간.indexSizes: 인덱스별 공간 사용량 세분화.- 인덱스가 존재하지만 읽기에 전혀 사용되지 않는 경우, 제거를 고려해야 할 오버헤드입니다.
5. 디스크 I/O 및 처리량: db.serverStatus() (네트워크 및 작업)
네트워크 활동 및 작업 속도를 모니터링하면 데이터베이스 처리량에 대한 시각을 얻을 수 있습니다.
**작업 속도 (opcounters 기준):
opcounters는 마지막 서버 재시작 이후 실행된 총 작업 수를 유형별로 추적합니다:
insert,query,update,delete,getmore,command.
이러한 카운터의 시간 경과에 따른 변화(예: 연속된 두 번의 serverStatus 호출 비교)를 추적하면 운영 처리량(초당 작업 수)을 계산할 수 있습니다.
비교 예시:
- 시간 T1에서
db.serverStatus().opcounters실행. - 시간 T2에서
db.serverStatus().opcounters실행. - T1 값을 T2 값에서 빼서 해당 간격 동안 실행된 총 작업 수를 얻습니다.
선제적 모니터링을 위한 모범 사례
- 자동화가 핵심입니다: 수동 셸 명령어에만 의존하는 것은 비효율적입니다. MongoDB Cloud Manager/Ops Manager 또는 이러한 엔드포인트를 자동으로 쿼리하는 타사 모니터링 솔루션과 같은 도구를 사용하여 모니터링을 통합하십시오.
- 기준선 설정: 시스템이 정상 상태일 때 명령어를 실행하여 성능 기준선을 설정하십시오. 이 기준선에서 벗어나는 모든 편차는 즉각적인 조사가 필요합니다.
- 지연 시간에 집중: 작업 수는 유용하지만, 최종 사용자 경험 문제 진단 시에는 처리량 수치보다는 프로파일링 로그에서 보고되는 시간과 같은 지연 시간 지표를 우선시하십시오.
- 연결을 자주 확인: 트래픽이 많은 애플리케이션에서는 연결 한도에 가장 먼저 도달하는 경우가 많습니다. 구성된 최대치에 상대적으로
db.serverStatus().connections.current를 모니터링하십시오.
결론
db.currentOp(), db.serverStatus()와 같은 주요 MongoDB 셸 명령어 및 프로파일링 도구를 숙달하면 관리자는 성능 병목 현상을 능동적으로 진단하는 데 필요한 수단을 갖추게 됩니다. 연결 풀, 쿼리 실행 계획(프로파일링을 통해) 및 리소스 소비를 정기적으로 검사함으로써 MongoDB 배포가 빠르고 효율적이며 안정적으로 유지되도록 보장합니다.