메모리 누수 프로세스를 자동으로 종료하려면 어떻게합니까?


8

메모리 누수 프로세스에 문제가 있습니다. 이로 인해 내 하드 드라이브가에 스왑 파일로 채워집니다 /private/var/vm.

OS에 의해 누출 프로세스가 보이지 않게 종료되고 싶습니다 . 나는 20 분 후에 나타나는 대화 상자에 관심이 없으며 응용 프로그램을 죽일 것을 제안하고 누출되는 대화 상자를 표시하지 않습니다.

rssdata한계를 설정하려고 시도했지만 /etc/launchd.conf효과가없는 것 같습니다.

이것은 내 /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

launchctl limit출력 은 다음과 같습니다 .

% launchctl limit
    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        8589934592     8589934592
    stack       8388608        67104768
    core        0              unlimited
    rss         8589934592     8589934592
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    256            unlimited

이것은 내 .zshrc:

ulimit -t 600
ulimit -d 512000
ulimit -v 1024000

그리고 ulimit -a출력 (ZSH) :

% ulimit -a
    -t: cpu time (seconds)         600
    -f: file size (blocks)         unlimited
    -d: data seg size (kbytes)     512000
    -s: stack size (kbytes)        8192
    -c: core file size (blocks)    0
    -v: address space (kb)         1000
    -l: locked-in-memory size (kb) unlimited
    -u: processes                  709
    -n: file descriptors           256

그러나 여기 top프로세스에 대한 정보가 있습니다.

PID  COMMAND      %CPU  TIME     #TH  #WQ  #POR #MRE RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP PPID
886  process      30.8  01:16.40 1/1  0    17   332  2259M+ 184K   2072M- 19G+   38G    882  885

문서화 된 메모리 제한 방법 중 실제로는 작동하지 않는 것 같습니다. 내가 놓친 추가 메커니즘이 있습니까?


230 GiB ?! 나는 당신이 소수점을 놓쳤기를 바랍니다.
duci9y

@ duci9y Nope :-(
sam hocevar

3
이 경우 누군가가 문제를 해결하기를 바랍니다. 당신은 내기도에있을 것입니다.
duci9y 2016 년

IRC의 사람들이 왜 llvm-g ++ 대신 clang ++를 사용해야하는지에 대해 강의하기 시작했고 뾰족한 객체로만 충돌시키고 싶어하기 때문에 결국 누출 프로세스에 대한 언급을 제거했습니다.
sam hocevar

불에 뾰족한 물건.
duci9y

답변:


3

필자는 정의한 임계 값보다 큰 상주 메모리 크기 (또는 전체 페이징 된 페이지를 포함하여 총 vm 크기)를 가진 프로세스를 필터링하는 간단한 스크립트를 작성합니다 (프로세스 양, 사용 가능한 총 메모리 및 아마도 CPU 가용성). 하나는 하나와 bash는 스크립트의 비트를 사용 top하거나 ps프로세스 및 메모리 크기의 목록을 파고.

이 필터링 된 목록에서 프로세스 PID 당 leaks명령 ( man 1 leaks 참조)을 사용합니다 . 명령에 의해보고 된 누수 된 메모리의 총량이 다른 임계 값보다 높으면이를 종료하고 다시 생성합니다.

참고 : 수행 한 작업을 모르고 OS / 시스템 프로세스를 종료하지 않도록주의해야합니다. 이러한 상황을 피하려면 "화이트리스트"접근 방식을 사용하여 목록을 필터링해야합니다.


1

대부분의 플랫폼에서 ulimit가 예상대로 작동하지 않습니다.

이것이 데스크톱 앱이 아닌 경우 https://github.com/arya/bluepill 과 같은 적절한 프로세스 감독자로 위반자를 실행 하십시오.

데스크톱 앱인 경우 앱 개발자에게 문의하십시오. 피드백이 필요하고 중요합니다.

Mac 용 OOM 킬러 GUI의 UX는 끔찍합니다. 각 프로세스의 램 사용량에 대한 비례 막대 그래프로 가장 큰 내림차순이어야합니다. 또한 해결되면 일시 중지 된 모든 프로세스를 자동으로 SIGCONT해야합니다.


1
몇 가지 응용 프로그램에서 문제가 있었지만 낙타의 등을 부딪친 빨대는 Apple의 것 llvm-g++입니다. 이 문제는 레이더에서보고되었습니다. 궁금합니다 : 다른 플랫폼이 작동하지 않는 것은 무엇 ulimit입니까? 나는 거의 20 년 동안 여러 가지 유닉스 맛을 사용해 왔으며, 그 맛을 본 기억이 없습니다.
sam hocevar

-2

재부팅이 필요할 때 launchctl limit명령 만 사용해야합니다 .

응용 프로그램의 메모리를 제한해야하는 경우 스택 세그먼트도 제한해야합니다.


출력에서 볼 수 있듯이 스택 크기와 데이터 크기가 모두 제한됩니다. 작동 launchctl limit하지 않기 때문에 질문 했습니다.
sam hocevar

ulimit당신이 정말로 필요로 작동하지 않습니다 . launchctl limit그렇습니다.
Eir Nym

한계에 불이 붙는 또 다른 순간 : 프로그램이 한계에 도달하면 경고를받습니다. 그러나 소프트 리미트 작업을 수행하면 성공할 수 있습니다. 실패하면 실패합니다. 따라서 프로그램이 하드 제한을 초과하여 메모리를 요청하면 메모리가 할당되지 않습니다.
Eir Nym

launchctl limit작동하지 않거나 질문하지 않습니다.
sam hocevar

응용 프로그램 크기를 어떻게 측정합니까?
Eir Nym
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.