bash 스크립트에서 수천 개의 curl 백그라운드 프로세스를 병렬로 실행


14

다음 bash 스크립트에서 백그라운드 프로세스를 동시에 실행 하고 있습니다.

START=$(date +%s)
for i in {1..100000}
do       
    curl -s "http://some_url_here/"$i  > $i.txt&
    END=$(date +%s)
    DIFF=$(( $END - $START ))
    echo "It took $DIFF seconds"
done

49Gb Corei7-920 전용 서버 (가상이 아님)가 있습니다.

top명령을 통해 메모리 소비와 CPU를 추적 하며 경계에서 멀리 떨어져 있습니다.

ps aux | grep curl | wc -l현재 프로세스 수를 계산하는 데 사용 하고 있습니다. 이 수는 최대 2-4 천명까지 빠르게 증가한 다음 지속적으로 감소하기 시작합니다.

curl | awk > outputcurl 프로세스보다 curl curl을 awk ( ) 로 간단한 구문 분석을 추가 하면 1-2만으로 증가하고 20-30으로 감소합니다 ...

왜 프로세스 수가 급격히 감소합니까? 이 아키텍처의 경계는 어디에 있습니까?


2
최대 실행 프로세스 또는 최대 개방 소켓의 한계 중 하나에 도달했을 것입니다. ulimit그 한계 중 일부를 보여줄 것입니다.
HBruijn

6
나는 또한 parallel(1)이러한 작업을 사용 하는 것이 좋습니다 : manpages.debian.org/cgi-bin/…
zhenech

시도 start=$SECONDSend=$SECONDS-와 쉘 변수 잠재적 이름 충돌을 방지하기 위해 습관 소문자 또는 혼합 경우 변수 이름을 사용합니다. 그러나 각 프로세스의 시작 시간이 점점 증가하고 있습니다. 프로세스가 백그라운드에 있고 start한 번만 계산 되므로 다운로드 시간이 오래 걸리지 않습니다 . Bash에서는 (( diff = end - start ))달러 기호를 삭제하고 간격을보다 유연하게 할 수 있습니다. pgrep가지고 있다면 사용하십시오 .
추후 공지가있을 때까지 일시 중지되었습니다.

HBruijn에 동의합니다. 프로세스 수를 두 배로 늘릴 때 (을 추가하여 awk) 프로세스 수가 절반으로 줄어 듭니다 .
추후 공지가있을 때까지 일시 중지되었습니다.

@zhenech @HBrujin 나는 parallel파일 핸들의 시스템 제한으로 인해 500 개의 병렬 작업을 실행할 수 있다고 말합니다. limits.conf에서 제한을 늘 렸지만 이제 5000 개의 simulaneus 작업을 실행하려고하면 모든 parallel perl 스크립트가 32Mb를 사용 하기 때문에 시작하기 전에도 모든 메모리 (49Gb)를 즉시 먹습니다 .
zavg

답변:


12

엄격한 질문에 따라 :

mycurl() {
    START=$(date +%s)
    curl -s "http://some_url_here/"$1  > $1.txt
    END=$(date +%s)
    DIFF=$(( $END - $START ))
    echo "It took $DIFF seconds"
}
export -f mycurl

seq 100000 | parallel -j0 mycurl

타이밍에 상용구 텍스트가 필요하지 않은 경우 더 짧습니다.

seq 100000 | parallel -j0 --joblog log curl -s http://some_url_here/{} ">" {}.txt
cut -f 4 log

1000을 병렬로 실행하려면 파일 핸들과 같은 제한에 도달합니다. ulimit -n 또는 /etc/security/limits.conf를 높이면 도움이 될 수 있습니다.


그리고 짧은 답변 버전의 명령으로 여러 명령을 병렬로 실행하려면 어떻게해야합니까?
가이 아브라함

2
인용 : seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'. 튜토리얼을 따라 한 시간을 보내십시오. 당신의 커맨드 라인은 당신을 사랑할 것입니다 :man parallel_tutorial
Ole Tange

2
for i in {1..100000}

65536 포트만 있습니다. 이것을 조절하십시오.

for n in {1..100000..1000}; do   # start 100 fetch loops
        for i in `eval echo {$n..$((n+999))}`; do
                echo "club $i..."
                curl -s "http://some_url_here/"$i  > $i.txt
        done &
        wait
done

(편집 : (편집 : OS 제한에 대한 심각하게 오래된 주장을 제거하고 누락을 추가하십시오 )echocurl
wait


실제로 OS는 이것을 잘 처리 할 수 ​​있습니다. 이것은 TCP의 한계입니다. 아무리 특별하더라도 OS를 피할 수는 없습니다. 그러나 OP의 4k 연결은 64k (또는 일부 배포판의 32k 기본값)에 가깝지 않습니다.
Patrick

@ 패트릭 좋아, 그 부분을 꺼내서, 그것은 돌이킬 수없는 디자인 한계로 중복되지만 7 일에 대한 zavg의 의견 을 살펴보십시오 .
jthill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.