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

메모리 누수 프로세스에 문제가 있습니다. 이로 인해 내 하드 드라이브가에 스왑 파일로 채워집니다 /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

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



답변

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

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

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


답변

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

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

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

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


답변

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

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


답변