약간의 조사를 통해 /proc/pid/oom_adj에 값을 입력하여 특정 프로세스를 조정하거나 OOM 킬러에 대해 면역이 되도록 만드는 것이 가능하다는 것을 알았습니다. 물론 pidof나 pgrep을 사용하여 프로세스에 대한 pid를 찾아야 합니다. 그런 식으로 모든 프로세스가 실행되면 실행할 스크립트를 만드세요.
OOM 킬러의 문제는 다른 킬러와 같습니다. 겉으로는 건전하고 합리적으로 보일지 모르지만, 사실 속으로는 심각하게 혼란스럽고 제정신이 아니며 올바른 판단을 내리지 못하는 경우가 많습니다.
이제 저는 개인적으로 무슨 일이 일어나고 있는지 알고 피해자를 어느 정도 통제할 수 있는 한(진정하세요. 저는 컴퓨터 문제에 대해 이야기하고 있습니다) 약간의 살인에도 개의치 않습니다. 그래서 저는 피해자를 보호할 수 있는 더 나은 방법을 찾고 있습니다. 모든 프로그램이 실행될 때마다 또는 새 프로그램을 시작할 때마다 스크립트를 실행할 필요가 없도록 무서운 OOM 킬러에 대한 특정 프로세스를 사용합니다. 이것을 쉽게 달성하는 방법에 대한 아이디어가 있습니까?
답변1
프로세스를 관리하기 위해 OOM 킬러에 의존해서는 안됩니다. OOM 킬러는 시스템 충돌이 유일한 대안인 경우 최후의 수단으로 사용됩니다. 예를 들어 모든 캐시 및 디스크 버퍼 메모리가 플러시되고 커밋되었으며 교체/폐기될 수 있는 모든 항목이 처리되었지만 여전히 메모리가 충분하지 않습니다... 분명히 실행 중인 시스템이 이 상태에 도달하는 것을 원하지 않을 것입니다.
OOM Killer가 작동하는 엄격한 제약으로 인해(더 많은 메모리를 할당할 수 없고 다른 프로세스에서 스왑할 수 없음 등)~ 할 것이다메모리 부족을 완화하기 위해 종료하고 싶지 않은 프로세스를 종료하세요.
시스템에 메모리가 충분하지 않으면 실제 메모리가 부족한지 총 가상 메모리가 부족한지에 따라 메모리를 추가하거나 스왑 공간을 추가해야 한다고 생각합니다.
반면에 메모리 누수나 다른 버그로 인해 때때로 너무 많은 메모리를 소비하는 몇 가지 런어웨이 프로세스가 있는 경우 다른 방법을 통해 이를 제어할 수 있습니다.
문제가 있는 프로세스를 시작하기 전에 설정
ulimit -m
하고 해당 프로세스가 할당할 수 있는 메모리 양을 제한합니다.메모리 누수가 있고 상당히 예측 가능한 경우 cron을 통해 일정에 따라 문제가 있는 프로세스를 정상적으로 다시 시작합니다.
어쨌든 OOM 킬러는 당신의 친구가 아닙니다. 그것은 느슨한 대포입니다 :-/