자체 관리 배포서버를 위한 ulimit UNIX 설정
Linux 및 macOS를 포함한 대부분의 UNIX 계열 운영 체제에서는 프로세스별 및 사용자별로 스레드, 파일, 네트워크 연결 등의 시스템 리소스 사용을 제한하고 제어할 수 있는 방법을 제공합니다. 이러한 "ulimit"는 단일 사용자가 너무 많은 시스템 리소스를 사용하는 것을 방지합니다. 경우에 따라 이러한 제한의 기본값이 낮아 정상적인 MongoDB 작업 중에 여러 가지 문제가 발생할 수 있습니다.
리소스 사용량
mongod 와 mongos 는 각각 스레드와 파일 설명자를 사용하여 연결을 추적하고 내부 작업을 관리합니다. 이 섹션에서는 MongoDB의 일반적인 리소스 사용 패턴에 대해 간략하게 설명합니다. 이 수치를 배포서버 정보와 함께 사용하여 이상적인 ulimit 설정을 결정하십시오.
일반적으로 모든 mongod 및 mongos 인스턴스입니다.
두 개의 파일 디스크립터와 하나의 스레드로 들어오는 각 연결을 추적합니다.
는 각 내부 스레드 또는 pthread를 시스템 프로세스로 추적합니다.
mongod
mongod인스턴스에서 사용 중인 각 데이터 파일에 대해 파일 디스크립터 1개입니다.2} 인스턴스에서 사용하는 각 저널 파일에 대한 파일 설명자 1개입니다.
mongod복제본 세트에서 각
mongod은 세트의 다른 모든 멤버에 대한 연결을 유지합니다.
mongod 는 TTL 컬렉션, 복제 및 복제본 세트 상태 확인을 비롯한 여러 내부 프로세스에 백그라운드 스레드를 사용하며, 이 프로세스에는 여러 개의 추가 리소스가 필요할 수 있습니다.
mongos
2}는 클라이언트 연결을 위한 스레드 및 파일 설명자 외에도mongos 모든 구성 서버 및 모든 샤드(모든 복제본 세트의 모든 구성원이 포함됨)에 대한 연결을 유지해야 합니다.
mongos 의 경우 다음 동작을 고려하세요.
2} 런타임 옵션을
net.maxIncomingConnections사용하여 들어오는 연결 수를 제한할 수 있습니다. 들어오는 연결 수를 제한하면mongos가mongod인스턴스에 너무 많은 연결을 생성하는 캐스케이드 효과를 방지할 수 있습니다.
리소스 제한 검토 및 설정
ulimit
다음 예와 같이 시스템 프롬프트에서 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>
ulimit 두 가지 형식이 있습니다.
"하드"
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}을 사용하여 systemctl 을systemd 시작하지 않으면 이 ulimit 설정 중 일부를 재정의합니다. 예를 들어 다음 명령에 표시된 대로 mongod을 시작하면 사용자 슬라이스(예시: user-1000.slice) systemd 설정이 사용됩니다.
mongod --config ~/mongod.conf
참고
systemd 0} 사용자 슬라이스는 사용자의 프로세스에 대한 리소스를 제한합니다.
macOS
Homebrew 설치 방법을 사용하여 MongoDB Community Edition 설치한 macOS 시스템의 경우 brew services를 통해 MongoDB 시작할 때 열린 파일 제한이 자동으로 설정하다 되지 않을 수 있습니다. ulimit 값을 수동으로 구성해야 할 수도 있습니다.
MongoDB 엔터프라이즈 실행 하거나 TGZ 설치 메서드를 사용하는 macOS 시스템의 경우 ulimit 명령을 사용하여 권장 값을 설정하다 . 실행 시스템에서 시스템 제한을 변경하는 정확한 절차는 운영 체제 설명서를 참조하세요.
Red Hat Linux Enterprise Server 및 CentOS
Red Hat Enterprise Linux 및 CentOS 6 및 7은 ulimit 설정을 재정의하는 별도의 최대 프로세스 제한인 nproc를 적용합니다. 이 값은 버전에 따라 다음 구성 파일에 정의되어 있습니다.
버전 | 값 | file |
|---|---|---|
RHEL / CentOS 7 | 4096 |
|
RHEL / CentOS 6 | 1024 |
|
이러한 버전에 대해 값을 구성하려면 nproc /etc/security/limits.d/99-mongodb-nproc.conf 새 soft nproc 및 값으로 라는 파일 만들어 hard nproc 프로세스 제한을 늘립니다. 권장 값은 권장 ulimit 설정을 참조하세요.
RHEL/CentOS 8에서는 더 이상 별도의 nproc 값이 필요하지 않습니다. 1}ulimit 명령은 RHEL/CentOS 8에서 필요한 최대 프로세스 값을 구성하는 데 충분합니다.
권장 ulimit 설정
다음 설정은 mongod 및 mongos 배포에 특히 중요합니다.
-f(파일 크기):unlimited-t(CPU 시간):unlimited-v(가상 메모리):unlimited[1]-l(고정 메모리 크기):unlimited-n(열린 파일):64000-u(프로세스/스레드):64000
ulimit 설정을 변경한 후 mongod 및 mongos 인스턴스를 다시 시작하여 변경 사항을 적용합니다.
고려 사항
macOS 플랫폼의 경우 권장되는 프로세스 제한은
2500이며, 이는 이 플랫폼에 대해 구성 가능한 최대 값입니다.
Upstart를 사용하는 Linux 배포
Upstart를 사용하는 Linux 배포의 경우 또는 인스턴스를 Upstart 서비스로 시작하는 mongos 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>
을(를) 사용하는 Linux 배포 systemd
mongod 또는 mongos 인스턴스를 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>
참고
yum 또는 apt 과 같은 패키지 관리자를 통해 MongoDB를 설치한 경우 설치의 일부로 설치된 서비스 파일에는 이미 이러한 유한 값이 포함되어 있습니다.
/proc 파일 시스템
참고
이 섹션은 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 를 생략할 수 있습니다. |