Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

자체 관리형 배포서버를 위한 TCMalloc 성능 최적화

이 페이지의 내용

  • 플랫폼 지원
  • THP(Transparent Huge Pages) 활성화
  • CPU별 캐시 활성화
  • 자세히 알아보기

버전 8.0에서 변경되었습니다.

MongoDB 8.0 부터 시작됩니다. MongoDB 는 스레드별 캐시 대신 개의 CPU별 캐시 를 사용하는 업그레이드된 버전의 TCMalloc을 사용하여 메모리 조각화를 줄이고 스트레스가 높은 워크로드에 대한 데이터베이스 의 복원력을 향상시킵니다.

새 TCMalloc 버전을 사용하려면 다음을 수행합니다.

  • 지원되는 운영 체제를 사용합니다.

  • THP를 활성화합니다.

  • CPU별 캐시를 활성화합니다.

MongoDB 8.0 을 지원 하는 운영 체제는 다음을 제외하고 업데이트된 TCMalloc도 지원 합니다.

이러한 운영 체제는 레거시 TCMalloc 버전을 사용합니다. 이러한 운영 체제를 사용하는 경우 THP를 비활성화합니다.

Windows 는 레거시 TCMalloc 버전을 사용하며 업데이트된 TCMalloc을 지원 하지 않습니다.

THP(Transparent Hugepages)는 TLB(Translation Lookaside Buffer) 조회의 오버헤드 를 줄이는 Linux 메모리 관리 시스템입니다. THP는 작은 페이지를 결합하여 애플리케이션 에 더 큰 메모리 페이지로 표시함으로써 이를 달성합니다.

MongoDB 8.0 이상에서는 mongod 가 시작되기 전에 플랫폼의 초기화 시스템에 대한 서비스 파일 을 생성하여 THP가 활성화되어 있는지 확인합니다. MongoDB 7.0 이전 버전을 사용하는 경우 THP를 비활성화합니다.

참고

시스템 수준에서 THP를 활성화 하고 프로세스 수준에서 비활성화할 수 있습니다. 단일 머신에 여러 MongoDB 프로세스가 있는 경우, 버전 8.0 의 프로세스는 THP를 활성화 하고 7.0 이전의 프로세스는 THP를 비활성화해야 합니다.

또한 ktunetuned 성능 프로필을 사용하는 RHEL 및 CentOS 시스템의 경우 사용자 지정 tuned 프로필도 만들어야 합니다.

THP를 활성화하는 서비스 파일 을 만들려면 플랫폼 내장 초기화 시스템을 사용하세요. 최신 버전의 Linux 는 일반적으로 systemctl 명령을 사용하는 systemd 를 사용합니다. 이전 버전의 Linux 는 service 명령을 사용하는 System V init 을 사용하는 경향이 있습니다. 자세한 내용은 운영 체제 설명서를 참조하세요.

플랫폼에 맞는 초기화 시스템을 사용하세요.

1

다음 파일을 생성하여 /etc/systemd/system/enable-transparent-huge-pages.service에 저장하세요.

[Unit]
Description=Enable Transparent Hugepages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo always | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null'
[Install]
WantedBy=basic.target

참고

Red Hat Enterprise Linux의 일부 버전과 잠재적으로 다른 Red Hat 기반 파생 제품은 THP enabled 파일에 대해 다른 경로를 사용합니다.

/sys/kernel/mm/redhat_transparent_hugepage/enabled

시스템에서 어떤 경로가 사용 중인지 확인하고 이에 따라 enable-transparent-huge-pages.service 파일을 업데이트하세요.

2

systemd 단위 파일을 다시 로드하고 enable-transparent-huge-pages.service를 사용할 수 있도록 하려면 다음 명령을 실행합니다.

sudo systemctl daemon-reload
3

실행:

sudo systemctl start enable-transparent-huge-pages

관련 THP 설정이 변경되었는지 확인하려면 다음 명령을 실행합니다.

cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory

Red Hat Enterprise Linux 및 잠재적으로 다른 Red Hat 기반 파생 제품에서는 대신 다음을 사용해야 할 수 있습니다:

cat /sys/kernel/mm/redhat_transparent_hugepage/enabled && cat /sys/kernel/mm/redhat_transparent_hugepage/defrag && cat /sys/kernel/mm/redhat_transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory

출력은 다음과 같아야 합니다.

always
defer+madvise
0
1
4

운영 체제가 시작될 때마다 이 설정이 적용되도록 하려면 다음 명령을 실행합니다.

sudo systemctl enable enable-transparent-huge-pages
5

RHEL/ CentOS 에서 tuned 또는 ktune 프로필을 사용하는 경우 사용자 지정 tuned 프로필도 만들어야 합니다.

1

다음 파일을 생성하여 /etc/init.d/enable-transparent-hugepages에 저장하세요.

#!/bin/bash
### BEGIN INIT INFO
# Provides: enable-transparent-hugepages
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: mongod mongodb-mms-automation-agent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Enable Linux Transparent Hugepages
# Description: Enable Linux Transparent Hugepages, to improve
# database performance.
### END INIT INFO
case $1 in
start)
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
thp_path=/sys/kernel/mm/transparent_hugepage
elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
thp_path=/sys/kernel/mm/redhat_transparent_hugepage
else
return 0
fi
echo 'always' | tee ${thp_path}/enabled > /dev/null && echo defer+madvise | tee ${thp_path}/defrag > /dev/null && echo 0 | tee ${thp_path}/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null'
unset thp_path
;;
esac
2

실행:

sudo chmod 755 /etc/init.d/enable-transparent-hugepages
3

실행:

sudo /etc/init.d/enable-transparent-hugepages start

관련 THP 설정이 변경되었는지 확인하려면 다음 명령을 실행합니다.

cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory

Red Hat Enterprise Linux 및 잠재적으로 다른 Red Hat 기반 파생 제품에서는 대신 다음을 사용해야 할 수 있습니다:

cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

출력은 다음과 같아야 합니다.

always
defer+madvise
0
1
4

운영 체제가 시작될 때마다 이 설정이 적용되도록 하려면 Linux 배포판에 대해 다음 명령을 실행하세요.

배포
명령
우분투 및 데비안
sudo update-rc.d enable-transparent-hugepages defaults
SUSE
sudo insserv /etc/init.d/enable-transparent-hugepages
Red Hat, CentOS, Amazon Linux 및 파생
sudo chkconfig --add enable-transparent-hugepages
5

RHEL/CentOS에서 tuned 또는 ktune 프로필을 사용하는 경우 사용자 지정 tuned 프로필도 만들어야 합니다.

중요

tuned 또는 ktune 을 사용하는 경우 서비스 파일 을 만든 후 이 섹션의 단계를 수행합니다.

tunedktune 은 시스템의 Transparent Hugepages 설정에 영향을 줄 수 있는 커널 조정 유틸리티입니다. mongod 를 실행 하는 동안 RHEL 또는 CentOS 시스템에서 tuned 또는 ktune 를 사용하는 경우 사용자 지정 tuned 프로필을 생성하여 THP가 활성화된 상태로 유지되도록 해야 합니다.

1

사용자 지정 tuned 프로필을 저장 새 디렉토리 를 만듭니다. 다음 예시 에서는 기존 virtual-guest 프로필을 상속하고 virtual-guest-thp 를 새 프로필로 사용합니다.

sudo mkdir /etc/tuned/virtual-guest-thp
2

/etc/tuned/virtual-guest-thp/tuned.conf 을 만들고 편집합니다. 다음 텍스트를 추가합니다.

[main]
include=virtual-guest
[vm]
transparent_hugepages=always

이 예시 는 기존 virtual-guest 프로필을 상속합니다. 시스템에 적합한 프로필을 선택합니다.

3

실행:

sudo tuned-adm profile virtual-guest-thp
1

기존 프로필에서 새 프로필을 만들려면 관련 디렉토리 를 복사합니다. 다음 예시 에서는 virtual-guest 프로필을 기본으로 사용하고 virtual-guest-thp 를 새 프로필로 사용합니다.

sudo cp -r /etc/tune-profiles/virtual-guest /etc/tune-profiles/virtual-guest-thp
2

/etc/tune-profiles/virtual-guest-thp/ktune.sh 를 편집하고 set_transparent_hugepages 설정을 다음과 같이 변경합니다.

set_transparent_hugepages always
3

새 프로필을 활성화합니다.

sudo tuned-adm profile virtual-guest-thp

TCMalloc이 CPU별 캐시로 실행 확인하려면 다음을 확인하세요.

CPU별 캐시가 활성화되지 않은 경우 다음을 확인합니다.

  • glibc rseq를 비활성화합니다.

  • Linux 커널 버전 4.18 이상을 사용하고 있습니다.

새로운 TCMalloc에는 재시작 가능 시퀀스(rseq) 가 필요합니다. CPU당 캐시를 구현 합니다. glibc 라이브러리와 같은 다른 애플리케이션 이 TCMalloc보다 먼저 rseq 구조를 등록하는 경우 TCMalloc은 rseq를 사용할 수 없습니다. rseq가 없으면 TCMalloc은 레거시 TCMalloc 버전에서 사용되는 스레드별 캐시를 사용합니다.

TCMalloc이 rseq를 사용하여 CPU별 캐시를 활성화 할 수 있도록 하려면 glibc의 rseq 구조 등록을 비활성화할 수 있습니다. glibc rseq를 비활성화하려면 mongod 시작하기 전에 다음 환경 변수를 설정하다 합니다.

GLIBC_TUNABLES=glibc.pthread.rseq=0
export GLIBC_TUNABLES

glibc rseq를 비활성화했는데 여전히 CPU별 캐시가 활성화되지 않은 경우, Linux 커널 버전 4.18 이상을 사용하고 있는지 확인하세요. 커널 버전을 확인하려면 다음 명령을 실행 합니다.

uname -r

돌아가기

성능