다음에 대한 성능 문제 해결 Databases for MongoDB
이 가이드를 사용하여 IBM Cloud 에서 실행되고 MongoDB 에 의해 구동되는 Databases for MongoDB 배포의 성능 문제를 식별하고 해결하는 데 도움을 받으십시오.
성능 문제 해결에 대한 자세한 내용은 아래에서 확인할 수 있습니다:
애플리케이션에서 느린 응답, 시간 초과 또는 일관성 없는 데이터베이스 성능이 발생하는 경우 다음 단계와 정보를 고려하세요.
성능 문제의 증상
성능 문제를 나타내는 다음 증상 중 일부가 관찰될 수 있습니다:
- 애플리케이션 지연 시간 증가
- 느린 쿼리 로그 항목
- 높은 CPU 또는 메모리 사용률
- 디스크 지연 시간 증가
- 복제 지연
- 연결 제한시간
다음 단계를 완료하여 문제의 원인을 파악하세요:
1단계: 리소스 사용률 확인
-
IBM Cloud 콘솔에 로그인하고 MongoDB 배포로 이동합니다.
-
모니터링 섹션을 검토하세요:
- CPU 이용률
- 메모리 사용량
- 디스크 IOPS 및 지연 시간
- 활성 연결
살펴봐야 할 사항
- CPU가 지속적으로 75% 이상
- 지속적으로 80% 이상의 메모리
- 시간이 지남에 따라 증가하는 디스크 지연 시간
- 요금제 한도에 근접한 연결
권장 조치:
- 디스크 지연 시간이 길면 스토리지 또는 IOPS를 늘립니다.
- 애플리케이션의 워크로드 급증을 검토하세요.
리소스 사용량이 지속적으로 높은 수준을 유지하는 경우 확장하는 것이 좋습니다.
2단계: 느린 쿼리 식별
느린 쿼리는 성능 저하의 가장 일반적인 원인 중 하나입니다.
-
프로파일링을 사용 설정합니다:
db.setProfilingLevel(1, { slowms: 100 }) -
최근 느린 작업을 검토합니다:
db.system.profile.find().sort({ ts: -1 }).limit(20) -
쿼리 실행을 분석합니다:
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 유지 관리 창과 협력하세요.