자체 관리형 배포서버를 위한 TCMalloc 성능 최적화
버전 8.0에서 변경되었습니다.
MongoDB 8.0 부터 시작됩니다. MongoDB 는 스레드별 캐시 대신 개의 CPU별 캐시 를 사용하는 업그레이드된 버전의 TCMalloc을 사용하여 메모리 조각화를 줄이고 스트레스가 높은 워크로드에 대한 데이터베이스 의 복원력을 향상시킵니다.
새 TCMalloc 버전을 사용하려면 다음을 수행합니다.
플랫폼 지원
MongoDB 8.0 을 지원 하는 운영 체제는 다음을 제외하고 업데이트된 TCMalloc도 지원 합니다.
PPC64LE 및 390x 아키텍처의 RHEL 8 / CentOS 8 / Oracle 8
PPC64LE 아키텍처의 RHEL 9 / CentOS 9 / Oracle 9
이러한 운영 체제는 레거시 TCMalloc 버전을 사용합니다. 이러한 운영 체제를 사용하는 경우 THP를 비활성화합니다.
Windows 는 레거시 TCMalloc 버전을 사용하며 업데이트된 TCMalloc을 지원 하지 않습니다.
THP(Transparent Huge Pages) 활성화
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를 비활성화해야 합니다.
또한 ktune
및 tuned
성능 프로필을 사용하는 RHEL 및 CentOS 시스템의 경우 사용자 지정 tuned
프로필도 만들어야 합니다.
서비스 파일 만들기
THP를 활성화하는 서비스 파일 을 만들려면 플랫폼 내장 초기화 시스템을 사용하세요. 최신 버전의 Linux 는 일반적으로 systemctl
명령을 사용하는 systemd 를 사용합니다. 이전 버전의 Linux 는 service
명령을 사용하는 System V init 을 사용하는 경향이 있습니다. 자세한 내용은 운영 체제 설명서를 참조하세요.
플랫폼에 맞는 초기화 시스템을 사용하세요.
단위 파일만들기 systemd
다음 파일을 생성하여 /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
파일을 업데이트하세요.
서비스 시작
실행:
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
스크립트 만들기 init.d
다음 파일을 생성하여 /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
스크립트 실행
실행:
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
및 사용 tuned
ktune
중요
tuned
또는 ktune
을 사용하는 경우 서비스 파일 을 만든 후 이 섹션의 단계를 수행합니다.
tuned
및 ktune
은 시스템의 Transparent Hugepages 설정에 영향을 줄 수 있는 커널 조정 유틸리티입니다. mongod
를 실행 하는 동안 RHEL 또는 CentOS 시스템에서 tuned
또는 ktune
를 사용하는 경우 사용자 지정 tuned
프로필을 생성하여 THP가 활성화된 상태로 유지되도록 해야 합니다.
CPU별 캐시 활성화
TCMalloc이 CPU별 캐시로 실행 확인하려면 다음을 확인하세요.
tcmalloc.usingPerCPUCaches
는true
입니다.tcmalloc.tcmalloc.cpu_free
가0
보다 큽니다.
CPU별 캐시가 활성화되지 않은 경우 다음을 확인합니다.
glibc rseq를 비활성화합니다.
Linux 커널 버전 4.18 이상을 사용하고 있습니다.
glibc rseq 비활성화
새로운 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