다음에 대한 성능 문제 해결 Databases for MongoDB

이 가이드를 사용하여 IBM Cloud 에서 실행되고 MongoDB 에 의해 구동되는 Databases for MongoDB 배포의 성능 문제를 식별하고 해결하는 데 도움을 받으십시오.

성능 문제 해결에 대한 자세한 내용은 아래에서 확인할 수 있습니다:

애플리케이션에서 느린 응답, 시간 초과 또는 일관성 없는 데이터베이스 성능이 발생하는 경우 다음 단계와 정보를 고려하세요.

성능 문제의 증상

성능 문제를 나타내는 다음 증상 중 일부가 관찰될 수 있습니다:

  • 애플리케이션 지연 시간 증가
  • 느린 쿼리 로그 항목
  • 높은 CPU 또는 메모리 사용률
  • 디스크 지연 시간 증가
  • 복제 지연
  • 연결 제한시간

다음 단계를 완료하여 문제의 원인을 파악하세요:

1단계: 리소스 사용률 확인

  1. IBM Cloud 콘솔에 로그인하고 MongoDB 배포로 이동합니다.

  2. 모니터링 섹션을 검토하세요:

    • CPU 이용률
    • 메모리 사용량
    • 디스크 IOPS 및 지연 시간
    • 활성 연결

살펴봐야 할 사항

  • CPU가 지속적으로 75% 이상
  • 지속적으로 80% 이상의 메모리
  • 시간이 지남에 따라 증가하는 디스크 지연 시간
  • 요금제 한도에 근접한 연결

권장 조치:

  • 디스크 지연 시간이 길면 스토리지 또는 IOPS를 늘립니다.
  • 애플리케이션의 워크로드 급증을 검토하세요.

리소스 사용량이 지속적으로 높은 수준을 유지하는 경우 확장하는 것이 좋습니다.

2단계: 느린 쿼리 식별

느린 쿼리는 성능 저하의 가장 일반적인 원인 중 하나입니다.

  1. 프로파일링을 사용 설정합니다:

    db.setProfilingLevel(1, { slowms: 100 })
    
  2. 최근 느린 작업을 검토합니다:

    db.system.profile.find().sort({ ts: -1 }).limit(20)
    
  3. 쿼리 실행을 분석합니다:

    db.collection.find({ ... }).explain("executionStats")
    

살펴봐야 할 사항

  • COLLSCAN (인덱스 사용 대신 컬렉션 스캔)
  • 높음 totalDocsExamined 에 비해 nReturned

권장 조치:

  • 적절한 인덱스를 만듭니다.
  • 다중 필드 쿼리에는 복합 인덱스를 사용합니다.
  • 집계 파이프라인이 $match 로 시작하도록 합니다.
  • skip() 페이지 매김을 피하세요.

3단계: 연결 사용량 검토

연결이 많거나 제대로 관리되지 않으면 성능에 영향을 미칠 수 있습니다.

연결 통계를 확인합니다:

db.serverStatus().connections

권장 조치:

  • 애플리케이션에서 연결 풀링을 사용하세요.
  • 각 요청에 대해 새 연결을 열지 마세요.
  • 사용하지 않는 커서를 닫습니다.

연결 제한은 배포 계획에 따라 결정됩니다.

4단계: 복제 상태 확인

복제 지연은 읽기 성능과 데이터 최신성에 영향을 줄 수 있습니다.

복제 상태를 확인합니다:

rs.printSecondaryReplicationInfo()

지연의 일반적인 원인:

  • 높은 쓰기 처리량
  • 디스크 병목 현상
  • 네트워크 대기 시간

권장 조치:

  • 스토리지 성능을 확장하세요.
  • 우려 사항 쓰기 설정을 검토합니다.
  • 지연이 지속되면 더 높은 요금제로 확장하세요.

5단계: 샤드 클러스터 고려 사항(해당되는 경우)

다음과 같은 상황에서 샤딩이 필요할 수 있습니다:

  • 작업 세트가 RAM보다 큼
  • 확장 후에도 최대치를 기록한 단일 노드 IOPS
  • 가로 쓰기 스케일링이 필요합니다
  • 컬렉션이 1-2TB를 초과합니다

자세한 내용은 성능 튜닝샤딩을 참조하세요.

배포에 샤딩을 사용하는 경우 실행합니다:

sh.status()

확인:

  • 고르지 않은 청크 분포
  • 점보 청크
  • 단일 샤드에 집중된 트래픽

권장 조치:

  • 샤드 키 선택을 검토합니다.
  • 샤드 키가 단조롭게 증가하지 않도록 하세요.
  • 해시된 샤드 키를 고려하세요.

부적절한 샤드 키 선택은 규모에 따라 성능에 큰 영향을 미칠 수 있습니다.

6단계: 대용량 데이터 삭제 후

데이터의 상당 부분을 삭제해도 운영 체제 수준에서 디스크 사용량이 즉시 줄어들지는 않습니다.

가능한 영향:

  • 내부 파편화
  • 높은 디스크 사용률
  • 성능 저하

권장 조치:

  • 다짐 작업을 신중하게 계획하세요.
  • 조각화가 심한 경우 덤프 및 복원을 고려하세요.
  • 디스크 사용률을 80~85% 미만으로 유지하세요.

유지 관리 활동을 적절하게 예약하세요.

7단계: 잠금 경합 확인

잠금 경합은 동시 작업과 전체 처리량에 심각한 영향을 미칠 수 있습니다.

  • 글로벌 잠금 통계를 확인합니다:

    db.serverStatus().locks
    
  • 현재 작업에서 잠금이 있는지 확인합니다:

    db.currentOp({
      $or: [
        { waitingForLock: true },
        { "locks.Global": "w" }
      ]
    })
    
  • 잠금 대기 시간을 분석합니다:

    db.serverStatus().globalLock
    

살펴봐야 할 사항

  • 높은 currentQueue 값(독자 또는 작성자).
  • waitingForLock: true 로 작업합니다.
  • 잠금을 유지하는 장기 실행 작업.
  • 작업을 차단하는 인덱스 빌드.

일반적인 원인:

  • 적절한 인덱스가 없는 장기 실행 쿼리.
  • 대용량 쓰기 작업.
  • 인덱스는 대규모 컬렉션을 기반으로 구축됩니다.
  • 관리 명령(콤팩트, repairDatabase ).

권장 조치:

  • 필요한 경우 장기 실행 작업을 종료합니다:
    db.killOp(opid)
    
  • 백그라운드에서 인덱스를 작성합니다:
    db.collection.createIndex({ field: 1 }, { background: true })
    
  • 대규모 작업을 작은 배치로 나누세요.
  • 트래픽이 적은 기간에 유지보수 작업을 예약하세요.
  • 관심사 읽기 및 관심사 쓰기를 적절하게 사용하세요.

8단계: 워크로드 패턴 분석

워크로드 패턴을 이해하면 최적화 기회를 파악하는 데 도움이 됩니다.

  • 작업 카운터를 확인합니다:

    db.serverStatus().opcounters
    
  • 시간 경과에 따른 운영을 분석하세요:

    db.serverStatus().opcountersRepl
    
  • 인기 컬렉션을 식별합니다:

    db.adminCommand({ top: 1 })
    
  • 쓰기 비율과 비교하여 읽기 비율을 확인합니다:

    var stats = db.serverStatus().opcounters;
    print("Read ratio: " + (stats.query + stats.getmore) / (stats.query + stats.getmore + stats.insert + stats.update + stats.delete));
    

살펴봐야 할 사항

  • 특정 컬렉션에 대한 불균형한 작업
  • 높은 읽기 대 쓰기 또는 쓰기 대 읽기 비율
  • 작업 횟수의 갑작스러운 급증
  • 시간 기반 패턴(피크 시간대)

권장 조치:

  • 자주 액세스하는 컬렉션을 먼저 최적화하세요.
  • 읽기가 많은 워크로드에는 읽기 복제본을 고려하세요.
  • 적절한 읽기 환경설정을 사용하세요.
  • 자주 읽는 데이터에 대한 캐싱을 구현하세요.
  • 인기 컬렉션에 대한 인덱싱 전략을 검토하세요.
  • 쓰기량이 많은 컬렉션의 경우 샤딩을 고려하세요.

9단계: 메모리 압박 및 캐시 효율성 조사

MongoDB's WiredTiger 스토리지 엔진은 캐시 효율성에 크게 의존합니다.

  • WiredTiger 캐시 통계를 확인하세요:

    db.serverStatus().wiredTiger.cache
    
  • 주요 지표를 검토합니다:

    var cache = db.serverStatus().wiredTiger.cache;
    print("Cache size: " + cache["bytes currently in the cache"]);
    print("Max cache size: " + cache["maximum bytes configured"]);
    print("Pages read into cache: " + cache["pages read into cache"]);
    print("Pages written from cache: " + cache["pages written from cache"]);
    print("Cache hit ratio: " + (1 - cache["pages read into cache"] / (cache["pages read into cache"] + cache["pages requested from the cache"])));
    
  • 퇴거 압력이 있는지 확인하세요:

    db.serverStatus().wiredTiger.cache["pages evicted by application threads"]
    

살펴봐야 할 사항

  • 캐시 적중률 95% 미만
  • 높은 퇴거율
  • 캐시 크기를 지속적으로 최대로 유지
  • 퇴거를 수행하는 애플리케이션 스레드

작업 세트 크기를 추정합니다:

db.serverStatus().wiredTiger.cache["tracked dirty bytes in the cache"]

권장 조치:

  • 캐시가 지속적으로 가득 차면 메모리가 더 많은 요금제로 확장하세요.
  • 인덱스 검토 및 최적화(사용하지 않는 인덱스 제거).
  • 쿼리에서 결과 집합 크기를 제한합니다.
  • 투영을 사용하여 문서 크기를 줄이세요.
  • 오래된 데이터 아카이빙을 고려하세요.
  • 작업 세트 크기 추세를 모니터링합니다.

메모리 할당 모범 사례

  • WiredTiger 캐시는 사용 가능한 RAM의 50%(기본값)여야 합니다.
  • 다른 프로세스를 위해 충분한 메모리를 남겨두세요.
  • 스왑 사용량은 최소한으로 모니터링합니다.

10단계: 쓰기 우려 사항 및 읽기 환경 설정 검토

쓰기 우려 및 읽기 환경 설정은 성능과 일관성에 큰 영향을 미칩니다.

  • 현재 쓰기 우려 사항을 확인합니다:

    db.getWriteConcern()
    
  • 복제본 세트 구성을 확인합니다:

    rs.conf()
    
  • 우려 사항 작성 옵션:

    우려 사항 작성 옵션
    우려 사항 작성 내구성 성능 유스 케이스
    w: 1 낮음 높음 중요하지 않은 데이터, 높은 처리량
    w: "majority" 높음 중간 기본적이고 균형 잡힌 접근 방식
    w: <number> 중간-높음 중간-낮음 특정 복제본 수
    j: true 최고 최하 저널 동기화가 필요한 중요 데이터
  • 읽기 환경설정 옵션:

    읽기 환경설정 옵션
    읽기 기본 설정 일관성 성능 유스 케이스
    primary 최고 중간 기본, 강력한 일관성
    primaryPreferred 높음 중간-높음 보조로 폴백
    secondary 최종 높음 분석, 보고
    secondaryPreferred 최종 높음 읽기 스케일링
    nearest 최종 최고 가장 짧은 지연 시간
  • 애플리케이션에서 읽기 기본 설정을 확인합니다:

    // Example in Node.js driver
    db.collection('users').find({}).readPreference('secondary')
    

살펴봐야 할 사항

  • 중요하지 않은 데이터에 대한 지나치게 엄격한 쓰기 우려
  • 최종 일관성이 허용되는 경우 primary 읽기 기본 설정 사용
  • 읽기 부하가 많은 워크로드에 보조를 활용하지 않음

권장 조치:

  • 처리량이 많고 중요하지 않은 쓰기 작업에는 w: 1 을 사용하세요.
  • 중요한 데이터는 w: "majority" (기본값)을 사용합니다.
  • 분석 쿼리에는 secondary 또는 secondaryPreferred 을 사용합니다.
  • 지리적으로 분산된 애플리케이션의 경우 nearest 을 고려하세요.
  • 일관성 요구 사항과 성능 요구 사항의 균형을 맞추세요.
  • 부하가 걸린 상태에서 다양한 구성을 테스트합니다.

11단계: 백업 및 유지 관리 영향 모니터링

백업 작업 및 유지 관리 작업은 일시적으로 성능에 영향을 줄 수 있습니다.

IBM Cloud 백업 일정

Databases for MongoDB 자동으로 백업을 수행합니다. IBM Cloud 콘솔의 백업에서 백업 일정을 확인하세요.

백업 작업이 진행 중인지 확인합니다:

db.currentOp({
  $or: [
    { op: "command", "command.backup": { $exists: true } },
    { desc: /^conn/ }
  ]
})

살펴봐야 할 사항

  • 백업 기간 중 성능 저하
  • 백업 중 디스크 I/O 증가
  • 백업 중 복제 지연

권장 조치:

  • 백업 시간 동안 성능 메트릭을 모니터링하세요.
  • 백업이 지속적으로 성능에 영향을 미치는 경우 확장을 고려하세요.
  • 백업 보존 정책을 검토합니다.
  • 복원 작업 중 리소스 사용량 증가에 대비하세요.

유지 관리 운영 모범 사례

  • 트래픽이 적은 시간대에 인덱스 빌드를 예약합니다.
  • 가능하면 백그라운드 인덱스 빌드를 사용하세요.
  • 유지 관리 중 복제 지연을 모니터링하세요.
  • 먼저 비프로덕션 환경에서 유지 관리 작업을 테스트하세요.
  • IBM Cloud 유지 관리 창과 협력하세요.