멀티스레딩을 통해 bash 스크립트를 실행하는 방법

멀티스레딩을 통해 bash 스크립트를 실행하는 방법

고에너지 충돌 이벤트를 생성하는 bash 스크립트가 있는데, 하나의 이벤트에 약 2분이 걸리면 100000개의 이벤트에 대해 200000분이 소요됩니다. 이는 너무 많은 시간입니다. 따라서 노드에 50개의 코어가 있는 경우 각 코어에 하나의 이벤트가 있어서 2분 안에 50개의 이벤트가 생성되어 시간이 절약됩니다. 멀티스레딩이나 다른 방법을 통해 이 작업을 수행할 수 있다고 생각합니다. 누구든지 나를 도와줄 수 있습니까?

답변1

GNU Parallel은 이러한 작업을 위해 설계되었습니다.

seq 100000 | parallel do_experiment

실험에서 다양한 유형의 값(예: 모델)을 사용하는 경우 다음을 통해 모든 모델에 대해 모든 실험을 실행할 수 있습니다.

seq 100000 | parallel do_experiment --iteration {1} --model {2} :::: - ::: model1 model2

기본적으로 CPU 코어당 1개의 프로세스가 있으며 두 병렬 작업의 출력이 혼합되지 않도록 합니다. 연구실에 사용하지 않는 컴퓨터가 여러 대 있는 경우 이를 계산에 포함시킬 수도 있습니다.

GNU Parallel은 동일한 컴퓨터 또는 SSH를 통해 액세스할 수 있는 여러 컴퓨터에서 작업을 병렬로 쉽게 실행할 수 있게 해주는 범용 병렬 처리기입니다. 종종 for루프를 대체할 수 있습니다.

4개의 CPU에서 32개의 서로 다른 작업을 실행하려는 경우 병렬화하는 간단한 방법은 각 CPU에서 8개의 작업을 실행하는 것입니다.

간단한 스케줄링

대신, GNU Parallel은 작업이 완료되면 새로운 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.

GNU 병렬 스케줄링

설치하다

배포판에 GNU Parallel이 패키지되어 있지 않으면 루트 액세스 없이 개인 설치를 수행할 수 있습니다. 이 작업은 10초 안에 완료할 수 있습니다.

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

다른 설치 옵션은 다음을 참조하세요.http://git.savannah.gnu.org/cgit/parallel.git/tree/README

더 알아보기

더 많은 예시 보기:http://www.gnu.org/software/parallel/man.html

소개 비디오 보기:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

이 튜토리얼을 살펴보세요:http://www.gnu.org/software/parallel/parallel_tutorial.html

지원을 받으려면 이메일 목록에 가입하세요.https://lists.gnu.org/mailman/listinfo/parallel

답변2

백그라운드 작업 수 제한인 50개에 도달할 때까지 백그라운드 프로세스로 작업을 시작한 다음 한 작업이 완료될 때까지 기다렸다가 다른 작업을 시작할 수 있습니다.

LIMIT=50
while collision_event_to_run
do 
    run_new_collision_event&

    while (( $(jobs | wc -l) >= LIMIT ))
    do
                sleep 1
    done

done

아니면 로드 평균이 낮을 때 새 이벤트를 실행하는 것이 더 좋습니다.

LIMIT=49
while collision_event_to_run
do 
    run_new_collision_event&
    sleep 2   # let time for the load average calculation

    while (( $(cut -d " " -f1 < /proc/loadavg) >= LIMIT ))
    do
                sleep 1
    done

done

또 다른 옵션은 이 명령을 사용하여 작업을 일괄 대기열 batch에 쌓는 것입니다 .atd

batch collision _event_1
batch collision _event_2
batch collision _event_3
...

atd서비스는 서버 로드가 한도에 도달할 때까지 작업을 병렬로 시작합니다. 예를 들어 제한은 atd서비스 시작 스크립트에서 설정해야 하는 매개변수입니다.atdatd -l 50

편집하다:

  • 운영 체제를 위해 약간의 여유 CPU를 확보하십시오 atd -l 49.

  • atd는 1분마다 새 작업을 시작하는데, 서버가 마지막 작업 로드인 200만 개에 도달하기에는 너무 느립니다. 이 매개변수를 사용하면 대기 시간을 줄일 수 있습니다 -b. atd -b 2 -l 492초마다 작업을 시작하면 첫 번째 작업이 완료되기 전에 제한에 도달할 수 있습니다.

관련 정보