在bash脚本中并行运行数千个curl后台进程


14

我在以下bash脚本中并行运行卷曲背景进程thounsand

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千,然后开始连续下降。

如果我通过管道卷曲到awk(curl | awk > output)添加简单的解析,则卷曲过程数只会增加到1-2千,然后减少到20到30 ...

为什么进程数量如此急剧减少?这种架构的界限在哪里?


2
您可能正在达到最大运行进程数或最大打开套接字数之一。ulimit将显示其中一些限制。
HBruijn

6
我也建议使用parallel(1):对于这样的任务manpages.debian.org/cgi-bin/...
zhenech

尝试start=$SECONDSend=$SECONDS-习惯使用小写或大小写混合的变量名,以避免潜在的名称与shell变量冲突。但是,实际上,您实际上只会获得每个过程开始的时间间隔越来越大的问题。由于该过程处于后台(并且start仅计算一次),因此您不会花费多长时间。在Bash中,您可以(( diff = end - start ))删除美元符号并允许间距更灵活。使用pgrep如果您有它。
暂停,直到另行通知。

我同意HBruijn。请注意,如果将进程数加倍(通过添加awk),则进程数将减半。
暂停,直到另行通知。

@zhenech @HBrujin我启动了parallel,它说由于文件句柄的系统限制,我可能只运行500个并行任务。我提高了limits.conf的限制,但是现在当我尝试运行5000个simulaneus作业时,它甚至在开始之前就立即吞噬了我所有的内存(49 Gb),因为每个parallel perl脚本都吞噬了32Mb。
zavg

Answers:


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可能会有所帮助。


如果我希望并行运行几个命令作为简短回答版本中的一个,我该怎么做?
Guy Avraham

2
引用:seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'。花一个小时来完成本教程。您的命令行会为此而爱您:man parallel_tutorial
Ole Tange'Dec

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

(编辑:( 编辑:删除有关操作系统限制的过时声明,并添加缺失的内容)echocurl
wait


实际上,操作系统可以很好地处理此问题。这是TCP的限制。任何操作系统,无论多么特别,都将无法解决它。但是OP的4k连接远不止64k(或某些发行版的32k默认值)
Patrick

@Patrick好的,我把那部分删除了,它具有不可挽回的设计限制,这是多余的,但是请看zavg在7 日的评论
jthill 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.