bash 스크립트에서 수천 개의 curl 백그라운드 프로세스를 병렬로 실행 top명령을 통해 메모리 소비와 CPU를 추적 하며

다음 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으로 감소합니다 …

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



답변

엄격한 질문에 따라 :

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를 높이면 도움이 될 수 있습니다.


답변

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