2012-06-11 3 views
4

나는해야 할 일련의 작업이 있습니다. 작업 간의 종속성이 없습니다. 나는이 작업들을 기계에 배포하는 데 도움이되는 도구를 찾고 있습니다. 유일한 제한은 각 시스템이 한 번에 하나의 작업 만 실행해야한다는 것입니다. 작업량이 매우 균형을 이루지 않아 처리량을 극대화하려고합니다. 현재의 해킹 셸 스크립트는 컴퓨터 단위의 작업 대기열을 미리 작성하고 부하가 많은 시스템의 대기열에서 대기중인 대기열로 작업을 이전 할 수 없기 때문에 효율적이지 않습니다.소규모로드 평준화

이전 제안에는 과장된 것처럼 보이는 SLURM이 포함되어 있으며, 더 많은 잔인한 LoadLeveller가 포함되어 있습니다.

GNU 병렬은 거의 내가 원하는대로 보이지만 원격 시스템은 SSH를 말하지 않습니다. 커스텀 작업 시작 프로그램이 사용되었습니다 (대기열 기능이 없음). Gnu Parallel은 작업을 보내기 전에 즉시 쉘 스크립트로 대체 할 수있는 곳입니다.

그래서, 요약 : 받아 들일 수 기계의 작업 + 목록의

  • 목록 : 처리량을 극대화 할 수 있습니다. 가능한 한 쉘에 가깝게하는 것이 좋습니다.

최악의 시나리오는 bash의 lockfile과 함께 해킹 될 수 있지만 더 나은 해결책이 어딘가에 존재해야하는 것처럼 느껴집니다.

+0

쉘 내장 작업을 사용하는 것이 좋습니다. 잠시 동안처럼 # jobs> = maxjobs sleep .1; 명령 & – technosaurus

답변

2

가정 당신의 작업은

mkfifo /tmp/jobs.fifo 
while true; do 
    read JOB 
    if test -z "$JOB"; then 
    break 
    fi 
    echo -n "Dispatching job $JOB .." 
    echo $JOB >> /tmp/jobs.fifo 
    echo ".. taken!" 
done 
rm /tmp/jobs.fifo 

같은으로 dispatcher.sh를 만들고 이제 launcher.sh을 만들

dispatcher.sh < jobs.tab 

의 인스턴스를 실행

/path/to/job1 
/path/to/job2 
... 

처럼 보이는 텍스트 파일 jobs.tab

while true; do 
    read JOB < /tmp/jobs.fifo 
    if test -z "$JOB"; then 
    break 
    fi 

    #launch job $JOB on machine $0 from your custom launcher 

done 

+0

참조하십시오, 나는 간단한 선택이 있어야한다는 것을 알고있었습니다. 감사! 최대한 빨리 시도해 보도록하겠습니다 만, 검사가 잘 된 것 같습니다. 나는 그것을 단독으로 받아들입니다. –

+0

그래서 내 컴퓨터에서 종료시 이상한 경우가있는 것처럼 보입니다. 전반적으로 모든 것이 정상적으로 작동하지만 결국에는 실행 프로그램이 FIFO에서 입력을 기다리고 있습니다. 필자는 필자는 각각의 실행 프로그램에 센티널 값 ("quit")을 전송하여이 문제를 해결했습니다 (존재하는 실행 프로그램의 프로세스 목록 확인). –

+0

TBH 나는'rm/tmp/jobs.fifo'에 대해 아무런 점검없이 100 % 확신하지 못했지만 간단한 테스트 케이스에서 작동했습니다. 센티넬은 훌륭하고 강력한 아이디어입니다. –

1

GNU 병렬 자신의 ssh 명령을 지원 대상 시스템 당 launcher.sh의 한 인스턴스 (최초이자 유일한 인수로 기계를 제공)를 실행합니다. 이렇게하면 작동합니다 :

function my_submit { echo On host $1 run command $3; } 
export -f my_submit 
parallel -j1 -S "my_submit server1,my_submit server2" my_command ::: arg1 arg2 
+0

이것에 감사드립니다, 그것은 또 다른 좋은 대답처럼 보입니다. 단지 궁금해서,이 submit 함수가 취하는 인수에 대한 문서가 있습니까? [맨페이지] (http://www.gnu.org/software/parallel/man.html)에서 찾을 수 없습니다. –

+0

bash 함수 'submit'은 위에 정의되어 있습니다. 어떤 man 페이지에도 없습니다. 필요에 맞게 '제출'기능을 변경하십시오. 이름이 my_submit으로 바뀌어 그것이 당신에 의해 정의되었다고 강조했습니다. –

+0

그래서 나는 따라 갔다. 제가 이해할 수있는 것은'ssh server1 ... my_command arg1' 대신에'my_submit server1 ... my_command args'를 대신 사용하는 것입니다. 내가 궁금한 점은 두 번째 주장이'...'무엇이며, 그걸로 멋진 일을 할 수 있을까? –