Ich führe im folgenden Bash-Skript Tausende von Curl- Hintergrundprozessen parallel aus
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
Ich habe 49 GB Corei7-920 dedizierten Server (nicht virtuell).
Ich verfolge Speicherverbrauch und CPU durch topBefehl und sie sind weit weg von Grenzen.
Ich benutze, ps aux | grep curl | wc -lum die Anzahl der aktuellen Curl- Prozesse zu zählen. Diese Zahl steigt schnell auf 2-4 Tausend an und beginnt dann kontinuierlich abzunehmen.
Wenn ich awk ( curl | awk > output) ein einfaches Parsing durch Pipe-Curl hinzufüge, dann erhöht sich die Anzahl der Curl-Prozesse nur auf 1-2 Tausend und verringert sich dann auf 20-30 ...
Warum sinkt die Anzahl der Prozesse so dramatisch? Wo liegen die Grenzen dieser Architektur?
parallel(1)für solche Aufgaben: manpages.debian.org/cgi-bin/...
start=$SECONDSund end=$SECONDS- und verwenden Sie gewohnheitsmäßig klein oder gemischt geschriebene Variablennamen, um mögliche Namenskollisionen mit Shell-Variablen zu vermeiden. In Wirklichkeit erhalten Sie jedoch nur das immer größer werdende Zeitintervall, in dem die einzelnen Prozesse gestartet werden. Sie können nicht feststellen, wie lange der Download gedauert hat, da sich der Vorgang im Hintergrund befindet (und startnur einmal berechnet wird). In Bash können Sie (( diff = end - start ))die Dollarzeichen löschen und den Abstand flexibler gestalten. Verwenden pgrepSie, wenn Sie es haben.
awk).
parallelund es heißt, dass ich aufgrund der Systembeschränkung der Dateihandles möglicherweise nur 500 parallele Tasks ausführen kann. Ich habe limit in limits.conf erhöht, aber jetzt, wenn ich versuche, 5000 simulaneus-Jobs auszuführen, wird sofort mein ganzer Speicher (49 GB) parallel aufgebraucht, noch bevor ich beginne, da jedes Perl-Skript 32 MB belegt.
ulimitwird einige dieser Grenzen zeigen.