ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs Menu

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

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

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

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

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는 시스템 수준에서 작동하므로 시스템의 모든 프로세스에 적용됩니다. 프로세스별 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