우리 클러스터에서는 메모리( )와 같은 프로세스 리소스를 제한합니다 memory.limit_in_bytes
.
내 생각에 이것은 궁극적으로 Linux 커널의 OOM 킬러를 통해서도 처리됩니다(읽기를 통해).소스 코드).
내 프로세스가 종료되기 전에 신호를 받을 수 있는 방법이 있나요? ( -notify
옵션 과 마찬가지로상하이 금 거래소qsub
, SIGUSR1
프로세스가 종료되기 전에 전송됩니다. )
나는 읽었다/dev/mem_notify
여기하지만 저는 그렇지 않았습니다. 이제 다른 건 없나요? 나도 읽었다이것이것은 다소 관련이 있는 것 같습니다.
나는 최소한 작은 스택 추적과 다른 유용한 디버깅 정보를 덤프할 수 있기를 원합니다. 하지만 일부 메모리를 해제하여 복구할 수도 있습니다.
현재 사용 중인 해결 방법 중 하나는 다음과 같습니다.이 작은 스크립트SIGUSR1
한도(95%)에 근접 했는지 자주 확인하고, 그렇다면 종료 시 자동으로 종료를 보냅니다cgroup-mem-limit-watcher.py &
.
답변1
cgroup의 메모리 사용량이 임계값을 초과할 때 알림을 받도록 등록할 수 있습니다. 원칙적으로 임계값을 실제 한계보다 낮은 적절한 지점에 설정하면 신호를 보내거나 다른 조치를 취할 수 있습니다.
바라보다:
https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
답변2
OOM Killer는 SIGKILL을 보냅니다. 그렇지 않으면 문제의 프로그램이 계속되도록 선택하는 것은 비생산적입니다.
이는 프로세스가 언제 종료될지 전혀 알 수 없음을 의미합니다.
이러한 문제를 관리하는 것은 일반적으로 프로그램이나 해당 구성을 수정하는 것을 의미합니다. 때로는 시스템 구성에 따라 단순히 스왑 공간을 늘리는 것만으로도 운영 체제에 더 많은 메모리 관리 유연성을 제공하여 이러한 과감한 조치를 피할 수 있습니다.
답변3
cgroup을 사용한 것 같은데 도움이 되었습니다.
프로세스가 cgroup의 유일한 프로세스(즉, 종료될 수 있는 유일한 프로세스)이고 실행하는 프로그램을 소유하고 있는 경우 프로그램을 수정하여 하위 프로세스를 생성하고 해당 프로세스의 oom 점수를 높은 값으로 조정할 수 있습니다. 따라서 이 프로세스는 미끼가 됩니다. cgroup 메모리 제한에 도달하면 OOM Killer는 기본 프로세스 대신 이 미끼 프로세스를 종료합니다. 기본 프로세스는 하위 미끼가 OOM 킬러가 실행되는 정확한 순간을 학습할 때까지 기다릴 수 있습니다.
IMO, 특정 임계값이 있는 모니터링 스크립트보다 쉽습니다. 다음은 Bash의 예입니다.
#!/usr/bin/bash
self_pid=$$
(
/usr/bin/sleep infinity &
oom_decoy_pid=$!
echo "1000" > "/proc/${oom_decoy_pid}/oom_score_adj"
echo "Launched oom decoy ${oom_decoy_pid} for parent process ${self_pid}"
wait $oom_decoy_pid
echo "OOM decoy is killed. Likely OOM is coming!"
echo "Signalling parent..."
kill -SIGTERM $self_pid
)&
while true; do
sleep 1
echo "Doing something important and memory heavy"
done