mongotop 및 mongostat를 이용한 MongoDB 성능 지표 분석 가이드

`mongotop` 및 `mongostat`로 MongoDB 성능 분석을 마스터하세요. 이 가이드는 이러한 필수 명령줄 도구를 사용하여 실시간 리소스 활용을 모니터링하고, 컬렉션별 읽기/쓰기 작업을 추적하며, 연결 및 네트워크 트래픽과 같은 서버 지표를 분석하고, 성능 병목 현상 및 느린 쿼리를 효과적으로 진단하는 방법을 자세히 설명합니다. 주요 지표를 해석하고 실용적인 문제 해결 기술을 적용하여 더욱 효율적인 MongoDB 배포를 달성하세요.

31 조회수

mongotop 및 mongostat을 사용하여 MongoDB 성능 메트릭 분석하기

주요 NoSQL 문서 데이터베이스인 MongoDB는 강력한 성능 기능을 제공합니다. 하지만 복잡한 시스템과 마찬가지로 애플리케이션 응답성 및 사용자 경험에 영향을 미치는 성능 병목 현상을 겪을 수 있습니다. 이러한 문제를 식별하고 해결하는 것은 건강하고 효율적인 데이터베이스를 유지하는 데 매우 중요합니다. 다행히 MongoDB는 실시간 모니터링을 위해 설계된 내장 명령줄 유틸리티인 mongotopmongostat을 제공합니다. 이러한 도구는 리소스 사용률을 신속하게 평가하고, 읽기 및 쓰기 활동을 이해하며, 성능 이상을 정확히 찾아내는 데 매우 유용합니다.

이 가이드에서는 mongotopmongostat의 실제 적용 방법을 안내합니다. 핵심 기능, 일반적인 사용 사례, 그리고 출력을 해석하여 느린 쿼리, 높은 리소스 소비 및 기타 일반적인 MongoDB 문제와 같은 성능 문제를 진단하고 해결하는 방법을 살펴볼 것입니다. 이 도구들을 숙달하면 MongoDB 배포에 대한 더 깊은 통찰력을 얻고 최적의 성능을 보장할 수 있습니다.

mongotop 이해하기

mongotop은 MongoDB 인스턴스에서 발생하는 읽기 및 쓰기 작업에 대한 실시간 보기를 제공합니다. 지정된 간격 동안 각 컬렉션이 읽기 또는 쓰기 작업에 소비한 시간을 표시합니다. 이는 가장 많은 활동이 발생하는 컬렉션을 식별하는 데 특히 유용하며 성능 저하의 원인이 될 수 있습니다.

mongotop에서 제공하는 핵심 메트릭:

  • ns: 컬렉션의 네임스페이스 (데이터베이스.컬렉션).
  • total ms: 도구가 시작된 이후 해당 네임스페이스에 대한 작업에 소비된 총 시간 (밀리초).
  • read ms: 읽기 작업에 소비된 총 시간 (밀리초).
  • write ms: 쓰기 작업에 소비된 총 시간 (밀리초).
  • %total: 해당 네임스페이스에 대한 작업에 소비된 총 시간의 백분율.
  • %read: 읽기에 소비된 총 작업 시간의 백분율.
  • %write: 쓰기에 소비된 총 작업 시간의 백분율.

mongotop 사용 방법:

MongoDB 데이터베이스 도구가 설치되어 있고 PATH에서 접근할 수 있다면 터미널에서 직접 mongotop을 실행할 수 있습니다. 기본적으로 1초마다 업데이트됩니다. 간격을 초 단위로 지정할 수도 있습니다.

mongotop

업데이트 간격 지정 (예: 5초마다):

mongotop 5

다른 호스트 및 포트에서 실행 중인 MongoDB 인스턴스에 대해 mongotop 실행:

mongotop --host <hostname> --port <port>

mongotop 출력 해석:

  • 특정 컬렉션에 대한 높은 write ms 또는 %write: 해당 컬렉션에 쓰기 작업이 집중되고 있음을 나타냅니다. 애플리케이션에서 성능 저하가 발생하면 이 컬렉션이 병목 현상이 될 수 있습니다. 쓰기 작업, 인덱싱을 최적화하거나 쓰기 처리량이 주요 관심사라면 샤딩을 고려하십시오.
  • 높은 read ms 또는 %read: 쓰기와 마찬가지로 컬렉션에 대한 높은 읽기 활동도 조사가 필요합니다. 읽기 작업을 가속화하기 위해 올바른 인덱싱을 사용하고 있는지 확인하십시오. 최적화되지 않은 쿼리에서 오는 대규모 결과 세트도 높은 읽기 시간에 기여할 수 있습니다.
  • 일관되게 높은 total ms를 가진 컬렉션: 이들은 가장 많이 사용되는 컬렉션입니다. 성능을 면밀히 모니터링하고 잘 인덱싱되고 효율적으로 쿼리되고 있는지 확인하는 것이 필수적입니다.

mongostat 이해하기

mongostat은 MongoDB 인스턴스의 성능 및 리소스 사용률에 대한 더 광범위한 실시간 개요를 제공합니다. 초당 작업 수, 네트워크 트래픽, 디스크 I/O 및 메모리 사용량과 같은 서버 상태에 대한 다양한 메트릭을 수집하고 표시합니다.

mongostat에서 제공하는 핵심 메트릭:

  • insert: 초당 삽입 작업 수.
  • query: 초당 쿼리 작업 수.
  • update: 초당 업데이트 작업 수.
  • delete: 초당 삭제 작업 수.
  • getmore: 초당 getmore 작업 수 (커서에 사용).
  • command: 초당 명령 작업 수.
  • dirty %: 메모리에서 더티 페이지 비율.
  • used %: WiredTiger 캐시 사용률.
  • conn: 현재 연결 수.
  • networkIn: 서버에서 수신한 네트워크 트래픽 (바이트).
  • networkOut: 서버에서 보낸 네트워크 트래픽 (바이트).
  • res: MongoDB 프로세스에서 사용하는 상주 메모리 크기 (MB).
  • qr|aw: 읽기 및 쓰기 작업의 큐 깊이.
  • dirty: 아직 디스크에 쓰여지지 않은 수정된 데이터의 바이트 수.
  • used: WiredTiger 캐시에 있는 데이터의 바이트 수.
  • flushed: WiredTiger 캐시에서 디스크로 플러시된 바이트 수.
  • idx miss %: 인덱스 놓침 비율.

mongostat 사용 방법:

mongostat도 명령줄 유틸리티입니다. mongotop과 유사하게 주기적으로 업데이트되며 기본 간격은 5초입니다. 다른 간격 및 연결 세부 정보를 지정할 수 있습니다.

mongostat

업데이트 간격 지정 (예: 2초마다):

mongostat 2

원격 MongoDB 인스턴스에 연결:

mongostat --host <hostname> --port <port>

mongostat 출력 해석:

  • 높은 insert, query, update 또는 delete 속도: 작업량이 많음을 나타냅니다. 시스템이 따라가고 있는지 이해하기 위해 다른 메트릭과 함께 모니터링하십시오.
  • 높은 conn: 많은 수의 연결은 서버 리소스에 부담을 줄 수 있습니다. 이 수치가 예상보다 높으면 애플리케이션의 연결 풀링을 조사하십시오.
  • 높은 networkIn 또는 networkOut: 상당한 데이터 전송을 시사합니다. 이는 대규모 쿼리, 복제 트래픽 또는 반환되는 대규모 결과 세트 때문일 수 있습니다.
  • 높은 res: MongoDB 프로세스가 많은 RAM을 사용하고 있습니다. 서버에 충분한 메모리가 있는지 확인하고 높은 메모리 사용량에 기여할 수 있는 비효율적인 쿼리나 대규모 데이터 세트를 확인하십시오.
  • 높은 qr 또는 aw: 읽기 또는 쓰기 작업이 큐에 쌓이고 있음을 나타내며, 이는 데이터베이스가 수요를 따라가지 못하고 있음을 의미합니다. 이는 성능 병목 현상의 강력한 지표입니다.
  • 높은 dirty % 또는 used % (WiredTiger 캐시): WiredTiger 캐시가 지속적으로 100%에 가깝게 사용되면 워킹 세트가 사용 가능한 RAM을 초과하여 디스크 활동이 더 많이 발생할 수 있습니다. RAM을 늘리거나 데이터 액세스 패턴을 최적화하는 것을 고려하십시오.
  • 높은 idx miss %: 높은 인덱스 놓침 비율은 쿼리가 컬렉션 전체 스캔을 수행할 가능성이 높다는 것을 의미하며, 이는 매우 비효율적입니다. 이는 누락되거나 잘못 설계된 인덱스를 가리키는 중요한 메트릭입니다.

실제 사용 사례 및 문제 해결 시나리오

시나리오 1: 느린 애플리케이션 성능

  1. mongostat 실행: qr, aw, insert, query, update, delete 속도를 관찰합니다. qr 또는 aw가 높거나, 작업 속도가 높지만 빠르게 처리되지 않는 것처럼 보이면 백로그가 있음을 시사합니다.
  2. mongotop 실행: 가장 많은 read mswrite ms를 경험하는 컬렉션을 식별합니다. 쓰기 활동이 많은 컬렉션이 다른 작업 속도를 늦출 수 있습니다.
  3. mongostat에서 idx miss % 확인: 높은 경우 mongotop에서 식별한 컬렉션의 인덱싱에 집중하십시오.
  4. mongostatnetworkIn/networkOut 분석: 비정상적으로 높은 경우, 인덱싱되지 않은 쿼리가 많은 문서를 반환하거나 대규모 집계로 인해 대량의 데이터 전송이 발생할 수 있습니다.

시나리오 2: 높은 CPU 또는 메모리 사용량

  1. mongostat 실행: res (상주 메모리) 및 CPU 사용량 (종종 top 또는 htop과 같은 시스템 도구를 통해 관찰 가능하지만, mongostat은 DB별 관점을 제공합니다)을 모니터링합니다. 높은 res는 WiredTiger 캐시 (used %)와 관련이 있을 수 있습니다.
  2. mongotop 검토: 특정 컬렉션에 대한 높은 읽기/쓰기 ms는 CPU 사용량 증가에 기여할 수 있습니다.
  3. mongostat의 작업 속도 확인: 삽입/업데이트/삭제가 매우 높으면 자연스럽게 CPU를 소모합니다.
  4. mongostatdirtyflushed 조사: dirty가 지속적으로 증가하고 flushed가 낮으면 디스크 I/O가 병목 현상이 되어 쓰기가 충분히 빠르게 커밋되지 못하게 하고 메모리 압력을 유발할 수 있습니다.

시나리오 3: 복제 지연

mongotopmongostat은 복제 지연을 직접 측정하지는 않지만, 지연의 원인을 이해하는 데 중요합니다.

  1. 기본 노드에서 mongostat 실행: 높은 qr 또는 aw, 높은 쓰기 작업 속도 또는 높은 CPU/메모리 사용량을 확인합니다. 기본 노드가 과부하되면 oplog에 효율적으로 쓸 수 없어 보조 노드의 지연이 발생합니다.
  2. 보조 노드에서 mongostat 실행: 읽기/쓰기 작업을 관찰합니다. 보조 노드가 oplog 항목을 적용하는 데 느리다면, 보조 노드의 리소스 부족이나 적용되는 비효율적인 쿼리/작업 때문일 수 있습니다.

팁 및 모범 사례

  • 도구 정기 실행: 성능 문제가 발생할 때까지 기다리지 마십시오. MongoDB 인스턴스를 사전에 모니터링하십시오.
  • 기준선 설정: 배포에 대한 "정상" 상태를 이해하십시오. 이렇게 하면 편차를 더 쉽게 발견할 수 있습니다.
  • 다른 도구와 결합: mongotopmongostat은 실시간 스냅샷에 탁월합니다. 기록 분석을 위해 MongoDB 내장 성능 모니터링 (예: db.serverStatus(), db.stats()) 또는 MongoDB Exporter를 사용한 Prometheus와 같은 외부 도구 또는 클라우드 제공업체 모니터링 서비스를 고려하십시오.
  • 워킹 세트 이해: 활성 데이터 세트의 크기를 아는 것은 메모리 관리 및 WiredTiger 캐시 효율성 이해에 중요합니다.
  • 인덱스에 집중: mongostatidx miss % 메트릭은 누락되거나 비효율적인 인덱스가 느린 쿼리의 주요 원인임을 강력하게 나타냅니다.
  • 연결 풀링 고려: 높은 conn 수는 종종 애플리케이션 계층에서 적절한 연결 풀링을 구현하여 완화할 수 있습니다.

결론

mongotopmongostat은 모든 MongoDB 관리자 또는 개발자에게 필수적인 명령줄 도구입니다. MongoDB 인스턴스의 운영 상태 및 리소스 사용량에 대한 즉각적이고 실시간 통찰력을 제공합니다. 노출된 메트릭을 이해하고 애플리케이션 워크로드의 맥락에서 출력을 해석하는 방법을 배우면 성능 병목 현상을 신속하게 진단하고, 리소스 경합을 식별하며, MongoDB 배포를 최적화하기 위한 표적 조치를 취할 수 있습니다. 이러한 도구를 정기적으로 사용하고 데이터베이스 동작에 대한 견고한 이해를 결합하면 더 안정적이고 성능이 뛰어나며 신뢰할 수 있는 애플리케이션을 얻을 수 있습니다.