UNIX ulimit
자체 관리 배포서버를 위한 설정
이 페이지의 내용
Linux 및 macOS를 포함한 대부분의 UNIX 계열 운영 체제에서는 프로세스별 및 사용자별로 스레드, 파일, 네트워크 연결 등의 시스템 리소스 사용을 제한하고 제어할 수 있는 방법을 제공합니다. 이러한 "ulimit"는 단일 사용자가 너무 많은 시스템 리소스를 사용하는 것을 방지합니다. 경우에 따라 이러한 제한의 기본값이 낮아 정상적인 MongoDB 작업 과정에서 많은 문제가 발생할 수 있습니다.
리소스 활용
mongod
{ 2}와 는 각각 스레드와 파일 설명자를 사용하여 연결을 추적하고 내부 작업을 mongos
관리합니다. 이 섹션에서는 MongoDB의 일반적인 리소스 사용 패턴에 대해 간략하게 설명합니다. 이 수치를 배포 및 사용에 대한 실제 정보와 함께 사용하여 이상적인 ulimit
설정을 결정하십시오.
일반적으로 모든 mongod
및 mongos
인스턴스입니다.
두 개의 파일 디스크립터와 하나의 스레드로 들어오는 각 연결을 추적합니다.
는 각 내부 스레드 또는 pthread를 시스템 프로세스로 추적합니다.
mongod
mongod
인스턴스에서 사용 중인 각 데이터 파일에 대해 파일 디스크립터 1개입니다.2} 인스턴스에서 사용하는 각 저널 파일에 대한 파일 설명자 1개입니다.
mongod
복제본 세트에서 각
mongod
은 세트의 다른 모든 멤버에 대한 연결을 유지합니다.
mongod
는 TTL 수집, 복제 및 복제본 세트 상태 확인을 비롯한 여러 내부 프로세스에 백그라운드 스레드를 사용하며, 이 프로세스에는 소수의 추가 리소스가 필요할 수 있습니다.
mongos
2}는 클라이언트 연결을 위한 스레드 및 파일 설명자 외에도mongos
모든 구성 서버 및 모든 샤드(모든 복제본 세트의 모든 구성원이 포함됨)에 대한 연결을 유지해야 합니다.
mongos
의 경우 다음 동작을 고려하세요.
mongos
{2} 인스턴스는 각 샤드에 대한 연결 풀을 유지하여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>
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}을 사용하여 systemctl
을systemd
시작하지 않으면 이 ulimit
설정 중 일부를 재정의합니다. 예를 들어 다음 명령에 표시된 대로 mongod
을 시작하면 사용자 슬라이스(예시: user-1000.slice
) systemd
설정이 사용됩니다.
mongod --config ~/mongod.conf
참고
systemd
0} 사용자 슬라이스는 사용자의 프로세스에 대한 리소스를 제한합니다.
macOS
brew 설치 방법을 사용하여 MongoDB Community를 설치한 macOS 시스템의 경우 brew services
통해 MongoDB를 시작하면 권장 열린 파일 값이 자동으로 설정됩니다.
MongoDb Enterprise를 실행하거나 TGZ 설치 방법을 사용하는 macOS 시스템의 경우 ulimit
명령을 사용하여 권장값을 설정합니다. 실행 중인 시스템에서 시스템 제한을 변경하는 정확한 절차는 운영 체제 설명서를 참조하세요.
Red Hat Linux Enterprise Server 및 CentOS
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 nproc
및 hard nproc
값을 사용하여 /etc/security/limits.d/99-mongodb-nproc.conf
이라는 이름의 파일을 만들어 프로세스 제한을 늘리세요. 권장 값은 권장 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
6} 설정을 변경한 후에는 항상 및 인스턴스를 다시 시작하여 변경 사항을 mongod
mongos
적용하는 것을 잊지 마세요.ulimit
고려 사항
Upstart를 사용하는 Linux 배포
업스타트를 사용하는 Linux 배포판의 경우 mongod
및/또는 mongos
인스턴스를 업스타트 서비스로 시작하면 서비스 스크립트 내에서 제한을 지정할 수 있습니다. limit
stanzas를 사용하여 이 작업을 수행할 수 있습니다.
권장 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
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
설치의 일부로 설치된 서비스 파일에 이미 이러한 극한 값이 포함되어 있습니다.
/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 를 생략할 수 있습니다. |