우리는 데비안 리눅스 웹서버를 가지고 있습니다. 단지 apache2를 실행하고 있을 뿐입니다. 우리 mysql 서버는 다른 호스트에 있습니다. 그러나 우리는 때때로 일반 작업을 수행하기 위해 웹 서버에서 cron 작업을 실행합니다.
그러나 최근 cron 작업 중 하나에 버그가 발생하여 메모리를 잡아먹기 시작했습니다. Linux OOM 킬러가 아파치를 죽였습니다. 물론 우리 웹 사이트가 다운되었습니다. 메모리가 부족한 크론이 계속 실행되었습니다. 하지만 이 경우에는 OOM 킬러가 해당 스크립트를 종료하고~ 아니다아파치.
내가 말할 수 있도록 커널을 구성하는 방법이 있습니까?~하지 않다'apache2'라는 프로세스를 종료합니다(또는 적어도 apache2를마지막죽이는 것)? Apache와 일반 크론은 모두 동일한 사용자(www-user)로 실행됩니다.
답변1
이 크론 작업이 왜 그렇게 많은 메모리를 사용하는지 실제로 디버깅하여 문제의 근본 원인을 해결하는 것처럼 들리지 않습니다.
이 옵션을 설정해 볼 수 있습니다
에코 1 > /proc/sys/vm/oom_kill_allocating_task
이는 OOM 킬러에게 OOM 조건을 유발한 프로세스를 종료하라고 지시하지만 이것이 크론 작업이 될 것이라는 보장은 없습니다. 스크립트에서 "ulimit -m"을 사용하여 사용할 최대 상주 메모리 양을 설정할 수도 있습니다. 가장 좋은 방법은 cronjob이 왜 그렇게 많은 메모리를 사용하는지 평가하고 다른 호스트에 가장 적합한지 또는 더 적은 메모리를 사용하도록 다시 작성하는 것입니다.
답변2
OOMKiller~이다정도 구성 가능합니다. 프로세스를 시작한 후 값을 /proc/<pid>/oom_adj
음의 정수로 설정할 수 있습니다. 이는 프로세스 및 해당 하위 항목에 대한 OOMKiller의 선호도에 영향을 미칩니다. 시스템이 메모리 부족 상태에 도달하면 다른 프로세스가 종료됩니다.
답변3
가상 메모리 오버 커밋 동작을 변경할 수도 있습니다. 예를 들어, /proc/sys/vm/overcommit_memory 값을 '2'로 변경할 수 있습니다. 즉, 메모리를 오버커밋하지 않는다는 뜻입니다. (무엇을 하는지 이해하지 못한 채 이 값을 변경하지 마십시오.)
'오버커밋 없음' 모드에서는 새로운 프로세스가 더 많은 RAM을 요구하더라도 할당을 시도할 때 오류가 발생합니다. 따라서 OOM 킬러가 오래되고 오래 실행되는 프로세스를 깨뜨리는 대신 RAM을 요구하는 새로운 사람에게 '아니요'라는 대답을 듣게 됩니다.
...그리고 메모리 문제를 해결해야 합니다. 누수를 찾고, 메모리를 소비하는 프로세스를 재설계하고, 상자에 램을 더 추가하는 등의 작업을 수행합니다.
답변4
여기에는 프로세스에 OOM_DISABLE "플래그"를 설정할 수 있다고 나와 있습니다. http://linux-mm.org/OOM_Killer