문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

UNIX ulimit 설정

이 페이지의 내용

  • 리소스 활용
  • 리소스 제한 검토 및 설정

Linux 및 macOS를 포함한 대부분의 UNIX 계열 운영 체제에서는 프로세스별 및 사용자별로 스레드, 파일, 네트워크 연결 등의 시스템 리소스 사용을 제한하고 제어할 수 있는 방법을 제공합니다. 이러한 "ulimit"는 단일 사용자가 너무 많은 시스템 리소스를 사용하는 것을 방지합니다. 경우에 따라 이러한 제한의 기본값이 낮아 정상적인 MongoDB 작업 과정에서 많은 문제가 발생할 수 있습니다.

mongod { 2}와 는 각각 스레드와 파일 설명자를 사용하여 연결을 추적하고 내부 작업을 mongos 관리합니다. 이 섹션에서는 MongoDB의 일반적인 리소스 사용 패턴에 대해 간략하게 설명합니다. 이 수치를 배포 및 사용에 대한 실제 정보와 함께 사용하여 이상적인 ulimit 설정을 결정하십시오.

일반적으로 모든 mongodmongos 인스턴스입니다.

  • 두 개의 파일 디스크립터 하나의 스레드로 들어오는 각 연결을 추적합니다.

  • 는 각 내부 스레드 또는 pthread를 시스템 프로세스로 추적합니다.

  • mongod 인스턴스에서 사용 중인 각 데이터 파일에 대해 파일 디스크립터 1개입니다.

  • 2} 인스턴스에서 사용하는 각 저널 파일에 대한 파일 설명자 1개입니다.mongod

  • 복제본 세트에서 각 mongod 은 세트의 다른 모든 멤버에 대한 연결을 유지합니다.

mongodTTL 수집을 비롯한 여러 내부 프로세스에 백그라운드 스레드를 사용하며, 이 프로세스에는 소수의 추가 리소스가 필요할 수 있습니다.

2}는 클라이언트 연결을 위한 스레드 및 파일 설명자 외에도mongos 모든 구성 서버 및 모든 샤드(모든 복제본 세트의 모든 구성원이 포함됨)에 대한 연결을 유지해야 합니다.

mongos 의 경우 다음 동작을 고려하세요.

  • mongos{2} 인스턴스는 각 샤드에 대한 연결 풀을 유지하여 mongos 연결을 재사용하고 새 연결을 만들 필요 없이 요청을 신속하게 처리할 수 있도록 합니다.

  • 2} 런타임 옵션을 net.maxIncomingConnections 사용하여 들어오는 연결 수를 제한할 수 있습니다. 들어오는 연결 수를 제한하면 mongos mongod 인스턴스에 너무 많은 연결을 생성하는 캐스케이드 효과를 방지할 수 있습니다.

다음 예와 같이 시스템 프롬프트에서 ulimit 명령을 사용하여 시스템 제한을 확인할 수 있습니다.

$ ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-m: resident set size (kbytes) unlimited
-u: processes 64000
-n: file descriptors 64000
-l: locked-in-memory size (kb) unlimited
-v: address space (kb) unlimited
-x: file locks unlimited
-i: pending signals 192276
-q: bytes in POSIX msg queues 819200
-e: max nice 30
-r: max rt priority 65
-N 15: unlimited

ulimit 다양한 리소스에 대한사용자 별 제한 사항을 나타냅니다. 따라서 mongod 인스턴스가 여러 프로세스 또는 여러 mongod 프로세스를 실행 중인 사용자로 실행되는 경우 이러한 리소스에 대한 경합이 표시될 수 있습니다. 또한 processes 값(예: -u)은 별개의 프로세스와 하위 프로세스 스레드의 수를 합한 값을 나타냅니다.

Linux에서는 다음 형식의 명령을 실행하여 ulimit 설정을 변경할 수 있습니다.

ulimit -n <value>

MongoDB의 성능에 영향을 미치는 "하드"와 "소프트" ulimit 가 모두 있습니다. " hard " ulimit 는 사용자가 언제든지 활성화할 수 있는 최대 프로세스 수를 나타냅니다. 이것이 한도입니다. 루트가 아닌 프로세스는 " hard " ulimit 증가시킬 수 없습니다. 반대로 " soft " ulimit 은 세션 또는 프로세스에 실제로 적용되는 제한이지만 모든 프로세스에서 최대 " 하드 " ulimit 까지 제한을 늘릴 수 있습니다.

"소프트" ulimit 이 낮으면 연결 수가 너무 많아지면 can't create new thread, closing connection 오류가 발생할 수 있습니다. 이러한 이유로 ulimit 값을 모두 권장 값으로 설정하는 것이 매우 중요합니다.

ulimit -H 은 제한 값을 수정할 때 -S 또는 수정자가 지정되지 않은 경우 '하드(hard)' 및 '소프트(soft)' 값을 모두 수정합니다.

대부분의 Linux 배포판에서는 ulimit -a 출력의 가능한 값을 -n 옵션으로 대체하여 값을 변경할 수 있습니다.

ulimit 설정을 변경한 후에는 프로세스를 다시 시작해야 수정된 설정을 이용할 수 있습니다. Linux에서는 /proc 파일 시스템을 사용하여 실행 중인 프로세스의 현재 제한 사항을 확인할 수 있습니다.

시스템 구성 및 기본 설정에 따라 ulimit 사용하여 시스템 제한을 변경하면 시스템을 다시 시작한 후 되돌릴 수 있습니다. 자세한 내용은 배포 및 운영 체제 문서를 확인하십시오.

일반적으로 ulimit 설정을 사용하는 systemctl을 사용하여 mongod 시작해야 합니다.

systemctl start mongod.service

mongod 3}을 사용하여 systemctlsystemd 시작하지 않으면 이 ulimit 설정 중 일부를 재정의합니다. 예를 들어 다음 명령에 표시된 대로 mongod 시작하면 사용자 슬라이스(예: user-1000.slice) systemd 설정이 사용됩니다.

mongod --config ~/mongod.conf

참고

systemd 0} 사용자 슬라이스는 사용자의 프로세스에 대한 리소스를 제한합니다.

brew 설치 방법을 사용하여 MongoDB 커뮤니티를 설치한 macOS 시스템의 경우 brew services 통해 MongoDB를 시작하면 권장 열린 파일 값이 자동으로 설정됩니다.

MongoDB Enterprise를 실행하거나 TGZ 설치 방법을 사용하는 macOS 시스템의 경우 ulimit 명령을 사용하여 권장 값 을 설정합니다. 실행 중인 시스템에서 시스템 제한을 변경하는 정확한 절차는 운영 체제 설명서를 참조하세요.

Red Hat Enterprise Linux 및 CentOS 6 및 7은 ulimit 설정을 재정의하는 별도의 최대 프로세스 제한인 nproc를 적용합니다. 이 값은 버전에 따라 다음 구성 파일에 정의되어 있습니다.

버전
file
RHEL / CentOS 7
4096
/etc/security/limits.d/20-nproc.conf
RHEL / CentOS 6
1024
/etc/security/limits.d/90-nproc.conf

이러한 버전에 대해 nproc 값을 구성하려면 새 soft nprochard nproc 값으로 /etc/security/limits.d/99-mongodb-nproc.conf 라는 파일을 만들어 프로세스 제한을 늘립니다. 권장 값은 권장 ulimit 설정을 참조하세요.

RHEL/CentOS 8에서는 더 이상 별도의 nproc 값이 필요하지 않습니다. 1}ulimit 명령은 RHEL/CentOS 8에서 필요한 최대 프로세스 값을 구성하는 데 충분합니다.

배포마다 고유한 요구 사항과 설정이 있을 수 있지만, 다음 임계값과 설정은 mongodmongos 배포에 특히 중요합니다.

  • -f (파일 크기): unlimited

  • -t (CPU 시간): unlimited

  • -v (가상 메모리): unlimited [1]

  • -l (고정 메모리 크기): unlimited

  • -n (열린 파일): 64000

  • -m (메모리 크기): unlimited [1] [2]

  • -u (프로세스/스레드): 64000

6} 설정을 변경한 후에는 항상 및 인스턴스를 다시 시작하여 변경 사항을 mongod mongos 적용하는 것을 잊지 마세요.ulimit

  • MongoDB 4.2부터 mongod 또는 mongos 인스턴스에 대한 수신 연결에는 개의 파일 설명자가 필요합니다. 이전 버전의 MongoDB에서는 들어오는 연결에 하나의 파일 설명자가 필요했습니다.

    MongoDB 4.0에서 4.2로 업그레이드하기 전에 열린 파일 ulimit 설정 (-n) 의 값을 늘려야 할 수 있습니다.

  • macOS 플랫폼의 경우 권장되는 프로세스 제한은 2500이며, 이는 이 플랫폼에 대해 구성 가능한 최대 값입니다.

Upstart를 사용하는 Linux 배포의 경우 및/또는 mongos 인스턴스를 Upstart 서비스로 시작하는 경우 서비스 스크립트 내에서 제한을 지정할 수 있습니다.mongod limit 스탠자 를 사용하여 이 작업을 수행할 수 있습니다. .

다음 예제와 같이 권장 ulimit 설정 을 지정합니다.

limit fsize unlimited unlimited # (file size)
limit cpu unlimited unlimited # (cpu time)
limit as unlimited unlimited # (virtual memory size)
limit memlock unlimited unlimited # (locked-in-memory size)
limit nofile 64000 64000 # (open files)
limit nproc 64000 64000 # (processes/threads)

limit 연은 지정된 첫 번째 값에 "소프트" 제한을, 두 번째 값에 "하드" 제한을 설정합니다.

limit 스탠자를 변경한 후 다음 양식을 사용하여 애플리케이션 서비스를 다시 시작하여 변경 사항이 적용되는지 확인하십시오.

restart <service name>

2} 및/또는 mongos 인스턴스를 mongod 서비스로 시작하는 경우 해당 systemd [Service] 서비스 파일의 섹션 내에서 제한을 지정할 수 있습니다. 서비스 파일의 위치는 /etc/systemd/system/<process-name>.service입니다.

리소스 제한 지시문 을 사용하여 제한을 설정할 수 있습니다. .

다음 예제와 같이 권장 ulimit 설정 을 지정합니다.

[Service]
# Other directives omitted
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (locked-in-memory size)
LimitMEMLOCK=infinity
# (open files)
LimitNOFILE=64000
# (processes/threads)
LimitNPROC=64000

systemd 제한 지침은 "하드" 및 "소프트" 제한을 모두 지정된 값으로 설정합니다.

limit 스탠자를 변경한 후 다음 양식을 사용하여 애플리케이션 서비스를 다시 시작하여 변경 사항이 적용되는지 확인하십시오.

systemctl restart <service name>

참고

0}yum 또는 과 같은 패키지 관리자를 통해 MongoDB를 설치한 경우 apt 설치의 일부로 설치된 서비스 파일에 이미 이러한 극한 값이 포함되어 있습니다.

참고

이 섹션은 Linux 운영 체제에만 적용됩니다.

0} 파일 시스템은 에 위치한 파일 시스템 개체에 프로세스별 제한을 /proc /proc/<pid>/limits 저장합니다(여기서 <pid> 는 프로세스의 PID 또는 프로세스 식별자입니다). 다음 bash 함수를 사용하여 지정된 이름의 프로세스 또는 프로세스에 대한 limits 객체의 내용을 반환할 수 있습니다.

return-limits(){
for process in $@; do
process_pids=`ps -C $process -o pid --no-headers | cut -d " " -f 2`
if [ -z $@ ]; then
echo "[no $process running]"
else
for pid in $process_pids; do
echo "[$process #$pid -- limits]"
cat /proc/$pid/limits
done
fi
done
}

이 함수를 복사하여 현재 셸 세션에 붙여넣거나 스크립트의 일부로 로드할 수 있습니다. 다음 호출 중 하나를 사용하여 함수를 호출합니다.

return-limits mongod
return-limits mongos
return-limits mongod mongos
[1](1, 2) MongoDB를 실행하는 시스템에서 가상 메모리 또는 상주 메모리 크기를 제한하면 운영 체제에서 추가 할당 요청을 거부합니다.
[2] ulimit 에 대한 -m 매개 변수는 커널 버전이 2.4.30보다 최신인 Linux 시스템에는 영향을 주지 않습니다. 원하는 경우 -m 를 생략할 수 있습니다.
← Health Manager를 사용하여 샤드 클러스터 상태 관리