300x250
- MongoDB의 성능 저하와 관련된 문제를 해결하려면 아래와 같은 주요 단계들을 점검하고 최적화 방안을 고려해야 합니다.
- cache dirty가 증가하고 있는 상황은 메모리 관리 및 데이터 처리와 밀접한 연관이 있으므로, 이를 포함한 종합적인 접근이 필요합니다.
Cache Dirty 문제 분석
MongoDB에서 cache dirty가 증가하는 주요 원인은 다음과 같습니다
- 쓰기 작업의 과도한 증가: 데이터가 빠르게 쓰여지고 있지만, 디스크로의 flush 속도가 이를 따라가지 못할 때 발생합니다.
- 메모리 부족: MongoDB가 데이터 캐싱에 필요한 메모리를 충분히 확보하지 못하는 경우.
- WiredTiger 캐시 부족: WiredTiger 엔진은 기본적으로 메모리의 50%를 사용하며, 이 캐시가 부족하면 문제가 발생할 수 있습니다.
조치 방안
- cache eviction 상태 확인: db.serverStatus().wiredTiger.cache 명령으로 eviction 관련 상태를 확인
db.serverStatus().wiredTiger.cache
- dirty cache 비율 확인: 해당 비율이 너무 높으면, 데이터를 디스크로 쓰는 속도를 높이는 설정이 필요합니다.
- journalCompressor: Snappy, zlib 등의 설정을 적절히 사용하여 디스크 I/O를 최적화합니다.
- writeConcern 조정: 쓰기 작업의 writeConcern 옵션을 낮춰 I/O 부담을 줄여야 할 수도 있습니다.
MongoDB 인스턴스의 현재 상태 점검
성능 저하가 발생하는 정확한 원인을 분석하기 위해 다음을 확인하세요
- 디스크 I/O 사용량
iostat -x
- 디스크가 과도한 쓰기 작업으로 병목이 발생하고 있는지 확인합니다.
- 메모리 사용량 확인: MongoDB가 메모리를 제대로 활용하고 있는지 확인.
free -m
- 쿼리 성능 분석: 실행 중인 쿼리가 비효율적인 경우가 많습니다. 느린 쿼리를 확인하고 인덱스를 최적화해야 합니다.
db.currentOp({ "active": true })
db.system.profile.find().sort({ ts: -1 }).limit(10)
최적화 방안
(1) 인덱스 최적화
- 인덱스를 점검하여 불필요한 Full Collection Scan을 방지하세요
db.collection.getIndexes()
- 쿼리에 자주 사용되는 필드가 인덱스에 포함되어 있는지 확인합니다.
(2) 샤딩 도입
데이터가 많아졌다면 샤딩(Sharding)을 고려해야 합니다.
- 데이터를 샤드 키를 기준으로 분산하면 I/O 병목을 줄일 수 있습니다.
- 샤드 키는 쿼리 패턴에 맞춰 선택해야 하며, 가능한 균등하게 데이터를 분산하도록 설정합니다.
(3) 아카이빙 및 데이터 파티셔닝
- 오래된 데이터를 주기적으로 아카이빙하거나 별도의 디비로 분리하여 운영.
- TTL 인덱스를 사용해 특정 기간이 지난 데이터를 자동으로 삭제
db.collection.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 })
(4) WiredTiger 캐시 설정 조정
MongoDB의 기본 캐시 비율을 늘리는 것을 고려.
- --wiredTigerCacheSizeGB를 통해 WiredTiger 캐시 크기를 조정
mongod --wiredTigerCacheSizeGB 4
(5) 하드웨어 업그레이드
- 디스크: SSD로 업그레이드하면 IOPS(초당 입출력 작업 수)가 개선됩니다.
- 메모리 추가: MongoDB는 메모리에 의존하므로 충분한 메모리를 확보하세요.
300x250
'IT > 몽고DB' 카테고리의 다른 글
몽고DB - mongos (0) | 2025.02.19 |
---|---|
몽고DB expire after 동작 주기 (1) | 2025.02.13 |
몽고DB 쿼리 실행계획 조회 (0) | 2025.02.11 |
MongoDB 샤드키 선정 정책 (0) | 2025.02.06 |
MongoDB 클러스터 구성 요건 (0) | 2025.02.06 |