공대생 정리노트

mongdoDB 내부 캐시 본문

로드맵/DB

mongdoDB 내부 캐시

woojinger 2022. 1. 27. 23:31

https://docs.mongodb.com/manual/core/wiredtiger/

 

WiredTiger Storage Engine — MongoDB Manual

Docs Home → MongoDB ManualStarting in MongoDB 3.2, the WiredTiger storage engine is the default storage engine. For existing deployments, if you do not specify the --storageEngine or the storage.engine setting, the version 3.2+ mongod instance can automa

docs.mongodb.com


WiredTiger Storage Engine

WiredTiger 엔진은 mongoDB 3.2 버전부터 사용한 기본 엔진이다.

 

몽고DB는 WiredTiger 내부 캐시와 파일 시스템의 캐시를 둘 다 사용한다.

파일 시스템 캐시를 통해 WiredTiger 캐시나 다른 프로세스가 사용하지 않는 모든 free 메모리를 몽고DB는 사용한다.

 

파일 시스템 캐시는 운영체제가 디스크 I/O를 줄이기 위해서 캐시를 하는 것을 말한다.

파일 시스템 캐시는 운영체제가 관리하는 것이므로 이 포스팅에서는 다루지 않겠다.

 

WiredTiger의 default 내부 캐시는 (RAM - 1GB)/2 와 256MB 중 큰 사이즈로 설정이 된다.

공식 문서에서는 기본 값 이상으로 내부 캐시 사이즈 크기를 증가시키는 것을 권장하지 않는다.

 

WiredTiger는 collection과 인덱스를 압축해서 저장을 하고 있는데, 내부 캐시에서 사용을 할 때는 압축이 되어 있지 않은 상태로 사용을 한다. 

 

https://docs.mongodb.com/manual/reference/program/mongod/#wiredtiger-options

 

mongod — MongoDB Manual

Docs Home → MongoDB Manualmongod is the primary daemon process for the MongoDB system. It handles data requests, manages data access, and performs background management operations.This document provides a complete overview of all command line options for

docs.mongodb.com

몽고디비 서버를 띄울 시 옵션을 주어 내부 캐시 사이즈를 변경해서 올릴 수 있다.

 

리눅스 쉘에서 사용하고 있는 메모리 확인

free
// -b, -k, -m, -g : 바이트, KB, MB, GB 단위로 출력
// -h : human readable
// -s : 몇 초마다 print를 할 것인지

몽고DB를 띄운 장비에서 메모리 확인을 해보면 생각보다 많은 메모리를 사용하고 있을 것이다.

WiredTiger 캐시가 default 설정으로 메모리 절반을 사용할 수 있기 때문에 오래 몽고DB를 사용했다면 메모리 사용량이 꽤 크다.

 

몽고DB 쉘에서 WiredTiger 캐시 메모리 확인

db.serverStatus().wiredTiger.cache

몽고DB 쉘에서 다음 명령을 입력하면 wiredTiger cache에 대한 정보가 나온다.

  • 캐시에 들어가 있는 바이트 : "bytes currently in the cache"
  • 캐시가 수용할 수 있는 최대 바이트 : "maximum bytes configured"

몽고DB 쉘에서 현재 컬렉션의 데이터 사이즈 확인

https://docs.mongodb.com/manual/reference/method/db.collection.stats/#definition

db.collection.stats()
// collection은 원하는 collection 이름
  • storageSize : 컬렉션에 할당된 document 스토리지 byte. 기본 설정에 따라 압축된 사이즈이다
  • Size : 컬렉션의 모든 레코드가 압축되지 않았을 때의 사이즈. 컬렉션의 인덱스 사이즈는 포함하지 않는다.
  • totalIndexSize : 모든 인덱스 사이즈 크기

WiredTiger 캐시 메모리와 자신의 레코드들의 크기를 비교하면 page fault가 발생할지 안할지 대략적으로 판단을 할 수 있다.

 

간단한 실험

WiredTiger 캐시에 아무것도 캐싱이 되지 않았을 때와 한번 find를 한 후의 캐시를 비교하는 실험이다.

두 상태에서 다시 find를 했을 때 성능을 비교한다.

총 6000만개의 데이터 셋 중 특정 조건을 만족하는 레코드들을 가져오는 find로 수행하였으며, 성능이 어느 정도 차이가 나는지 비교하였다.

실험은 쉘에서 한 것이 아니라 어플리케이션에서 find를 하고 decode하는 시간까지 포함되어 있어 실행 시간이 훨씬 크게 잡혀있다.

 

캐싱이 되지 않았을 때

- 실행 전 캐시 메모리 :  1.27MB

- 실행 시간 : 10.1s

- 실행 후 캐시 메모리 : 1.5GB

 

캐싱이 한번 되었을 때

- 실행 전 캐시 메모리 : 1.5GB

- 실행 시간 : 9.2s

- 실행 후 캐시 메모리 : 1.5GB

 

당연한 얘기이지만 실행 시간이 감소하였다. 다만 생각보다 드라마틱한 변화를 이끌어내지는 못했다.

캐시 메모리도 변하지 않았다. 캐시의 원리를 생각하면 당연한 것이지만, 실제 눈으로 결과를 확인해보니 확 와닿았다.

'로드맵 > DB' 카테고리의 다른 글

Recovery System(1)  (0) 2022.03.19
mongoDB - 배열 인덱싱  (0) 2022.01.25
SQL VS NoSQL  (0) 2020.08.30
Comments