메모리 누수 프로세스에 문제가 있습니다. 이로 인해 내 하드 드라이브가에 스왑 파일로 채워집니다 /private/var/vm
.
OS에 의해 누출 프로세스가 보이지 않게 종료되고 싶습니다 . 나는 20 분 후에 나타나는 대화 상자에 관심이 없으며 응용 프로그램을 죽일 것을 제안하고 누출되는 대화 상자를 표시하지 않습니다.
rss
과 data
한계를 설정하려고 시도했지만 /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
명령 만 사용해야합니다 .
응용 프로그램의 메모리를 제한해야하는 경우 스택 세그먼트도 제한해야합니다.