최근 몇 주 동안 프로세스에서 일회성 메모리 누수가 발생하여 RHEL 7 시스템의 모든 메모리가 소모되었습니다.
이제 특정 금액을 초과하지 않도록 이에 대한 제한을 설정하려고 합니다.
ulimit -v 설정을 사용하여 이 양을 설정합니다(-m 설정이 작동하지 않기 때문에).
그렇다면 이것이 충분한지, 아니면 물리적 메모리를 제한하는 방법도 필요한지 궁금합니다. 그렇다면 가장 좋은 접근 방식은 무엇입니까?
가상 메모리가 항상 실제 메모리와 함께 증가하는 경우 -v 자체로 충분합니다.
답변1
작동 방식에 대한 설명 ulimit
:
ulimit
처리됨setrlimit
그리고getrlimit
시스템 호출. ( 그 일부인) strace
bash 프로세스를 통해 확인하는 것은 쉽습니다 . 나는 1024kb를 설정했습니다 :ulimit
bash
max memory size
$ ulimit -m 1024
다른 콘솔에서:
$ strace -p <my_bash_pid>
. . .
getrlimit(RLIMIT_RSS, {rlim_cur=1024*1024, rlim_max=1024*1024}) = 0
setrlimit(RLIMIT_RSS, {rlim_cur=1024*1024, rlim_max=1024*1024}) = 0
. . .
setrlimit
매뉴얼 페이지의 다음 내용은 다음과 같습니다 RLIMIT_RSS
.
RLIMIT_RSS프로세스의 상주 세트(RAM에 상주하는 가상 페이지 수)의 제한을 페이지 단위로 지정합니다. 이 제한은 다음 경우에만 유효합니다.리눅스 2.4.x, x < 30이며 다음에만 영향을 미칩니다. 미친 웨스(2)MADV_WILLNEED를 지정합니다.
madvice
syscall은 커널에 대한 제안일 뿐이며 커널에서 무시될 수 있습니다. bash
매뉴얼 페이지 에도 ulimit
다음과 같이 기록되어 있습니다.
-m 최대 상주 세트 크기(많은 시스템이 이 제한을 준수하지 않습니다)
-m
작동하지 않는 이유는 다음과 같습니다.
옵션 정보 -v
:
1024kb의 가상 메모리를 설정했습니다.
$ ulimit -v 1024
다른 콘솔에서:
$ strace -p <my_bash_pid>
. . .
getrlimit(RLIMIT_AS, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}) = 0
setrlimit(RLIMIT_AS, {rlim_cur=1024*1024, rlim_max=1024*1024}) = 0
. . .
setrlimit
매뉴얼 페이지의 다음 내용은 다음과 같습니다 RLIMIT_AS
.
RLIMIT_AS프로세스의 가상 메모리(주소 공간)의 최대 크기(바이트)입니다. 이 제한은 통화에 영향을 미칩니다.부르크(2),매핑(2)그리고 다시 매핑(2), 이 제한을 초과하면 ENOMEM 오류로 인해 실패합니다. 또한 자동 스택 확장이 실패합니다(sigaltstack(2)를 통해 사용할 수 있는 대체 스택이 없으면 프로세스를 종료하기 위해 SIGSEGV가 생성됩니다). 값이 long이므로 32비트 long을 사용하는 머신에서는 이 제한이 최대 2GiB이거나 이 리소스가 무제한입니다.
프로그램은 가상 프로그램 저장 공간을 구성하는 3개의 세그먼트(데이터, 코드, 스택)로 구성됩니다.
코드 세그먼트는 상수이며 프로그램 지침을 포함합니다.
데이터 세그먼트는 다음에 의해 제어됩니다.
brk
시스템 호출 크기 조정데이터 세그먼트프로그램(가상 메모리의 일부).mmap
시스템 호출은 파일이나 장치를 프로세스의 가상 메모리에 매핑합니다.많은 프로그램은 C 라이브러리( )의 표준 함수를 호출하여 메모리를 (직접 또는 간접적으로) 할당합니다
malloc
.더미(데이터 세그먼트의 일부).malloc
시스템 호출을 호출하여 데이터 세그먼트의 크기를 조정합니다brk
.스택은 함수 변수를 저장합니다(변수는 스택에서 할당하는 동안 메모리를 차지합니다).
따라서 이 -v
옵션이 귀하에게 적합한 이유입니다.
당신의 임무를 완수하는 데 충분 하다면 -v
다른 일을 할 이유가 없습니다. 그것만으로도 충분합니다.
프로세스의 많은 특정 메모리 기능(메모리 압력, 스왑 사용량, RSS 제한, OOM 등)을 제어하려면 다음을 사용하는 것이 좋습니다.cgroup 메모리능력.
귀하의 신청서가제공하다나는 당신이 사용하는 것이 좋습니다시스템 슬라이싱기능은 cgroups
에 의해 제어되고 제한됩니다 systemd
.