메모리 누수를 방지하기 위해 ulimit -v를 충분히 설정하고 있습니까?

메모리 누수를 방지하기 위해 ulimit -v를 충분히 설정하고 있습니까?

최근 몇 주 동안 프로세스에서 일회성 메모리 누수가 발생하여 RHEL 7 시스템의 모든 메모리가 소모되었습니다.

이제 특정 금액을 초과하지 않도록 이에 대한 제한을 설정하려고 합니다.

ulimit -v 설정을 사용하여 이 양을 설정합니다(-m 설정이 작동하지 않기 때문에).

그렇다면 이것이 충분한지, 아니면 물리적 메모리를 제한하는 방법도 필요한지 궁금합니다. 그렇다면 가장 좋은 접근 방식은 무엇입니까?

가상 메모리가 항상 실제 메모리와 함께 증가하는 경우 -v 자체로 충분합니다.

답변1

작동 방식에 대한 설명 ulimit:

ulimit처리됨setrlimit그리고getrlimit시스템 호출. ( 그 일부인) stracebash 프로세스를 통해 확인하는 것은 쉽습니다 . 나는 1024kb를 설정했습니다 :ulimitbashmax 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를 지정합니다.

madvicesyscall은 커널에 대한 제안일 뿐이며 커널에서 무시될 수 있습니다. 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.

관련 정보