GNU 병렬 제한 메모리 사용량

GNU 병렬 제한 메모리 사용량

GNU에 의해 병렬로 시작되는 모든 프로세스의 메모리 사용량을 제한할 수 있습니까? 작업 수를 제한하는 방법이 있다는 것을 알고 있지만 메모리 사용량을 미리 쉽게 예측할 수 없으면 이 매개변수를 조정하는 것이 어려울 수 있습니다.

나의 경우에는 프로세스 메모리에 엄격한 제한이 있는 HPC에서 프로그램을 실행하고 있습니다. 예를 들어 노드에 사용 가능한 RAM이 72GB인 경우 배치 시스템은 70GB를 초과하는 작업을 종료합니다. 또한 Exchange에 직접 작업을 생성하여 보관할 수도 없습니다.

niceload프로세스가 실행되기 전에 현재 메모리 사용량을 확인할 수 있는 것으로 보이는 GNU 병렬성 패키지와 함께 제공됩니다 . 하지만 어떻게 사용하는지 잘 모르겠습니다.

답변1

짧은 대답은 다음과 같습니다.

ulimit -m 1000000
ulimit -v 1000000

이렇게 하면 각 프로세스가 1GB RAM으로 제한됩니다.

실제로 "올바른" 방식으로 메모리를 제한하는 것은 매우 복잡합니다. RAM이 1GB라고 가정해 보겠습니다. 프로세스는 10초마다 시작되며 프로세스당 초당 1MB를 추가로 사용합니다. 따라서 140초 후에 다음과 같은 결과가 나타납니다.

10██▎                                                          
20██████▍                                                      
30██████████▌                                                  
40██████████████▋                                              
50██████████████████▊                                          
60██████████████████████▉                                      
70███████████████████████████                                  
80███████████████████████████████▏                             
90███████████████████████████████████▎                         
100██████████████████████████████████████▍                     
110██████████████████████████████████████████▌                 
120██████████████████████████████████████████████▋             
130██████████████████████████████████████████████████▊         
140██████████████████████████████████████████████████████▉     

총 RAM 용량은 1050MB이므로 이제 무언가를 삭제해야 합니다. 어떤 직업이 죽이기에 적합한가? 140인가요(미친다고 가정)? 10인가요(실행하는데 시간이 가장 적게 걸리기 때문이죠)?

내 경험에 따르면 메모리 문제를 다루는 작업은 종종 매우 예측 가능하거나(예: 비트맵 변환) 거의 예측할 수 없습니다. 매우 예측 가능한 작업의 경우 미리 계산을 수행하고 실행할 수 있는 작업 수를 확인할 수 있습니다.

예측할 수 없는 상황의 경우 시스템이 많은 메모리를 차지하는 몇 가지 작업을 시작하고 해당 작업이 완료되면 시스템이 메모리를 적게 차지하는 더 많은 작업을 시작하도록 하는 것이 이상적입니다. 하지만 어떤 작업이 시간이 많이 걸릴지, 어떤 작업이 시간이 조금 걸릴지, 어떤 작업이 시간이 많이 걸릴지 미리 알 수는 없습니다. 일부 작업의 일반적인 수명 주기는 매우 작은 메모리에서 오랫동안 실행된 후 더 큰 메모리로 확장되는 것입니다. 이런 직업과 미친 직업을 구별하는 것은 어렵습니다.

누군가 나에게 많은 응용 프로그램에 적합한 방식으로 이 작업을 수행하는 잘 고안된 방법을 지적하면 GNU Parallel이 확장될 수 있습니다.

답변2

2014년부터는 상황이 바뀌었습니다.

이제 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.

관련 정보