MongoDB 성능 최적화

EnoSoup·2021년 7월 23일
0

MongoDB

목록 보기
5/5
post-thumbnail

MongoDB OS

MongoDB를 가장 많이 설치하는 OS는 리눅스 입니다.

  • 샤딩 및 레플리카셋을 구성해서 고가용성을 확보하는 것도 중요하지만, 그에 앞서 우선 MongoDB가 최상의 상태로 동작할 수 있도록 OS(리눅스) 시스템 튜닝을 먼저 적용해 주어야 한다.
  • 실제 프로젝트를 진행하면서 설정 값의 차이로 인한 성능이 극과 극을 달리는 경우가 있었다.

mongodb 디스크 및 스토리지 시스템

Swap

  • MongoDB는 스왑에서 데이터를 검색하는 것이 RAM의 데이터에 액세스하는 것보다 항상 느리기
    때문에 스와핑을 피하거나 최소한으로 유지할 수있는 경우 가장 잘 수행됩니다.
    그러나 MongoDB를 호스팅하는 시스템에 RAM이 부족한 경우 스와핑으로 인해 Linux OOM Killer가
    mongod프로세스 를 종료하지 못할 수 있습니다.

시스템에 스왑 공간을 할당하지 말고 스왑을 완전히 비활성화하도록 커널을 구성하십시오.

  • sysctl.conf 설정
$ sudo vi /etc/sysctl.conf
vm.swappiness = 1

RAID

스토리지 계층 측면에서 최적의 성능을 얻으려면 RAID-10이 지원하는 디스크를 사용하십시오.

  • RAID-5 및 RAID-6은 일반적으로 MongoDB 배포를 지원하기에 충분한 성능을 제공하지 않습니다.

커널 및 파일시스템

Linux에서 프로덕션 환경에서 MongoDB를 실행하는 경우 XFS 또는 EXT4 파일 시스템과 함께 Linux 커널 버전 2.6.36 이상을 사용해야합니다.

  • 가능하면 일반적으로 MongoDB에서 더 잘 수행되는 XFS를 사용하십시오.

System 튜닝

$ sudo vi docker-compose.yml
version: "2.4"

services:
  mongodb:
    image: mongo:4.2.5
    restart: always
    network_mode: host
    environment:
      - TZ=Asia/Seoul
    mem_limit: 30g
    volumes:
      - /etc/mongod.conf:/etc/mongod.conf
      - /data/db:/data/db
      - /data/journal:/data/db/journal
      - /data/log:/var/log/mongodb
    entrypoint: ["mongod", "-f", "/etc/mongod.conf"]
    container_name: "mongodb"

    # limits 설정 반영
    ulimits:
      nproc: 64000
      nofile:
        soft: 64000
        hard: 64000

sysctl.conf 설정

$ sudo vi /etc/sysctl.conf
vm.dirty_ratio = 7
vm.dirty_background_ratio = 2
vm.swappiness = 1

net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_max_syn_backlog = 4096

MongoDB THP 기능 비활성화

Linux는 메모리에 대한 관리를 Pages 단위로 관리/사용되고 있고 기본 페이지는 4096바이트(4K)로 고정되어 있습니다.

1GB의 메모리는 256,000개의 page로 구성되어있는 것이고 이러한 페이지는 메모리 크기가 늘어남에 따라 관리테이블(TLB)도 커지게 되어 OS의 관리되는 요건이 늘어난다 던지 메모리를 Access 하는 과정에서의 많은 페이지로 인하여 overhead 가 발생할수 있는 내역이 존재 합니다.

이런 문제를 해결하기 위해서는 페이지의 크기를 확대하는 방법이 도입되었으며 이것을 Huge Pages라 지칭하며 보통 Oracle과 같은 DB서버에서 활용하곤 합니다.

이런 hugepage는 커널파라미터를 지정하여 재부팅을 하거나 kernel 파라미터를 필요할때 마다 설정후 systel -p 등으로 적용하는 작업이나 관리 요소가 필요 하였기 때문에 이를 자동으로 관리 해주는 기능은 Transparent Huge Pages(THP) 이 도입되었고 어플리케이션의 많은 메모리를 요구하게 되면 알아서 2MB large page 를 할당을 해주게 되는데 이러한 과정에서 오히려 performance degree 현상이나 application crash 가 발생하는등 side effect가 발생되는 사례가 나타났습니다.

하여 많은 어플리케이션의 knowledge document나 support 문서등에서는 처음부터 THP 의 disable 설정을 권고 하는 어플리케이션도 많이 있습니다(ie oracle, mongodb .. etc)

  • THP 기능 비활성화
$ sudo su
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
$ echo never > /sys/kernel/mm/transparent_hugepage/defrag
profile
Cloud Engineer@Plateer. 클라우드 상에서 엔지니어링을 재미있게 하는 엔지니어입니다.

0개의 댓글