내 소프트웨어는 다음과 유사한 명령을 실행합니다.
찾기 | xargs는 많은 메모리가 필요할 수 있는 작업을 수행합니다.
문제는 때때로 많은 메모리가 필요할 수 있는 작업이 너무 부족해 시스템이 응답하지 않아 다시 시작해야 한다는 것입니다. 내 이해는 이것이 약속을 초과하는 메모리 할당으로 인해 발생한다는 것입니다. 내가 원하는 것은 xargs에 의해 생성된 작업이 사용 가능한 것보다 더 많은 메모리를 필요로 하는 경우 종료되고(그것은 괜찮습니다) 그게 전부라는 것입니다. 시스템 전체에서 오버커밋을 끄면 이런 동작이 발생할 수 있지만 이는 옵션이 아닙니다. 프로세스를 종료할 수 있나요?
마음속에 떠오르는 한 가지 가능한 해결책은 다음과 같습니다.
ulimit -v RAM 크기
하지만 뭔가 이것이 좋은 생각이 아니라고 말하더군요.
답변1
나는 당신이 찾고 있는 것이 --memfree
GNU Parallel이라고 생각합니다.
find ... | parallel --memfree 1G dostuff
dostuff
1G의 여유 RAM이 있을 때만 시작됩니다. 여유 RAM이 1G 미만이거나 CPU 스레드당 1개의 작업이 실행될 때까지 하나 더 시작됩니다. 0.5G RAM 여유 공간(1G RAM의 50%)이 있는 경우 가장 어린 작업이 종료됩니다. 따라서 메타 코드에서는 다음과 같습니다.
limit = 1G
while true:
if freemem > limit:
if count(running_jobs) < cpu.threads():
another_job.start()
if freemem < 0.5 * limit
youngest_job.kill()
함께 사용하면 --retries 10
GNU Parallel에 종료된 작업을 10번 다시 시도하도록 지시할 수 있습니다.
dostuff
메모리를 소모하는 데 시간이 걸릴 경우 --delay 30s
다음 작업을 생성하기 전에 30초를 기다리십시오.
답변2
sysctl vm.overcommit_memory 2
cgroup을 피하고 싶다면