병렬성: 메모리 제한 임계값을 초과하면 장기 실행 진행을 일시 중지(스왑 아웃)합니다.

병렬성: 메모리 제한 임계값을 초과하면 장기 실행 진행을 일시 중지(스왑 아웃)합니다.

10GB RAM과 무제한 스왑 공간이 있다고 가정해 보겠습니다.

10개의 작업을 병렬로 실행하고 싶습니다(gnu 병렬은 옵션이지만 반드시 유일한 것은 아닙니다). 이러한 작업에는 점점 더 많은 메모리가 필요하지만 처음에는 작게 시작됩니다. 이는 각각 1개의 코어에서 실행되는 CPU 집약적 작업입니다.

예를 들어 각 작업이 10시간 동안 실행되고 시작 시 500MB, 완료 후 2GB의 메모리가 필요하며 메모리는 선형적으로 증가한다고 가정합니다. 따라서 선형적으로 증가한다고 가정하면 6시간 40분에 이러한 작업은 사용 가능한 메모리의 10GB를 초과하게 됩니다.

이러한 작업이 항상 RAM에서 실행되도록 어떻게 관리할 수 있습니까?정지시키다그들 중 일부는 처형하고 나머지는 탈출하게 하시겠습니까?

GNU 병렬이 이것을 할 수 있습니까?

답변1

6월부터 상황이 바뀌었습니다.

이제 Git 버전 e81a0eba를 사용할 수 있습니다.--memsuspend

--memsuspend size (alpha testing)

Suspend jobs when there is less than 2 * size memory free. The size can be
postfixed with K, M, G, T, P, k, m, g, t, or p which would multiply the size
with 1024, 1048576, 1073741824, 1099511627776, 1125899906842624, 1000,
1000000, 1000000000, 1000000000000, or 1000000000000000, respectively.

If the available memory falls below 2 * size, GNU parallel will suspend some
of the running jobs. If the available memory falls below size, only one job
will be running.

If a single job takes up at most size RAM, all jobs will complete without
running out of memory. If you have swap available, you can usually lower
size to around half the size of a single jobs - with the slight risk of
swapping a little.

Jobs will be resumed when more RAM is available - typically when the oldest
job completes.

답변2

아니요, 하지만 해당 항목을 종료하고 다시 시도할 수 있습니다.

memeater() {
  # Simple example that eats 10 MB/second up to 1 GB
  perl -e '$|=1;
    print "start @ARGV\n";
    for(1..100) {
      `sleep 0.1`;
      push @a, "a"x10_000_000;
    }
    print "end @ARGV\n";' $@;
}
export -f memeater

# Only start a job if there is 20 GB RAM free.
# Kill the youngest job when there is 10 GB RAM free.
parallel --retries 100 -j0 --delay 0.1 --memfree 20G memeater ::: {1..100}

추가하면 --lb일부 작업이 시작되었지만 종료되기 전에 종료되는 것을 볼 수 있습니다. 그런 다음 GNU Parallel이 작업을 포기하기 전까지 최대 100번까지 나중에 다시 시작됩니다.

관련 정보